diff options
author | Samy Lanka <samy.lanka@mongodb.com> | 2020-07-31 07:20:47 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-04 08:33:16 +0000 |
commit | 2fc36d0b12d1c44893a5f3c1fe0ac8fb0125a071 (patch) | |
tree | 735ccccb879cd841d19f953282f1e74a27a21bd1 /src/mongo/db/index_builds_coordinator_mongod.cpp | |
parent | 4b967fd6c5e679b33922a4d287755ea987dc882c (diff) | |
download | mongo-2fc36d0b12d1c44893a5f3c1fe0ac8fb0125a071.tar.gz |
SERVER-48417 Reconstruct in-memory state when resuming index build
Diffstat (limited to 'src/mongo/db/index_builds_coordinator_mongod.cpp')
-rw-r--r-- | src/mongo/db/index_builds_coordinator_mongod.cpp | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/src/mongo/db/index_builds_coordinator_mongod.cpp b/src/mongo/db/index_builds_coordinator_mongod.cpp index 5a3f9061e90..c66627251b5 100644 --- a/src/mongo/db/index_builds_coordinator_mongod.cpp +++ b/src/mongo/db/index_builds_coordinator_mongod.cpp @@ -122,6 +122,38 @@ IndexBuildsCoordinatorMongod::startIndexBuild(OperationContext* opCtx, const UUID& buildUUID, IndexBuildProtocol protocol, IndexBuildOptions indexBuildOptions) { + return _startIndexBuild( + opCtx, dbName, collectionUUID, specs, buildUUID, protocol, indexBuildOptions, boost::none); +} + +StatusWith<SharedSemiFuture<ReplIndexBuildState::IndexCatalogStats>> +IndexBuildsCoordinatorMongod::resumeIndexBuild(OperationContext* opCtx, + std::string dbName, + CollectionUUID collectionUUID, + const std::vector<BSONObj>& specs, + const UUID& buildUUID, + const ResumeIndexInfo& resumeInfo) { + IndexBuildsCoordinator::IndexBuildOptions indexBuildOptions; + indexBuildOptions.applicationMode = ApplicationMode::kStartupRepair; + return _startIndexBuild(opCtx, + dbName, + collectionUUID, + specs, + buildUUID, + IndexBuildProtocol::kTwoPhase, + indexBuildOptions, + resumeInfo); +} + +StatusWith<SharedSemiFuture<ReplIndexBuildState::IndexCatalogStats>> +IndexBuildsCoordinatorMongod::_startIndexBuild(OperationContext* opCtx, + std::string dbName, + CollectionUUID collectionUUID, + const std::vector<BSONObj>& specs, + const UUID& buildUUID, + IndexBuildProtocol protocol, + IndexBuildOptions indexBuildOptions, + const boost::optional<ResumeIndexInfo>& resumeInfo) { const NamespaceStringOrUUID nssOrUuid{dbName, collectionUUID}; { @@ -178,11 +210,17 @@ IndexBuildsCoordinatorMongod::startIndexBuild(OperationContext* opCtx, }); if (indexBuildOptions.applicationMode == ApplicationMode::kStartupRepair) { - // Two phase index build recovery goes though a different set-up procedure because the - // original index will be dropped first. + // Two phase index build recovery goes though a different set-up procedure because we will + // either resume the index build or the original index will be dropped first. invariant(protocol == IndexBuildProtocol::kTwoPhase); - auto status = - _setUpIndexBuildForTwoPhaseRecovery(opCtx, dbName, collectionUUID, specs, buildUUID); + auto status = Status::OK(); + if (resumeInfo) { + status = _setUpResumeIndexBuild( + opCtx, dbName, collectionUUID, specs, buildUUID, resumeInfo.get()); + } else { + status = _setUpIndexBuildForTwoPhaseRecovery( + opCtx, dbName, collectionUUID, specs, buildUUID); + } if (!status.isOK()) { return status; } @@ -247,7 +285,8 @@ IndexBuildsCoordinatorMongod::startIndexBuild(OperationContext* opCtx, startPromise = std::move(startPromise), startTimestamp, shardVersion, - dbVersion + dbVersion, + resumeInfo ](auto status) mutable noexcept { auto onScopeExitGuard = makeGuard([&] { stdx::unique_lock<Latch> lk(_mutex); @@ -297,7 +336,7 @@ IndexBuildsCoordinatorMongod::startIndexBuild(OperationContext* opCtx, // Runs the remainder of the index build. Sets the promise result and cleans up the index // build. - _runIndexBuild(opCtx.get(), buildUUID, indexBuildOptions); + _runIndexBuild(opCtx.get(), buildUUID, indexBuildOptions, resumeInfo); // Do not exit with an incomplete future. invariant(replState->sharedPromise.getFuture().isReady()); |