diff options
author | Benety Goh <benety@mongodb.com> | 2022-05-16 09:42:28 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-05-16 14:30:56 +0000 |
commit | 04402176f1ae8471396905b419ebb3d1b7d1c7a9 (patch) | |
tree | 8de153a598a9a1b8372e70ad0f4939ad88ffa820 | |
parent | 59bec6ec49ecf623c70ef5fe78e3e9ad969bc160 (diff) | |
download | mongo-04402176f1ae8471396905b419ebb3d1b7d1c7a9.tar.gz |
SERVER-60791 add appendBuildInfo() method to IndexBuildsCoordinator and index build class hierarchy for listIndexes includeIncludeBuildInfo
Contains no functional or formatting changes to listIndexes.
-rw-r--r-- | src/mongo/db/active_index_builds.cpp | 9 | ||||
-rw-r--r-- | src/mongo/db/active_index_builds.h | 6 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_builds_manager.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_builds_manager.h | 6 | ||||
-rw-r--r-- | src/mongo/db/catalog/list_indexes.cpp | 30 | ||||
-rw-r--r-- | src/mongo/db/catalog/multi_index_block.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/catalog/multi_index_block.h | 5 | ||||
-rw-r--r-- | src/mongo/db/index_builds_coordinator.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/index_builds_coordinator.h | 7 | ||||
-rw-r--r-- | src/mongo/db/repl_index_build_state.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/repl_index_build_state.h | 10 |
11 files changed, 96 insertions, 3 deletions
diff --git a/src/mongo/db/active_index_builds.cpp b/src/mongo/db/active_index_builds.cpp index 100434694c9..b93ac7e82a2 100644 --- a/src/mongo/db/active_index_builds.cpp +++ b/src/mongo/db/active_index_builds.cpp @@ -208,6 +208,15 @@ size_t ActiveIndexBuilds::getActiveIndexBuilds() const { return _allIndexBuilds.size(); } +void ActiveIndexBuilds::appendBuildInfo(const UUID& buildUUID, BSONObjBuilder* builder) const { + stdx::unique_lock<Latch> lk(_mutex); + auto it = _allIndexBuilds.find(buildUUID); + if (it == _allIndexBuilds.end()) { + return; + } + it->second->appendBuildInfo(builder); +} + void ActiveIndexBuilds::sleepIfNecessary_forTestOnly() const { stdx::unique_lock<Latch> lk(_mutex); while (_sleepForTest) { diff --git a/src/mongo/db/active_index_builds.h b/src/mongo/db/active_index_builds.h index ec4f07f26cf..9574ca4d054 100644 --- a/src/mongo/db/active_index_builds.h +++ b/src/mongo/db/active_index_builds.h @@ -101,6 +101,12 @@ public: size_t getActiveIndexBuilds() const; /** + * Provides passthrough access to ReplIndexBuildState for index build info. + * Does nothing if build UUID does not refer to an active index build. + */ + void appendBuildInfo(const UUID& buildUUID, BSONObjBuilder* builder) const; + + /** * When _sleepForTest is true, this function will sleep for 100ms and then check the value * of _sleepForTest again. */ diff --git a/src/mongo/db/catalog/index_builds_manager.cpp b/src/mongo/db/catalog/index_builds_manager.cpp index f2b696f7c02..c38af203930 100644 --- a/src/mongo/db/catalog/index_builds_manager.cpp +++ b/src/mongo/db/catalog/index_builds_manager.cpp @@ -374,6 +374,17 @@ bool IndexBuildsManager::isBackgroundBuilding(const UUID& buildUUID) { return builder->isBackgroundBuilding(); } +void IndexBuildsManager::appendBuildInfo(const UUID& buildUUID, BSONObjBuilder* builder) const { + stdx::unique_lock<Latch> lk(_mutex); + + auto builderIt = _builders.find(buildUUID); + if (builderIt == _builders.end()) { + return; + } + + builderIt->second->appendBuildInfo(builder); +} + void IndexBuildsManager::verifyNoIndexBuilds_forTestOnly() { invariant(_builders.empty()); } diff --git a/src/mongo/db/catalog/index_builds_manager.h b/src/mongo/db/catalog/index_builds_manager.h index cddb46c3d16..159f691894c 100644 --- a/src/mongo/db/catalog/index_builds_manager.h +++ b/src/mongo/db/catalog/index_builds_manager.h @@ -187,6 +187,12 @@ public: bool isBackgroundBuilding(const UUID& buildUUID); /** + * Provides passthrough access to MultiIndexBlock for index build info. + * Does nothing if build UUID does not refer to an active index build. + */ + void appendBuildInfo(const UUID& buildUUID, BSONObjBuilder* builder) const; + + /** * Checks via invariant that the manager has no index builds presently. */ void verifyNoIndexBuilds_forTestOnly(); diff --git a/src/mongo/db/catalog/list_indexes.cpp b/src/mongo/db/catalog/list_indexes.cpp index d3abf868b28..c0d9817eaf5 100644 --- a/src/mongo/db/catalog/list_indexes.cpp +++ b/src/mongo/db/catalog/list_indexes.cpp @@ -40,6 +40,7 @@ #include "mongo/db/concurrency/exception_util.h" #include "mongo/db/curop_failpoint_helpers.h" #include "mongo/db/db_raii.h" +#include "mongo/db/index_builds_coordinator.h" #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" #include "mongo/db/storage/storage_engine.h" @@ -114,9 +115,32 @@ std::list<BSONObj> listIndexesInLock(OperationContext* opCtx, break; case ListIndexesInclude::IndexBuildInfo: if (inProgressInformationExists) { - indexSpecs.push_back(BSON("spec"_sd - << spec << "indexBuildInfo"_sd - << BSON("buildUUID"_sd << *durableBuildUUID))); + // Constructs a sub-document "indexBuildInfo" in the following + // format with sample values: + // + // indexBuildInfo: { + // buildUUID: UUID("00836550-d10e-4ec8-84df-cb5166bc085b"), + // method: "Hybrid", + // phase: 1, + // phaseStr: "collection scan", + // opid: 654, + // resumable: true, + // replicationState: { + // state: "In progress" + // } + // } + // + // The information here is gathered by querying the various index build + // classes accessible through the IndexBuildCoordinator interface. The + // example above is intended to provide a general idea of the information + // gathered for an in-progress index build and is subject to change. + + BSONObjBuilder builder; + durableBuildUUID->appendToBuilder(&builder, "buildUUID"_sd); + IndexBuildsCoordinator::get(opCtx)->appendBuildInfo(*durableBuildUUID, + &builder); + indexSpecs.push_back( + BSON("spec"_sd << spec << "indexBuildInfo"_sd << builder.obj())); } else { indexSpecs.push_back(BSON("spec"_sd << spec)); } diff --git a/src/mongo/db/catalog/multi_index_block.cpp b/src/mongo/db/catalog/multi_index_block.cpp index 6467a65c25d..8a190a69a23 100644 --- a/src/mongo/db/catalog/multi_index_block.cpp +++ b/src/mongo/db/catalog/multi_index_block.cpp @@ -1002,6 +1002,8 @@ void MultiIndexBlock::setIndexBuildMethod(IndexBuildMethod indexBuildMethod) { _method = indexBuildMethod; } +void MultiIndexBlock::appendBuildInfo(BSONObjBuilder* builder) const {} + void MultiIndexBlock::abortWithoutCleanup(OperationContext* opCtx, const CollectionPtr& collection, bool isResumable) { diff --git a/src/mongo/db/catalog/multi_index_block.h b/src/mongo/db/catalog/multi_index_block.h index 840770595cf..0ca275e72bf 100644 --- a/src/mongo/db/catalog/multi_index_block.h +++ b/src/mongo/db/catalog/multi_index_block.h @@ -305,6 +305,11 @@ public: void setIndexBuildMethod(IndexBuildMethod indexBuildMethod); + /** + * Appends the current state information of the index build to the builder. + */ + void appendBuildInfo(BSONObjBuilder* builder) const; + private: struct IndexToBuild { std::unique_ptr<IndexBuildBlock> block; diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp index fa8ab7edbd5..6f0adb10684 100644 --- a/src/mongo/db/index_builds_coordinator.cpp +++ b/src/mongo/db/index_builds_coordinator.cpp @@ -1695,6 +1695,11 @@ void IndexBuildsCoordinator::waitUntilAnIndexBuildFinishes(OperationContext* opC activeIndexBuilds.waitUntilAnIndexBuildFinishes(opCtx); } +void IndexBuildsCoordinator::appendBuildInfo(const UUID& buildUUID, BSONObjBuilder* builder) const { + _indexBuildsManager.appendBuildInfo(buildUUID, builder); + activeIndexBuilds.appendBuildInfo(buildUUID, builder); +} + void IndexBuildsCoordinator::createIndex(OperationContext* opCtx, UUID collectionUUID, const BSONObj& spec, diff --git a/src/mongo/db/index_builds_coordinator.h b/src/mongo/db/index_builds_coordinator.h index 425c511a1c2..f00572060fd 100644 --- a/src/mongo/db/index_builds_coordinator.h +++ b/src/mongo/db/index_builds_coordinator.h @@ -411,6 +411,13 @@ public: */ void waitUntilAnIndexBuildFinishes(OperationContext* opCtx); + + /** + * Appends the current state information of the index build to the builder. + * Does nothing if build UUID does not refer to an active index build. + */ + void appendBuildInfo(const UUID& buildUUID, BSONObjBuilder* builder) const; + // // Helper functions for creating indexes that do not have to be managed by the // IndexBuildsCoordinator. diff --git a/src/mongo/db/repl_index_build_state.cpp b/src/mongo/db/repl_index_build_state.cpp index 3b84477aac3..773608aafbb 100644 --- a/src/mongo/db/repl_index_build_state.cpp +++ b/src/mongo/db/repl_index_build_state.cpp @@ -117,6 +117,8 @@ void IndexBuildState::setState(StateFlag state, } } +void IndexBuildState::appendBuildInfo(BSONObjBuilder* builder) const {} + ReplIndexBuildState::ReplIndexBuildState(const UUID& indexBuildUUID, const UUID& collUUID, const std::string& dbName, @@ -462,6 +464,12 @@ void ReplIndexBuildState::clearLastOpTimeBeforeInterceptors() { _lastOpTimeBeforeInterceptors = {}; } +void ReplIndexBuildState::appendBuildInfo(BSONObjBuilder* builder) const { + stdx::unique_lock<Latch> lk(_mutex); + + _indexBuildState.appendBuildInfo(builder); +} + bool ReplIndexBuildState::_shouldSkipIndexBuildStateTransitionCheck(OperationContext* opCtx) const { const auto replCoord = repl::ReplicationCoordinator::get(opCtx); if (replCoord->isReplEnabled() && protocol == IndexBuildProtocol::kTwoPhase) { diff --git a/src/mongo/db/repl_index_build_state.h b/src/mongo/db/repl_index_build_state.h index 428d1f99004..16e1bbeb34c 100644 --- a/src/mongo/db/repl_index_build_state.h +++ b/src/mongo/db/repl_index_build_state.h @@ -209,6 +209,11 @@ public: MONGO_UNREACHABLE; } + /** + * Appends the current state information of the index build to the builder. + */ + void appendBuildInfo(BSONObjBuilder* builder) const; + private: // Represents the index build state. StateFlag _state = kSetup; @@ -371,6 +376,11 @@ public: void setLastOpTimeBeforeInterceptors(repl::OpTime opTime); void clearLastOpTimeBeforeInterceptors(); + /** + * Appends index build info to builder. + */ + void appendBuildInfo(BSONObjBuilder* builder) const; + // Uniquely identifies this index build across replica set members. const UUID buildUUID; |