diff options
author | Allison Easton <allison.easton@mongodb.com> | 2021-10-26 07:01:01 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-26 07:25:12 +0000 |
commit | 20043571a6f3f081073a14a8655971a479f44461 (patch) | |
tree | 75db47285c06607f8ab987f6e64a052ad131ec8f /src | |
parent | f57352ed82a263188822349f859cb3953436b3e4 (diff) | |
download | mongo-20043571a6f3f081073a14a8655971a479f44461.tar.gz |
SERVER-60731 Postpone database critical section release in drop database coordinator
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/s/drop_database_coordinator.cpp | 41 | ||||
-rw-r--r-- | src/mongo/db/s/drop_database_coordinator.h | 4 |
2 files changed, 43 insertions, 2 deletions
diff --git a/src/mongo/db/s/drop_database_coordinator.cpp b/src/mongo/db/s/drop_database_coordinator.cpp index 7fedccedb8f..26fba5a99f0 100644 --- a/src/mongo/db/s/drop_database_coordinator.cpp +++ b/src/mongo/db/s/drop_database_coordinator.cpp @@ -34,9 +34,11 @@ #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/shard_metadata_util.h" #include "mongo/db/s/sharding_ddl_util.h" #include "mongo/db/s/sharding_logging.h" #include "mongo/db/s/sharding_state.h" +#include "mongo/db/s/type_shard_database.h" #include "mongo/logv2/log.h" #include "mongo/s/catalog/sharding_catalog_client.h" #include "mongo/s/client/shard_registry.h" @@ -194,6 +196,31 @@ void DropDatabaseCoordinator::_enterPhase(Phase newPhase) { _doc = _updateStateDocument(cc().makeOperationContext().get(), std::move(newDoc)); } +void DropDatabaseCoordinator::_clearDatabaseInfoOnPrimary(OperationContext* opCtx) { + Lock::DBLock dbLock(opCtx, _dbName, MODE_X); + auto dss = DatabaseShardingState::get(opCtx, _dbName); + dss->clearDatabaseInfo(opCtx); +} + +void DropDatabaseCoordinator::_clearDatabaseInfoOnSecondaries(OperationContext* opCtx) { + Status signalStatus = shardmetadatautil::updateShardDatabasesEntry( + opCtx, + BSON(ShardDatabaseType::name() << _dbName), + BSONObj(), + BSON(ShardDatabaseType::enterCriticalSectionCounter() << 1), + false /*upsert*/); + uassert(ErrorCodes::OperationFailed, + str::stream() << "Failed to persist critical section signal for " + "secondaries due to: " + << signalStatus.toString(), + signalStatus.isOK()); + // Wait for majority write concern on the secondaries + WriteConcernResult ignoreResult; + auto latestOpTime = repl::ReplClientInfo::forClient(opCtx->getClient()).getLastOp(); + uassertStatusOK(waitForWriteConcern( + opCtx, latestOpTime, ShardingCatalogClient::kMajorityWriteConcern, &ignoreResult)); +} + ExecutorFuture<void> DropDatabaseCoordinator::_runImpl( std::shared_ptr<executor::ScopedTaskExecutor> executor, const CancellationToken& token) noexcept { @@ -310,6 +337,12 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl( // primary } + // Clear the database sharding state info before exiting the critical section so + // that all subsequent write operations with the old database version will fail + // due to StaleDbVersion. + _clearDatabaseInfoOnPrimary(opCtx); + _clearDatabaseInfoOnSecondaries(opCtx); + removeDatabaseMetadataFromConfig( opCtx, _dbName, *metadata().getDatabaseVersion()); } @@ -319,7 +352,11 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl( auto* opCtx = opCtxHolder.get(); getForwardableOpMetadata().setOn(opCtx); { - const auto allShardIds = Grid::get(opCtx)->shardRegistry()->getAllShardIds(opCtx); + const auto primaryShardId = ShardingState::get(opCtx)->shardId(); + auto participants = Grid::get(opCtx)->shardRegistry()->getAllShardIds(opCtx); + participants.erase( + std::remove(participants.begin(), participants.end(), primaryShardId), + participants.end()); // Send _flushDatabaseCacheUpdates to all shards auto flushDbCacheUpdatesCmd = _flushDatabaseCacheUpdatesWithWriteConcern(_dbName.toString()); @@ -331,7 +368,7 @@ ExecutorFuture<void> DropDatabaseCoordinator::_runImpl( opCtx, "admin", CommandHelpers::appendMajorityWriteConcern(flushDbCacheUpdatesCmd.toBSON({})), - allShardIds, + participants, **executor); } diff --git a/src/mongo/db/s/drop_database_coordinator.h b/src/mongo/db/s/drop_database_coordinator.h index 786ad85ebdb..9f9f779c877 100644 --- a/src/mongo/db/s/drop_database_coordinator.h +++ b/src/mongo/db/s/drop_database_coordinator.h @@ -82,6 +82,10 @@ private: void _performNoopRetryableWriteOnParticipants( OperationContext* opCtx, const std::shared_ptr<executor::TaskExecutor>& executor); + void _clearDatabaseInfoOnPrimary(OperationContext* opCtx); + + void _clearDatabaseInfoOnSecondaries(OperationContext* opCtx); + DropDatabaseCoordinatorDocument _doc; StringData _dbName; }; |