diff options
author | Allison Easton <allison.easton@mongodb.com> | 2021-10-26 07:33:17 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-28 08:39:29 +0000 |
commit | 8def1746e85ab88314e4b2af3c2850ce580db1a7 (patch) | |
tree | 8117ea50de3fd608f2a026d83f44013274f5db3b /src | |
parent | b9162c23f34e4bf636cf54036a68ce2b7216f835 (diff) | |
download | mongo-8def1746e85ab88314e4b2af3c2850ce580db1a7.tar.gz |
SERVER-60730 shardsvrDropDatabase should always join existing coordinator
(cherry picked from commit 0bd0ddfb1d6875c3ce4390d30e0566b107256f29)
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/s/sharding_ddl_coordinator.h | 4 | ||||
-rw-r--r-- | src/mongo/db/s/shardsvr_drop_database_command.cpp | 20 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/mongo/db/s/sharding_ddl_coordinator.h b/src/mongo/db/s/sharding_ddl_coordinator.h index a3d9fc342a8..3108965947a 100644 --- a/src/mongo/db/s/sharding_ddl_coordinator.h +++ b/src/mongo/db/s/sharding_ddl_coordinator.h @@ -90,6 +90,10 @@ public: return metadata().getForwardableOpMetadata().get(); } + const boost::optional<mongo::DatabaseVersion>& getDatabaseVersion() const& { + return metadata().getDatabaseVersion(); + } + // Cached LSIDs shared between DDL coordinator instances class SessionCache { diff --git a/src/mongo/db/s/shardsvr_drop_database_command.cpp b/src/mongo/db/s/shardsvr_drop_database_command.cpp index 08e49131c98..a8aaef5fbcf 100644 --- a/src/mongo/db/s/shardsvr_drop_database_command.cpp +++ b/src/mongo/db/s/shardsvr_drop_database_command.cpp @@ -34,6 +34,7 @@ #include "mongo/db/commands.h" #include "mongo/db/curop.h" #include "mongo/db/s/drop_database_coordinator.h" +#include "mongo/db/s/operation_sharding_state.h" #include "mongo/db/s/sharding_ddl_coordinator_service.h" #include "mongo/db/s/sharding_state.h" #include "mongo/logv2/log.h" @@ -85,8 +86,23 @@ public: coordinatorDoc.setShardingDDLCoordinatorMetadata( {{ns(), DDLCoordinatorTypeEnum::kDropDatabase}}); auto service = ShardingDDLCoordinatorService::getService(opCtx); - auto dropDatabaseCoordinator = checked_pointer_cast<DropDatabaseCoordinator>( - service->getOrCreateInstance(opCtx, coordinatorDoc.toBSON())); + const auto requestVersion = OperationShardingState::get(opCtx).getDbVersion(ns().db()); + auto dropDatabaseCoordinator = [&]() { + while (true) { + auto currentCoordinator = checked_pointer_cast<DropDatabaseCoordinator>( + service->getOrCreateInstance(opCtx, coordinatorDoc.toBSON())); + const auto currentDbVersion = currentCoordinator->getDatabaseVersion(); + if (currentDbVersion == requestVersion) { + return currentCoordinator; + } + LOGV2_DEBUG(6073000, + 2, + "DbVersion mismatch, waiting for existing coordinator to finish", + "requestedVersion"_attr = requestVersion, + "coordinatorVersion"_attr = currentDbVersion); + currentCoordinator->getCompletionFuture().wait(opCtx); + } + }(); dropDatabaseCoordinator->getCompletionFuture().get(opCtx); } |