diff options
author | Jamie Heppenstall <jamie.heppenstall@mongodb.com> | 2019-07-01 16:35:53 -0400 |
---|---|---|
committer | Jamie Heppenstall <jamie.heppenstall@mongodb.com> | 2019-07-11 14:17:54 -0400 |
commit | 27807650274531ee8031cb989c2ed33bdc9bee21 (patch) | |
tree | 8337897866383d01981edaed676316d29b1e2ef7 /src/mongo/db/s/shard_key_util.h | |
parent | cf6ffa0d0b72574bf6fee66a46e1b264c0cc6d63 (diff) | |
download | mongo-27807650274531ee8031cb989c2ed33bdc9bee21.tar.gz |
SERVER-41944 Validate the given shard key for refineCollectionShardKey
Diffstat (limited to 'src/mongo/db/s/shard_key_util.h')
-rw-r--r-- | src/mongo/db/s/shard_key_util.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/mongo/db/s/shard_key_util.h b/src/mongo/db/s/shard_key_util.h new file mode 100644 index 00000000000..62e285816e1 --- /dev/null +++ b/src/mongo/db/s/shard_key_util.h @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2019-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#pragma once + +#include "mongo/s/request_types/shard_collection_gen.h" +#include "mongo/s/shard_util.h" + +namespace mongo { +namespace shardkeyutil { + +/** + * Constructs the BSON specification document for the create indexes command using the given + * namespace, index key and options. + */ +BSONObj makeCreateIndexesCmd(const NamespaceString& nss, + const BSONObj& keys, + const BSONObj& collation, + bool unique); + +/** + * Compares the proposed shard key with the collection's existing indexes on the primary shard to + * ensure they are a legal combination. + * + * Creates the required index if and only if (i) the collection is empty, (ii) no index on the shard + * key exists, and (iii) createIndexIfPossible is true. + * + * The proposed shard key must be validated against the set of existing indexes. + * In particular, we must ensure the following constraints: + * + * 1. All existing unique indexes, except those which start with the _id index, + * must contain the proposed key as a prefix (uniqueness of the _id index is + * ensured by the _id generation process or guaranteed by the user). + * + * 2. If the collection is not empty, there must exist at least one index that + * is "useful" for the proposed key. A "useful" index is defined as adhering to + * all of the following properties: + * i. contains proposedKey as a prefix + * ii. is not a sparse index, partial index, or index with a non-simple collation + * iii. contains no null values + * iv. is not multikey (maybe lift this restriction later) + * v. if a hashed index, has default seed (lift this restriction later) + * + * 3. If the proposed shard key is specified as unique, there must exist a useful, + * unique index exactly equal to the proposedKey (not just a prefix). + * + * After validating these constraints: + * + * 4. If there is no useful index, and the collection is non-empty or createIndexIfPossible + * is false, we must fail. + * + * 5. If the collection is empty and createIndexIfPossible is true, and it's still possible + * to create an index on the proposed key, we go ahead and do so. + */ +void validateShardKeyAgainstExistingIndexes(OperationContext* opCtx, + const NamespaceString& nss, + const BSONObj& proposedKey, + const ShardKeyPattern& shardKeyPattern, + const std::shared_ptr<Shard>& primaryShard, + const boost::optional<BSONObj>& defaultCollation, + const bool unique, + const bool createIndexIfPossible); + +} // namespace shardkeyutil +} // namespace mongo |