diff options
author | Jaume Moragues <jaume.moragues@mongodb.com> | 2020-12-04 09:27:40 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-12-04 10:30:43 +0000 |
commit | 53b4d1ac1c338f2d8e64c33d7c7328181ebca5bf (patch) | |
tree | 404d176aa800a298b49593e61e728c8cc431265c /src/mongo/db | |
parent | 5f521888c6852a37aa50d9dcfb5fe0ac444ba2df (diff) | |
download | mongo-53b4d1ac1c338f2d8e64c33d7c7328181ebca5bf.tar.gz |
SERVER-53088 Create the _shardsvrRefineCollectionShardKey command
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/s/SConscript | 3 | ||||
-rw-r--r-- | src/mongo/db/s/shardsvr_refine_collection_shard_key_command.cpp | 108 |
2 files changed, 110 insertions, 1 deletions
diff --git a/src/mongo/db/s/SConscript b/src/mongo/db/s/SConscript index 5651adacb8f..a9ac0a2eceb 100644 --- a/src/mongo/db/s/SConscript +++ b/src/mongo/db/s/SConscript @@ -338,10 +338,11 @@ env.Library( 'set_shard_version_command.cpp', 'sharding_server_status.cpp', 'sharding_state_command.cpp', + 'shardsvr_create_collection_command.cpp', 'shardsvr_drop_collection_command.cpp', 'shardsvr_drop_database_command.cpp', 'shardsvr_rename_collection.cpp', - 'shardsvr_create_collection_command.cpp', + 'shardsvr_refine_collection_shard_key_command.cpp', 'shardsvr_shard_collection.cpp', 'split_chunk_command.cpp', 'split_vector_command.cpp', diff --git a/src/mongo/db/s/shardsvr_refine_collection_shard_key_command.cpp b/src/mongo/db/s/shardsvr_refine_collection_shard_key_command.cpp new file mode 100644 index 00000000000..8ecd531f64d --- /dev/null +++ b/src/mongo/db/s/shardsvr_refine_collection_shard_key_command.cpp @@ -0,0 +1,108 @@ +/** + * Copyright (C) 2018-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. + */ + +#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kSharding + +#include "mongo/db/auth/authorization_session.h" +#include "mongo/db/commands.h" +#include "mongo/db/drop_database_gen.h" +#include "mongo/db/s/config/sharding_catalog_manager.h" +#include "mongo/db/s/sharding_logging.h" +#include "mongo/s/catalog/dist_lock_manager.h" +#include "mongo/s/catalog/type_database.h" +#include "mongo/s/catalog_cache.h" +#include "mongo/s/grid.h" +#include "mongo/s/request_types/refine_collection_shard_key_gen.h" +#include "mongo/s/request_types/sharded_ddl_commands_gen.h" +#include "mongo/s/sharded_collections_ddl_parameters_gen.h" + +namespace mongo { +namespace { + +class ShardsvrRefineCollectionShardKeyCommand final + : public TypedCommand<ShardsvrRefineCollectionShardKeyCommand> { +public: + bool acceptsAnyApiVersionParameters() const override { + return true; + } + + AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { + return Command::AllowedOnSecondary::kNever; + } + + std::string help() const override { + return "Internal command, which is exported by the primary sharding server. Do not call " + "directly. Refines Collection shard key."; + } + + using Request = ShardsvrRefineCollectionShardKey; + + class Invocation final : public InvocationBase { + public: + using InvocationBase::InvocationBase; + + void typedRun(OperationContext* opCtx) { + + const auto cm = uassertStatusOK( + Grid::get(opCtx)->catalogCache()->getShardedCollectionRoutingInfoWithRefresh(opCtx, + ns())); + ConfigsvrRefineCollectionShardKey configsvrRefineCollShardKey( + ns(), request().getNewShardKey().toBSON(), cm.getVersion().epoch()); + configsvrRefineCollShardKey.setDbName(request().getDbName()); + + auto configShard = Grid::get(opCtx)->shardRegistry()->getConfigShard(); + auto cmdResponse = uassertStatusOK(configShard->runCommandWithFixedRetryAttempts( + opCtx, + ReadPreferenceSetting(ReadPreference::PrimaryOnly), + "admin", + CommandHelpers::appendMajorityWriteConcern(configsvrRefineCollShardKey.toBSON({}), + opCtx->getWriteConcern()), + Shard::RetryPolicy::kIdempotent)); + + uassertStatusOK(cmdResponse.commandStatus); + uassertStatusOK(cmdResponse.writeConcernStatus); + } + + bool supportsWriteConcern() const override { + return true; + } + + void doCheckAuthorization(OperationContext*) const override {} + + /** + * The ns() for when Request's IDL specifies "namespace: concatenate_with_db". + */ + NamespaceString ns() const override { + return request().getNamespace(); + } + }; +} shardsvrDropDatabaseCommand; + +} // namespace +} // namespace mongo
\ No newline at end of file |