diff options
author | Pierlauro Sciarelli <pierlauro.sciarelli@mongodb.com> | 2021-06-25 07:51:19 +0000 |
---|---|---|
committer | Pierlauro Sciarelli <pierlauro.sciarelli@mongodb.com> | 2021-06-25 14:58:05 +0000 |
commit | 752121dad0a8da460f9010c4c5a8fcd6c90c6f3b (patch) | |
tree | 712829a45c968bf607969a9186971c303844c868 | |
parent | 8c5808ecb212172a374b81b715d98faa71b407b5 (diff) | |
download | mongo-752121dad0a8da460f9010c4c5a8fcd6c90c6f3b.tar.gz |
SERVER-58012 Serialize implicit create collection with drop database
-rw-r--r-- | src/mongo/db/s/database_sharding_state.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/s/drop_database_coordinator.cpp | 17 |
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( |