diff options
author | Blake Oler <blake.oler@mongodb.com> | 2018-03-13 14:01:44 -0400 |
---|---|---|
committer | Blake Oler <blake.oler@mongodb.com> | 2018-03-15 15:32:10 -0400 |
commit | ec4e33953073ae3f84f6d76d50aeb4ded6f6aa02 (patch) | |
tree | e5c4bc552cc51aa29d2f7a72c978206313860595 /src | |
parent | ab7e4e3598c631a0b01ae10b76b60ee90df19866 (diff) | |
download | mongo-ec4e33953073ae3f84f6d76d50aeb4ded6f6aa02.tar.gz |
SERVER-33586 Add _cloneCatalogData command
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/s/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/s/clone_catalog_data_command.cpp | 141 | ||||
-rw-r--r-- | src/mongo/s/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/s/request_types/clone_catalog_data.idl | 44 |
4 files changed, 187 insertions, 0 deletions
diff --git a/src/mongo/db/s/SConscript b/src/mongo/db/s/SConscript index 9d361d32ad0..902b29089e9 100644 --- a/src/mongo/db/s/SConscript +++ b/src/mongo/db/s/SConscript @@ -196,6 +196,7 @@ env.Library( source=[ 'check_sharding_index_command.cpp', 'cleanup_orphaned_cmd.cpp', + 'clone_catalog_data_command.cpp', 'config/configsvr_add_shard_command.cpp', 'config/configsvr_add_shard_to_zone_command.cpp', 'config/configsvr_commit_chunk_migration_command.cpp', diff --git a/src/mongo/db/s/clone_catalog_data_command.cpp b/src/mongo/db/s/clone_catalog_data_command.cpp new file mode 100644 index 00000000000..2f625aa95cc --- /dev/null +++ b/src/mongo/db/s/clone_catalog_data_command.cpp @@ -0,0 +1,141 @@ +/** + * Copyright (C) 2018 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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 + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * 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 GNU Affero General 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_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kSharding + +#include "mongo/db/auth/action_set.h" +#include "mongo/db/auth/authorization_session.h" +#include "mongo/db/auth/resource_pattern.h" +#include "mongo/db/catalog/document_validation.h" +#include "mongo/db/commands.h" +#include "mongo/db/dbdirectclient.h" +#include "mongo/db/s/config/sharding_catalog_manager.h" +#include "mongo/db/s/sharding_state.h" +#include "mongo/rpc/get_status_from_command_result.h" +#include "mongo/s/grid.h" +#include "mongo/s/request_types/clone_catalog_data_gen.h" +#include "mongo/util/log.h" + +namespace mongo { +namespace { + +/** + * Currently, _cloneCatalogData will clone all data (including metadata). In the second part of + * PM-1017 (Introduce Database Versioning in Sharding Config) this command will be changed to only + * clone catalog metadata, as the name would suggest. + */ +class CloneCatalogDataCommand : public BasicCommand { +public: + CloneCatalogDataCommand() : BasicCommand("_cloneCatalogData") {} + + AllowedOnSecondary secondaryAllowed(ServiceContext*) const override { + return AllowedOnSecondary::kNever; + } + + virtual bool adminOnly() const { + return true; + } + + virtual bool supportsWriteConcern(const BSONObj& cmd) const override { + return true; + } + + Status checkAuthForCommand(Client* client, + const std::string& dbname, + const BSONObj& cmdObj) const override { + if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( + ResourcePattern::forClusterResource(), ActionType::internal)) { + return Status(ErrorCodes::Unauthorized, "Unauthorized"); + } + + return Status::OK(); + } + + bool run(OperationContext* opCtx, + const std::string& dbname_unused, + const BSONObj& cmdObj, + BSONObjBuilder& result) override { + + auto shardingState = ShardingState::get(opCtx); + uassertStatusOK(shardingState->canAcceptShardedCommands()); + + uassert(ErrorCodes::IllegalOperation, + str::stream() << "_cloneCatalogData can only be run on shard servers", + serverGlobalParams.clusterRole == ClusterRole::ShardServer); + + uassert(ErrorCodes::InvalidOptions, + str::stream() << "_cloneCatalogData must be called with majority writeConcern, got " + << cmdObj, + opCtx->getWriteConcern().wMode == WriteConcernOptions::kMajority); + + const auto cloneCatalogDataRequest = + CloneCatalogData::parse(IDLParserErrorContext("_cloneCatalogData"), cmdObj); + const auto dbname = cloneCatalogDataRequest.getCommandParameter().toString(); + + uassert( + ErrorCodes::InvalidNamespace, + str::stream() << "invalid db name specified: " << dbname, + NamespaceString::validDBName(dbname, NamespaceString::DollarInDbNameBehavior::Allow)); + + uassert(ErrorCodes::InvalidOptions, + str::stream() << "Can't clone catalog data for " << dbname << " database", + dbname != NamespaceString::kAdminDb && dbname != NamespaceString::kConfigDb && + dbname != NamespaceString::kLocalDb); + + auto from = cloneCatalogDataRequest.getFrom(); + + uassert(ErrorCodes::InvalidOptions, + str::stream() << "Can't run _cloneCatalogData without a source", + !from.empty()); + + auto const catalogClient = Grid::get(opCtx)->catalogClient(); + const auto shardedColls = catalogClient->getAllShardedCollectionsForDb( + opCtx, dbname, repl::ReadConcernLevel::kMajorityReadConcern); + + BSONArrayBuilder barr; + for (const auto& shardedColl : shardedColls) { + barr.append(shardedColl.ns()); + } + + BSONObjBuilder cloneCommandBuilder; + cloneCommandBuilder << "clone" << from << "collsToIgnore" << barr.arr() + << bypassDocumentValidationCommandOption() << true; + + BSONObj cloneResult; + DBDirectClient client(opCtx); + client.runCommand(dbname, cloneCommandBuilder.obj(), cloneResult); + + uassertStatusOK(getStatusFromCommandResult(cloneResult)); + + return true; + } + +} CloneCatalogDataCmd; + +} // namespace +} // namespace mongo diff --git a/src/mongo/s/SConscript b/src/mongo/s/SConscript index 59aeadf2017..bdf38a7775d 100644 --- a/src/mongo/s/SConscript +++ b/src/mongo/s/SConscript @@ -131,6 +131,7 @@ env.Library( 'shard_id.cpp', 'versioning.cpp', env.Idlc('catalog/type_chunk_base.idl')[0], + env.Idlc('request_types/clone_catalog_data.idl')[0], env.Idlc('request_types/create_collection.idl')[0], env.Idlc('request_types/create_database.idl')[0], env.Idlc('request_types/flush_routing_table_cache_updates.idl')[0], diff --git a/src/mongo/s/request_types/clone_catalog_data.idl b/src/mongo/s/request_types/clone_catalog_data.idl new file mode 100644 index 00000000000..f26f71333b9 --- /dev/null +++ b/src/mongo/s/request_types/clone_catalog_data.idl @@ -0,0 +1,44 @@ +# Copyright (C) 2018 MongoDB Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3, +# as published by the Free Software Foundation. +# +# 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 +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +# 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 GNU Affero General 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. + +# cloneCatalogData IDL File + +global: + cpp_namespace: "mongo" + +imports: + - "mongo/idl/basic_types.idl" + +commands: + cloneCatalogData: + description: "The internal cloneCatalogData command on a shard" + namespace: type + type: namespacestring + strict: false + fields: + from: + type: string + description: "The connection string of the database to clone from." |