summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2019-10-09 22:57:50 +0000
committerevergreen <evergreen@mongodb.com>2019-10-09 22:57:50 +0000
commitd1394b01eccd22e0b2f29fc3d818fe783be038b7 (patch)
treed627967a63fe2233cff92a2a1ef80944c624bd92
parent97ffc69bea04758e1c7f94e1075ef2bcce652999 (diff)
downloadmongo-d1394b01eccd22e0b2f29fc3d818fe783be038b7.tar.gz
SERVER-43869 runCreateIndexesForMobile() acquires collection locks necessary to clean up aborted index builds
-rw-r--r--src/mongo/db/commands/create_indexes.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/mongo/db/commands/create_indexes.cpp b/src/mongo/db/commands/create_indexes.cpp
index 2101de4c80b..4d2bd0c1cd6 100644
--- a/src/mongo/db/commands/create_indexes.cpp
+++ b/src/mongo/db/commands/create_indexes.cpp
@@ -499,7 +499,17 @@ bool runCreateIndexesForMobile(OperationContext* opCtx,
// commit() clears the state.
indexer.abortWithoutCleanup(opCtx);
}
- indexer.cleanUpAfterBuild(opCtx, collection, MultiIndexBlock::kNoopOnCleanUpFn);
+
+ if (!indexer.isCommitted()) {
+ opCtx->recoveryUnit()->abandonSnapshot();
+ exclusiveCollectionLock.reset();
+ UninterruptibleLockGuard noInterrupt(opCtx->lockState());
+ Lock::DBLock dbLock(opCtx, ns.db(), MODE_IX);
+ Lock::CollectionLock colLock(opCtx, {dbName, collectionUUID}, MODE_X);
+ indexer.cleanUpAfterBuild(opCtx, collection, MultiIndexBlock::kNoopOnCleanUpFn);
+ } else {
+ indexer.cleanUpAfterBuild(opCtx, collection, MultiIndexBlock::kNoopOnCleanUpFn);
+ }
});
std::vector<BSONObj> indexInfoObjs =