diff options
author | Benety Goh <benety@mongodb.com> | 2019-10-09 22:57:50 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-10-09 22:57:50 +0000 |
commit | d1394b01eccd22e0b2f29fc3d818fe783be038b7 (patch) | |
tree | d627967a63fe2233cff92a2a1ef80944c624bd92 | |
parent | 97ffc69bea04758e1c7f94e1075ef2bcce652999 (diff) | |
download | mongo-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.cpp | 12 |
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 = |