diff options
author | Gabriel Marks <gabriel.marks@mongodb.com> | 2022-04-11 14:31:11 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-04-11 20:33:45 +0000 |
commit | 25377181476e4140c970afa5b018f9b4fcc951e8 (patch) | |
tree | 90fba94f67a0b140b0b03fae5d733a79800fea43 /src/mongo/db/commands/set_user_write_block_mode_command.cpp | |
parent | 6cbfcc07937a9bc2f4ea20e242a912fd5868647d (diff) | |
download | mongo-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.cpp | 19 |
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 |