diff options
author | Josef Ahmad <josef.ahmad@mongodb.com> | 2023-04-04 12:15:17 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-04-04 13:07:44 +0000 |
commit | 806b58d5fac1b17d848b3c7c997b67b68440b2ba (patch) | |
tree | 59bd4047a8b07b7491549ad57b1598b9f763d176 /src/mongo/db/index_builds_coordinator_mongod.cpp | |
parent | b7a17172c80bf156595ad3e9d92ea9ec900c03e2 (diff) | |
download | mongo-806b58d5fac1b17d848b3c7c997b67b68440b2ba.tar.gz |
SERVER-75308 Fix race between external and internal index build aborts
Diffstat (limited to 'src/mongo/db/index_builds_coordinator_mongod.cpp')
-rw-r--r-- | src/mongo/db/index_builds_coordinator_mongod.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/mongo/db/index_builds_coordinator_mongod.cpp b/src/mongo/db/index_builds_coordinator_mongod.cpp index 48d582dafb8..3e4aa686c64 100644 --- a/src/mongo/db/index_builds_coordinator_mongod.cpp +++ b/src/mongo/db/index_builds_coordinator_mongod.cpp @@ -70,6 +70,7 @@ MONGO_FAIL_POINT_DEFINE(hangBeforeInitializingIndexBuild); MONGO_FAIL_POINT_DEFINE(hangIndexBuildAfterSignalPrimaryForCommitReadiness); MONGO_FAIL_POINT_DEFINE(hangBeforeRunningIndexBuild); MONGO_FAIL_POINT_DEFINE(hangIndexBuildBeforeSignalingPrimaryForAbort); +MONGO_FAIL_POINT_DEFINE(hangIndexBuildBeforeTransitioningReplStateTokAwaitPrimaryAbort); const StringData kMaxNumActiveUserIndexBuildsServerParameterName = "maxNumActiveUserIndexBuilds"_sd; @@ -681,13 +682,28 @@ bool IndexBuildsCoordinatorMongod::_signalIfCommitQuorumNotEnabled( void IndexBuildsCoordinatorMongod::_signalPrimaryForAbortAndWaitForExternalAbort( OperationContext* opCtx, ReplIndexBuildState* replState, const Status& abortStatus) { + + hangIndexBuildBeforeTransitioningReplStateTokAwaitPrimaryAbort.pauseWhileSet(opCtx); + LOGV2(7419402, "Index build: signaling primary to abort index build", "buildUUID"_attr = replState->buildUUID, logAttrs(replState->dbName), "collectionUUID"_attr = replState->collectionUUID, "reason"_attr = abortStatus); - replState->requestAbortFromPrimary(abortStatus); + const auto transitionedToWaitForAbort = replState->requestAbortFromPrimary(abortStatus); + + if (!transitionedToWaitForAbort) { + // The index build has likely been aborted externally (e.g. its underlying collection was + // dropped), and it's in the midst of tearing down. There's nothing else to do here. + LOGV2(7530800, + "Index build: the build is already in aborted state; not signaling primary to abort", + "buildUUID"_attr = replState->buildUUID, + "db"_attr = replState->dbName, + "collectionUUID"_attr = replState->collectionUUID, + "reason"_attr = abortStatus); + return; + } hangIndexBuildBeforeSignalingPrimaryForAbort.pauseWhileSet(opCtx); |