summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2020-08-24 15:51:07 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-24 22:13:54 +0000
commitfdc21c767f1ba1ccd8d69f5bb5e2561e8d5c22c3 (patch)
tree5645d9b153f093d7ec69552a5ab4a56d746abd90
parent118c3fad1141230435881a92865025b863376697 (diff)
downloadmongo-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.cpp10
-rw-r--r--src/mongo/db/catalog/index_builds_manager.h6
-rw-r--r--src/mongo/db/catalog/multi_index_block.cpp11
-rw-r--r--src/mongo/db/catalog/multi_index_block.h13
-rw-r--r--src/mongo/db/catalog/multi_index_block_test.cpp3
-rw-r--r--src/mongo/db/index_builds_coordinator.cpp6
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.