summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAllison Easton <allison.easton@mongodb.com>2021-10-26 07:33:17 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-28 08:39:29 +0000
commit8def1746e85ab88314e4b2af3c2850ce580db1a7 (patch)
tree8117ea50de3fd608f2a026d83f44013274f5db3b /src
parentb9162c23f34e4bf636cf54036a68ce2b7216f835 (diff)
downloadmongo-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.h4
-rw-r--r--src/mongo/db/s/shardsvr_drop_database_command.cpp20
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);
}