diff options
author | Simon Graetzer <simon.gratzer@mongodb.com> | 2021-07-22 10:59:28 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-07-23 13:21:15 +0000 |
commit | 306a69a50245fb0787391c26597b02c04a156488 (patch) | |
tree | a064b953f11d1a9820a48e05e2e9ca174bc5c420 | |
parent | 0f554217d6476d804f9ed1051722447fec017fb4 (diff) | |
download | mongo-306a69a50245fb0787391c26597b02c04a156488.tar.gz |
SERVER-58720 DropDatabaseCoordinator must not re-execute destructive logic after removing CSRS metadata
-rw-r--r-- | src/mongo/db/s/drop_database_coordinator.cpp | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/src/mongo/db/s/drop_database_coordinator.cpp b/src/mongo/db/s/drop_database_coordinator.cpp index 9cb4f2391a3..f1707b26b85 100644 --- a/src/mongo/db/s/drop_database_coordinator.cpp +++ b/src/mongo/db/s/drop_database_coordinator.cpp @@ -224,6 +224,19 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl( // to proceed using the collection uuids to perform destructive operations sharding_ddl_util::performNoopMajorityWriteLocally(opCtx); + // ensure we do not delete collections of a different DB + if (!_firstExecution && _doc.getDatabaseVersion()) { + try { + const auto db = catalogClient->getDatabase( + opCtx, _dbName, repl::ReadConcernLevel::kLocalReadConcern); + if (_doc.getDatabaseVersion()->getUuid() != db.getVersion().getUuid()) { + return; // skip to _flushDatabaseCacheUpdates + } + } catch (const ExceptionFor<ErrorCodes::NamespaceNotFound>&) { + return; // skip to _flushDatabaseCacheUpdates + } + } + for (const auto& coll : allCollectionsForDb) { const auto& nss = coll.getNss(); LOGV2_DEBUG(5494505, 2, "Dropping collection", "namespace"_attr = nss); @@ -292,27 +305,31 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl( removeDatabaseMetadataFromConfig( opCtx, _dbName, *metadata().getDatabaseVersion()); } - - { - // Send _flushDatabaseCacheUpdates to all shards - auto flushDbCacheUpdatesCmd = - _flushDatabaseCacheUpdatesWithWriteConcern(_dbName.toString()); - flushDbCacheUpdatesCmd.setSyncFromConfig(true); - flushDbCacheUpdatesCmd.setDbName(_dbName); - - IgnoreAPIParametersBlock ignoreApiParametersBlock{opCtx}; - sharding_ddl_util::sendAuthenticatedCommandToShards( - opCtx, - "admin", - CommandHelpers::appendMajorityWriteConcern( - flushDbCacheUpdatesCmd.toBSON({})), - allShardIds, - **executor); - } - - ShardingLogging::get(opCtx)->logChange(opCtx, "dropDatabase", _dbName); - LOGV2(5494506, "Database dropped", "db"_attr = _dbName); })) + .then([this, executor = executor, anchor = shared_from_this()] { + auto opCtxHolder = cc().makeOperationContext(); + auto* opCtx = opCtxHolder.get(); + getForwardableOpMetadata().setOn(opCtx); + { + const auto allShardIds = Grid::get(opCtx)->shardRegistry()->getAllShardIds(opCtx); + // Send _flushDatabaseCacheUpdates to all shards + auto flushDbCacheUpdatesCmd = + _flushDatabaseCacheUpdatesWithWriteConcern(_dbName.toString()); + flushDbCacheUpdatesCmd.setSyncFromConfig(true); + flushDbCacheUpdatesCmd.setDbName(_dbName); + + IgnoreAPIParametersBlock ignoreApiParametersBlock{opCtx}; + sharding_ddl_util::sendAuthenticatedCommandToShards( + opCtx, + "admin", + CommandHelpers::appendMajorityWriteConcern(flushDbCacheUpdatesCmd.toBSON({})), + allShardIds, + **executor); + } + + ShardingLogging::get(opCtx)->logChange(opCtx, "dropDatabase", _dbName); + LOGV2(5494506, "Database dropped", "db"_attr = _dbName); + }) .onError([this, anchor = shared_from_this()](const Status& status) { if (!status.isA<ErrorCategory::NotPrimaryError>() && !status.isA<ErrorCategory::ShutdownError>()) { |