diff options
author | Benety Goh <benety@mongodb.com> | 2020-08-24 15:51:07 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-24 22:13:54 +0000 |
commit | fdc21c767f1ba1ccd8d69f5bb5e2561e8d5c22c3 (patch) | |
tree | 5645d9b153f093d7ec69552a5ab4a56d746abd90 | |
parent | 118c3fad1141230435881a92865025b863376697 (diff) | |
download | mongo-fdc21c767f1ba1ccd8d69f5bb5e2561e8d5c22c3.tar.gz |
SERVER-50446 IndexBuildsCoordinator provides 'isResumable' info to MultiIndexBuild when stopping index builds for rollback/shutdown
-rw-r--r-- | src/mongo/db/catalog/index_builds_manager.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_builds_manager.h | 6 | ||||
-rw-r--r-- | src/mongo/db/catalog/multi_index_block.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/catalog/multi_index_block.h | 13 | ||||
-rw-r--r-- | src/mongo/db/catalog/multi_index_block_test.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/index_builds_coordinator.cpp | 6 |
6 files changed, 30 insertions, 19 deletions
diff --git a/src/mongo/db/catalog/index_builds_manager.cpp b/src/mongo/db/catalog/index_builds_manager.cpp index bfa9dd3bcf2..2a72b40fb71 100644 --- a/src/mongo/db/catalog/index_builds_manager.cpp +++ b/src/mongo/db/catalog/index_builds_manager.cpp @@ -332,7 +332,8 @@ bool IndexBuildsManager::abortIndexBuild(OperationContext* opCtx, bool IndexBuildsManager::abortIndexBuildWithoutCleanupForRollback(OperationContext* opCtx, Collection* collection, - const UUID& buildUUID) { + const UUID& buildUUID, + bool isResumable) { auto builder = _getBuilder(buildUUID); if (!builder.isOK()) { return false; @@ -343,7 +344,7 @@ bool IndexBuildsManager::abortIndexBuildWithoutCleanupForRollback(OperationConte "Index build aborted without cleanup for rollback", "buildUUID"_attr = buildUUID); - if (auto resumeInfo = builder.getValue()->abortWithoutCleanupForRollback(opCtx)) { + if (auto resumeInfo = builder.getValue()->abortWithoutCleanupForRollback(opCtx, isResumable)) { _resumeInfos.push_back(std::move(*resumeInfo)); } @@ -352,7 +353,8 @@ bool IndexBuildsManager::abortIndexBuildWithoutCleanupForRollback(OperationConte bool IndexBuildsManager::abortIndexBuildWithoutCleanupForShutdown(OperationContext* opCtx, Collection* collection, - const UUID& buildUUID) { + const UUID& buildUUID, + bool isResumable) { auto builder = _getBuilder(buildUUID); if (!builder.isOK()) { return false; @@ -361,7 +363,7 @@ bool IndexBuildsManager::abortIndexBuildWithoutCleanupForShutdown(OperationConte LOGV2( 4841500, "Index build aborted without cleanup for shutdown", "buildUUID"_attr = buildUUID); - builder.getValue()->abortWithoutCleanupForShutdown(opCtx); + builder.getValue()->abortWithoutCleanupForShutdown(opCtx, isResumable); return true; } diff --git a/src/mongo/db/catalog/index_builds_manager.h b/src/mongo/db/catalog/index_builds_manager.h index 8c61dc72069..87004b6f2f8 100644 --- a/src/mongo/db/catalog/index_builds_manager.h +++ b/src/mongo/db/catalog/index_builds_manager.h @@ -164,7 +164,8 @@ public: */ bool abortIndexBuildWithoutCleanupForRollback(OperationContext* opCtx, Collection* collection, - const UUID& buildUUID); + const UUID& buildUUID, + bool isResumable); /** * The same as abortIndexBuildWithoutCleanupForRollback above, but additionally writes the @@ -173,7 +174,8 @@ public: */ bool abortIndexBuildWithoutCleanupForShutdown(OperationContext* opCtx, Collection* collection, - const UUID& buildUUID); + const UUID& buildUUID, + bool isResumable); /** * Returns true if the index build supports background writes while building an index. This is diff --git a/src/mongo/db/catalog/multi_index_block.cpp b/src/mongo/db/catalog/multi_index_block.cpp index 52250e456ae..9a2a82a1ad4 100644 --- a/src/mongo/db/catalog/multi_index_block.cpp +++ b/src/mongo/db/catalog/multi_index_block.cpp @@ -749,12 +749,12 @@ Status MultiIndexBlock::checkConstraints(OperationContext* opCtx) { } boost::optional<ResumeIndexInfo> MultiIndexBlock::abortWithoutCleanupForRollback( - OperationContext* opCtx) { - return _abortWithoutCleanup(opCtx, false /* shutdown */); + OperationContext* opCtx, bool isResumable) { + return _abortWithoutCleanup(opCtx, false /* shutdown */, isResumable); } -void MultiIndexBlock::abortWithoutCleanupForShutdown(OperationContext* opCtx) { - _abortWithoutCleanup(opCtx, true /* shutdown */); +void MultiIndexBlock::abortWithoutCleanupForShutdown(OperationContext* opCtx, bool isResumable) { + _abortWithoutCleanup(opCtx, true /* shutdown */, isResumable); } MultiIndexBlock::OnCreateEachFn MultiIndexBlock::kNoopOnCreateEachFn = [](const BSONObj& spec) {}; @@ -831,7 +831,8 @@ void MultiIndexBlock::setIndexBuildMethod(IndexBuildMethod indexBuildMethod) { } boost::optional<ResumeIndexInfo> MultiIndexBlock::_abortWithoutCleanup(OperationContext* opCtx, - bool shutdown) { + bool shutdown, + bool isResumable) { invariant(!_buildIsCleanedUp); UninterruptibleLockGuard noInterrupt(opCtx->lockState()); // Lock if it's not already locked, to ensure storage engine cannot be destructed out from diff --git a/src/mongo/db/catalog/multi_index_block.h b/src/mongo/db/catalog/multi_index_block.h index 5e52419dd1c..a876924bbc8 100644 --- a/src/mongo/db/catalog/multi_index_block.h +++ b/src/mongo/db/catalog/multi_index_block.h @@ -276,7 +276,8 @@ public: * * This should only be used during rollback. */ - boost::optional<ResumeIndexInfo> abortWithoutCleanupForRollback(OperationContext* opCtx); + boost::optional<ResumeIndexInfo> abortWithoutCleanupForRollback(OperationContext* opCtx, + bool isResumable); /** * May be called at any time after construction but before a successful commit(). Suppresses @@ -287,7 +288,7 @@ public: * * This should only be used during shutdown. */ - void abortWithoutCleanupForShutdown(OperationContext* opCtx); + void abortWithoutCleanupForShutdown(OperationContext* opCtx, bool isResumable); /** * Returns true if this build block supports background writes while building an index. This is @@ -310,11 +311,13 @@ private: /** * This function should be used for shutdown and rollback. When called for shutdown, writes the - * resumable index build state to disk if resuamble index builds are supported. When called for - * rollback, returns the information to resume the index build if resuamble index builds are + * resumable index build state to disk if resumable index builds are supported. When called for + * rollback, returns the information to resume the index build if resumable index builds are * supported. */ - boost::optional<ResumeIndexInfo> _abortWithoutCleanup(OperationContext* opCtx, bool shutdown); + boost::optional<ResumeIndexInfo> _abortWithoutCleanup(OperationContext* opCtx, + bool shutdown, + bool isResumable); bool _isResumable(OperationContext* opCtx) const; diff --git a/src/mongo/db/catalog/multi_index_block_test.cpp b/src/mongo/db/catalog/multi_index_block_test.cpp index c93ff539429..ed5da9d7957 100644 --- a/src/mongo/db/catalog/multi_index_block_test.cpp +++ b/src/mongo/db/catalog/multi_index_block_test.cpp @@ -147,7 +147,8 @@ TEST_F(MultiIndexBlockTest, AbortWithoutCleanupAfterInsertingSingleDocument) { operationContext(), coll, std::vector<BSONObj>(), MultiIndexBlock::kNoopOnInitFn)); ASSERT_EQUALS(0U, specs.size()); ASSERT_OK(indexer->insertSingleDocumentForInitialSyncOrRecovery(operationContext(), {}, {})); - indexer->abortWithoutCleanupForRollback(operationContext()); + auto isResumable = false; + indexer->abortWithoutCleanupForRollback(operationContext(), isResumable); } TEST_F(MultiIndexBlockTest, InitWriteConflictException) { diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp index dc6687a95a9..e329924d2d0 100644 --- a/src/mongo/db/index_builds_coordinator.cpp +++ b/src/mongo/db/index_builds_coordinator.cpp @@ -1333,8 +1333,9 @@ void IndexBuildsCoordinator::_completeAbort(OperationContext* opCtx, case IndexBuildAction::kRollbackAbort: { invariant(replState->protocol == IndexBuildProtocol::kTwoPhase); invariant(replCoord->getMemberState().rollback()); + auto isResumable = !replState->lastOpTimeBeforeInterceptors.isNull(); _indexBuildsManager.abortIndexBuildWithoutCleanupForRollback( - opCtx, coll, replState->buildUUID); + opCtx, coll, replState->buildUUID, isResumable); break; } case IndexBuildAction::kNoAction: @@ -1367,8 +1368,9 @@ void IndexBuildsCoordinator::_completeAbortForShutdown( std::shared_ptr<ReplIndexBuildState> replState, Collection* collection) { // Leave it as-if kill -9 happened. Startup recovery will restart the index build. + auto isResumable = !replState->lastOpTimeBeforeInterceptors.isNull(); _indexBuildsManager.abortIndexBuildWithoutCleanupForShutdown( - opCtx, collection, replState->buildUUID); + opCtx, collection, replState->buildUUID, isResumable); { // Promise should be set at least once before it's getting destroyed. |