summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierlauro Sciarelli <pierlauro.sciarelli@mongodb.com>2021-06-25 07:51:19 +0000
committerPierlauro Sciarelli <pierlauro.sciarelli@mongodb.com>2021-06-25 14:58:05 +0000
commit752121dad0a8da460f9010c4c5a8fcd6c90c6f3b (patch)
tree712829a45c968bf607969a9186971c303844c868
parent8c5808ecb212172a374b81b715d98faa71b407b5 (diff)
downloadmongo-752121dad0a8da460f9010c4c5a8fcd6c90c6f3b.tar.gz
SERVER-58012 Serialize implicit create collection with drop database
-rw-r--r--src/mongo/db/s/database_sharding_state.cpp2
-rw-r--r--src/mongo/db/s/drop_database_coordinator.cpp17
2 files changed, 18 insertions, 1 deletions
diff --git a/src/mongo/db/s/database_sharding_state.cpp b/src/mongo/db/s/database_sharding_state.cpp
index 79b9db6a2cb..f096f6abfdc 100644
--- a/src/mongo/db/s/database_sharding_state.cpp
+++ b/src/mongo/db/s/database_sharding_state.cpp
@@ -187,7 +187,7 @@ void DatabaseShardingState::checkDbVersion(OperationContext* opCtx, DSSLock&) co
criticalSectionSignal);
uasserted(StaleDbRoutingVersion(_dbName, *clientDbVersion, boost::none),
- "movePrimary critical section active");
+ "database's critical section active");
}
uassert(StaleDbRoutingVersion(_dbName, *clientDbVersion, boost::none),
diff --git a/src/mongo/db/s/drop_database_coordinator.cpp b/src/mongo/db/s/drop_database_coordinator.cpp
index 17d2b612f24..6195cbe05d9 100644
--- a/src/mongo/db/s/drop_database_coordinator.cpp
+++ b/src/mongo/db/s/drop_database_coordinator.cpp
@@ -33,6 +33,7 @@
#include "mongo/db/api_parameters.h"
#include "mongo/db/persistent_task_store.h"
+#include "mongo/db/s/database_sharding_state.h"
#include "mongo/db/s/sharding_ddl_util.h"
#include "mongo/db/s/sharding_logging.h"
#include "mongo/db/s/sharding_state.h"
@@ -167,6 +168,16 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl(
auto* opCtx = opCtxHolder.get();
getForwardableOpMetadata().setOn(opCtx);
+ const auto critSecReason = BSON("dropDatabase" << _dbName);
+
+ {
+ Lock::DBLock dbLock(opCtx, _dbName, MODE_X);
+ auto dss = DatabaseShardingState::get(opCtx, _dbName);
+ auto dssLock = DatabaseShardingState::DSSLock::lockExclusive(opCtx, dss);
+ dss->enterCriticalSectionCatchUpPhase(opCtx, dssLock, critSecReason);
+ dss->enterCriticalSectionCommitPhase(opCtx, dssLock, critSecReason);
+ }
+
if (_doc.getCollInfo()) {
const auto& coll = _doc.getCollInfo().get();
LOGV2_DEBUG(5494504,
@@ -220,6 +231,12 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl(
removeDatabaseMetadataFromConfig(opCtx, _dbName);
{
+ Lock::DBLock dbLock(opCtx, _dbName, MODE_X);
+ auto dss = DatabaseShardingState::get(opCtx, _dbName);
+ dss->exitCriticalSection(opCtx, critSecReason);
+ }
+
+ {
// Send _flushDatabaseCacheUpdates to all shards
IgnoreAPIParametersBlock ignoreApiParametersBlock{opCtx};
sharding_ddl_util::sendAuthenticatedCommandToShards(