summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/config
diff options
context:
space:
mode:
authorjannaerin <golden.janna@gmail.com>2018-03-01 11:33:36 -0500
committerjannaerin <golden.janna@gmail.com>2018-03-06 15:47:13 -0500
commit5da505eb1c4f81cbaa22860fd2a9453f10e81a62 (patch)
tree32160f637fe6340b5e85b61ae7679bcea722388a /src/mongo/db/s/config
parent1365c273c4b1aab22f70750963a910332a0db992 (diff)
downloadmongo-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.cpp14
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;