summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2020-01-19 07:05:19 -0500
committerA. Jesse Jiryu Davis <jesse@mongodb.com>2020-01-27 15:40:41 -0500
commita56f09f03498b68985df062db12d84f0b0c7d905 (patch)
tree01e87c26e097c3e1de6b60d9530bcdaffe1502a3
parent45138cfc322f1e4466d17d4faee50d6cd37411da (diff)
downloadmongo-a56f09f03498b68985df062db12d84f0b0c7d905.tar.gz
SERVER-43988 shutdown with {force: false} lists active index builds
-rw-r--r--src/mongo/db/commands/shutdown_d.cpp9
-rw-r--r--src/mongo/db/index_builds_coordinator.cpp10
-rw-r--r--src/mongo/db/index_builds_coordinator.h7
3 files changed, 26 insertions, 0 deletions
diff --git a/src/mongo/db/commands/shutdown_d.cpp b/src/mongo/db/commands/shutdown_d.cpp
index b6d8154c999..67e5572125d 100644
--- a/src/mongo/db/commands/shutdown_d.cpp
+++ b/src/mongo/db/commands/shutdown_d.cpp
@@ -34,7 +34,9 @@
#include <string>
#include "mongo/db/commands/shutdown.h"
+#include "mongo/db/index_builds_coordinator.h"
#include "mongo/db/repl/replication_coordinator.h"
+#include "mongo/util/log.h"
namespace mongo {
namespace {
@@ -61,6 +63,13 @@ public:
timeoutSecs = cmdObj["timeoutSecs"].numberLong();
}
+ if (!force) {
+ auto indexBuildsCoord = IndexBuildsCoordinator::get(opCtx);
+ auto numIndexBuilds = indexBuildsCoord->getActiveIndexBuildCount(opCtx);
+ log() << "Index builds in progress while processing shutdown command: "
+ << numIndexBuilds;
+ }
+
try {
repl::ReplicationCoordinator::get(opCtx)->stepDown(
opCtx, force, Seconds(timeoutSecs), Seconds(120));
diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp
index eda59265217..8779a50c857 100644
--- a/src/mongo/db/index_builds_coordinator.cpp
+++ b/src/mongo/db/index_builds_coordinator.cpp
@@ -694,6 +694,16 @@ bool containsUniqueIndexes(const std::vector<BSONObj>& specs) {
}
} // namespace
+std::size_t IndexBuildsCoordinator::getActiveIndexBuildCount(OperationContext* opCtx) {
+ auto indexBuilds = _getIndexBuilds();
+ // We use forEachIndexBuild() to log basic details on the current index builds and don't intend
+ // to modify any of the index builds, hence the no-op.
+ auto onIndexBuild = [](std::shared_ptr<ReplIndexBuildState> replState) {};
+ forEachIndexBuild(indexBuilds, "index build still running: "_sd, onIndexBuild);
+
+ return indexBuilds.size();
+}
+
void IndexBuildsCoordinator::onStepUp(OperationContext* opCtx) {
log() << "IndexBuildsCoordinator::onStepUp - this node is stepping up to primary";
diff --git a/src/mongo/db/index_builds_coordinator.h b/src/mongo/db/index_builds_coordinator.h
index 042c172ebca..99f0772b507 100644
--- a/src/mongo/db/index_builds_coordinator.h
+++ b/src/mongo/db/index_builds_coordinator.h
@@ -247,6 +247,13 @@ public:
bool abortIndexBuildByBuildUUIDNoWait(OperationContext* opCtx,
const UUID& buildUUID,
const std::string& reason);
+ /**
+ * Returns number of index builds in process.
+ *
+ * Invoked when the node is processing a shutdown command, an admin command that is
+ * used to shut down the server gracefully.
+ */
+ std::size_t getActiveIndexBuildCount(OperationContext* opCtx);
/**
* Invoked when the node enters the primary state.