summaryrefslogtreecommitdiff
path: root/src/mongo/db/index_builds_coordinator_mongod.cpp
diff options
context:
space:
mode:
authorJosef Ahmad <josef.ahmad@mongodb.com>2023-04-04 12:15:17 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-04-04 13:07:44 +0000
commit806b58d5fac1b17d848b3c7c997b67b68440b2ba (patch)
tree59bd4047a8b07b7491549ad57b1598b9f763d176 /src/mongo/db/index_builds_coordinator_mongod.cpp
parentb7a17172c80bf156595ad3e9d92ea9ec900c03e2 (diff)
downloadmongo-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.cpp18
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);