summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2020-01-19 07:05:19 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-01-19 12:50:44 +0000
commit8f1a363b05c25b0887c46fc49569977f3e876e35 (patch)
treefa0f6dd51d440a404549c8762806b3d62c45470f /src/mongo/db
parente9f4b9da40f5a24d220121d879b521d631a06159 (diff)
downloadmongo-8f1a363b05c25b0887c46fc49569977f3e876e35.tar.gz
SERVER-43988 shutdown with {force: false} lists active index builds
Diffstat (limited to 'src/mongo/db')
-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.