summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2022-05-16 09:42:28 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-05-16 14:30:56 +0000
commit04402176f1ae8471396905b419ebb3d1b7d1c7a9 (patch)
tree8de153a598a9a1b8372e70ad0f4939ad88ffa820
parent59bec6ec49ecf623c70ef5fe78e3e9ad969bc160 (diff)
downloadmongo-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.cpp9
-rw-r--r--src/mongo/db/active_index_builds.h6
-rw-r--r--src/mongo/db/catalog/index_builds_manager.cpp11
-rw-r--r--src/mongo/db/catalog/index_builds_manager.h6
-rw-r--r--src/mongo/db/catalog/list_indexes.cpp30
-rw-r--r--src/mongo/db/catalog/multi_index_block.cpp2
-rw-r--r--src/mongo/db/catalog/multi_index_block.h5
-rw-r--r--src/mongo/db/index_builds_coordinator.cpp5
-rw-r--r--src/mongo/db/index_builds_coordinator.h7
-rw-r--r--src/mongo/db/repl_index_build_state.cpp8
-rw-r--r--src/mongo/db/repl_index_build_state.h10
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;