summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/set_user_write_block_mode_command.cpp
diff options
context:
space:
mode:
authorGabriel Marks <gabriel.marks@mongodb.com>2022-04-11 14:31:11 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-11 20:33:45 +0000
commit25377181476e4140c970afa5b018f9b4fcc951e8 (patch)
tree90fba94f67a0b140b0b03fae5d733a79800fea43 /src/mongo/db/commands/set_user_write_block_mode_command.cpp
parent6cbfcc07937a9bc2f4ea20e242a912fd5868647d (diff)
downloadmongo-25377181476e4140c970afa5b018f9b4fcc951e8.tar.gz
SERVER-65116 Abort active index builds when write blocking is enabled
Diffstat (limited to 'src/mongo/db/commands/set_user_write_block_mode_command.cpp')
-rw-r--r--src/mongo/db/commands/set_user_write_block_mode_command.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/mongo/db/commands/set_user_write_block_mode_command.cpp b/src/mongo/db/commands/set_user_write_block_mode_command.cpp
index b1d645dda4b..f4f6cb1d61f 100644
--- a/src/mongo/db/commands/set_user_write_block_mode_command.cpp
+++ b/src/mongo/db/commands/set_user_write_block_mode_command.cpp
@@ -35,8 +35,10 @@
#include "mongo/db/commands.h"
#include "mongo/db/commands/feature_compatibility_version.h"
#include "mongo/db/commands/set_user_write_block_mode_gen.h"
+#include "mongo/db/index_builds_coordinator.h"
#include "mongo/db/repl/repl_client_info.h"
#include "mongo/db/repl/replication_coordinator.h"
+#include "mongo/db/s/global_user_write_block_state.h"
#include "mongo/db/s/user_writes_recoverable_critical_section_service.h"
#include "mongo/db/server_feature_flags_gen.h"
#include "mongo/logv2/log.h"
@@ -74,6 +76,9 @@ public:
repl::ReplicationCoordinator::get(opCtx)->getReplicationMode() !=
repl::ReplicationCoordinator::modeNone);
+ // Only one attempt to change write block mode may make progress at once, because the
+ // way we enable/disable user index build blocking is not concurrency-safe.
+ stdx::lock_guard lock(_mutex);
{
// TODO SERVER-65010 Remove FCV guard once 6.0 has branched out
FixedFCVRegion fixedFcvRegion(opCtx);
@@ -83,6 +88,18 @@ public:
serverGlobalParams.featureCompatibility));
if (request().getGlobal()) {
+ // Enabling write block mode on a replicaset requires several steps
+ // First, we must prevent new index builds from starting
+ auto writeBlockState = GlobalUserWriteBlockState::get(opCtx);
+ writeBlockState->enableUserIndexBuildBlocking(opCtx);
+ // Ensure that we eventually restore index build state.
+ ScopeGuard guard(
+ [&]() { writeBlockState->disableUserIndexBuildBlocking(opCtx); });
+ // Abort and wait for ongoing index builds to finish.
+ IndexBuildsCoordinator::get(opCtx)->abortUserIndexBuildsForUserWriteBlocking(
+ opCtx);
+
+ // Engage write blocking
UserWritesRecoverableCriticalSectionService::get(opCtx)
->acquireRecoverableCriticalSectionBlockingUserWrites(
opCtx,
@@ -122,6 +139,8 @@ public:
->isAuthorizedForPrivilege(Privilege{ResourcePattern::forClusterResource(),
ActionType::setUserWriteBlockMode}));
}
+
+ Mutex _mutex = MONGO_MAKE_LATCH("SetUserWriteBlockModeCommand::_mutex");
};
} setUserWriteBlockModeCommand;
} // namespace