diff options
author | jannaerin <golden.janna@gmail.com> | 2018-03-01 11:33:36 -0500 |
---|---|---|
committer | jannaerin <golden.janna@gmail.com> | 2018-03-06 15:47:13 -0500 |
commit | 5da505eb1c4f81cbaa22860fd2a9453f10e81a62 (patch) | |
tree | 32160f637fe6340b5e85b61ae7679bcea722388a /src/mongo/db/s/config | |
parent | 1365c273c4b1aab22f70750963a910332a0db992 (diff) | |
download | mongo-5da505eb1c4f81cbaa22860fd2a9453f10e81a62.tar.gz |
SERVER-33516 Make _configsvrCreateCollection take the db distlock to prevent conncurrent movePrimary
Diffstat (limited to 'src/mongo/db/s/config')
-rw-r--r-- | src/mongo/db/s/config/configsvr_create_collection_command.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/mongo/db/s/config/configsvr_create_collection_command.cpp b/src/mongo/db/s/config/configsvr_create_collection_command.cpp index 7eba3758208..8745aeff00a 100644 --- a/src/mongo/db/s/config/configsvr_create_collection_command.cpp +++ b/src/mongo/db/s/config/configsvr_create_collection_command.cpp @@ -88,8 +88,12 @@ public: return Status::OK(); } + std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override { + return CommandHelpers::parseNsFullyQualified(dbname, cmdObj); + } + bool run(OperationContext* opCtx, - const std::string& dbname, + const std::string& dbname_unused, const BSONObj& cmdObj, BSONObjBuilder& result) override { @@ -113,6 +117,14 @@ public: uassertStatusOK(options.parse(*requestOptions)); } + auto const catalogClient = Grid::get(opCtx)->catalogClient(); + const NamespaceString nss(parseNs(dbname_unused, cmdObj)); + + auto dbDistLock = uassertStatusOK(catalogClient->getDistLockManager()->lock( + opCtx, nss.db(), "createCollection", DistLockManager::kDefaultLockTimeout)); + auto collDistLock = uassertStatusOK(catalogClient->getDistLockManager()->lock( + opCtx, nss.ns(), "createCollection", DistLockManager::kDefaultLockTimeout)); + ShardingCatalogManager::get(opCtx)->createCollection(opCtx, createCmd.getNs(), options); return true; |