summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllison Easton <allison.easton@mongodb.com>2021-10-26 07:01:01 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-28 09:56:34 +0000
commitab92fc4b0e7f08196c2af78454025a91ff70cb38 (patch)
tree00990f5c587476be5316404de012e76bc440a167
parent5e66bb60366b51a910ce9ebd67c2947fb6f06d03 (diff)
downloadmongo-ab92fc4b0e7f08196c2af78454025a91ff70cb38.tar.gz
SERVER-60731 Postpone database critical section release in drop database coordinator
(cherry picked from commit 20043571a6f3f081073a14a8655971a479f44461)
-rw-r--r--src/mongo/db/s/drop_database_coordinator.cpp41
-rw-r--r--src/mongo/db/s/drop_database_coordinator.h4
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;
};