summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavi Vetriselvan <pvselvan@umich.edu>2020-05-13 19:35:57 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-05-18 21:01:55 +0000
commitc15f21fa5f7c20c2747f06a100ffb8d263f4558a (patch)
tree82a91cfb63ca8b8320d24c35f73c2eac9e39c9eb
parent7812e129b6f29606a2b628a125992139330c5a5b (diff)
downloadmongo-c15f21fa5f7c20c2747f06a100ffb8d263f4558a.tar.gz
SERVER-46958 add mongosShutdownTimeoutMillisForSignaledShutdown server parameter
-rw-r--r--src/mongo/s/mongos_server_parameters.idl10
-rw-r--r--src/mongo/s/mongos_topology_coordinator.cpp10
-rw-r--r--src/mongo/s/mongos_topology_coordinator.h7
-rw-r--r--src/mongo/s/server.cpp19
-rw-r--r--src/mongo/shell/servers.js14
-rw-r--r--src/mongo/shell/shardingtest.js6
6 files changed, 48 insertions, 18 deletions
diff --git a/src/mongo/s/mongos_server_parameters.idl b/src/mongo/s/mongos_server_parameters.idl
index bb659f7cf93..949b4d6c627 100644
--- a/src/mongo/s/mongos_server_parameters.idl
+++ b/src/mongo/s/mongos_server_parameters.idl
@@ -86,3 +86,13 @@ server_parameters:
cpp_vartype: bool
cpp_varname: "gEnableFinerGrainedCatalogCacheRefresh"
default: true
+
+ mongosShutdownTimeoutMillisForSignaledShutdown:
+ description: >-
+ The time taken for quiesce mode at shutdown in response to SIGTERM.
+ set_at: [ startup, runtime ]
+ cpp_vartype: AtomicWord<int>
+ cpp_varname: "mongosShutdownTimeoutMillisForSignaledShutdown"
+ default: 15000
+ validator:
+ gte: 0 \ No newline at end of file
diff --git a/src/mongo/s/mongos_topology_coordinator.cpp b/src/mongo/s/mongos_topology_coordinator.cpp
index 4f889b65b83..1d18c96a6d3 100644
--- a/src/mongo/s/mongos_topology_coordinator.cpp
+++ b/src/mongo/s/mongos_topology_coordinator.cpp
@@ -192,7 +192,8 @@ void MongosTopologyCoordinator::enterQuiesceMode() {
IsMasterMetrics::get(getGlobalServiceContext())->resetNumAwaitingTopologyChanges();
}
-void MongosTopologyCoordinator::enterQuiesceModeAndWait(OperationContext* opCtx) {
+void MongosTopologyCoordinator::enterQuiesceModeAndWait(OperationContext* opCtx,
+ Milliseconds quiesceTime) {
enterQuiesceMode();
if (MONGO_unlikely(hangDuringQuiesceMode.shouldFail())) {
@@ -200,11 +201,8 @@ void MongosTopologyCoordinator::enterQuiesceModeAndWait(OperationContext* opCtx)
hangDuringQuiesceMode.pauseWhileSet(opCtx);
}
- // TODO SERVER-46958: Determine what the quiesce time should be by checking the
- // shutdownTimeoutMillisForSignaledShutdown mongos server parameter.
- auto timeout = Milliseconds(100);
- LOGV2(4695701, "Entering quiesce mode for mongos shutdown", "quiesceTime"_attr = timeout);
- opCtx->sleepFor(timeout);
+ LOGV2(4695701, "Entering quiesce mode for mongos shutdown", "quiesceTime"_attr = quiesceTime);
+ opCtx->sleepFor(quiesceTime);
LOGV2(4695702, "Exiting quiesce mode for mongos shutdown");
}
diff --git a/src/mongo/s/mongos_topology_coordinator.h b/src/mongo/s/mongos_topology_coordinator.h
index 708de6a1241..eccf83c8a31 100644
--- a/src/mongo/s/mongos_topology_coordinator.h
+++ b/src/mongo/s/mongos_topology_coordinator.h
@@ -70,12 +70,11 @@ public:
void enterQuiesceMode();
/**
- * While in quiesce mode, we will sleep for 100ms. This allows short running operations to
- * continue. We will also accept new operations, but we fail isMaster requests with
+ * While in quiesce mode, we will sleep for quiesceTime. This allows short running operations
+ * to continue. We will also accept new operations, but we fail isMaster requests with
* ShutdownInProgress.
- * TODO SERVER-46958: Modify comment with correct timeout value.
*/
- void enterQuiesceModeAndWait(OperationContext* opCtx);
+ void enterQuiesceModeAndWait(OperationContext* opCtx, Milliseconds quiesceTime);
TopologyVersion getTopologyVersion() const {
stdx::lock_guard lk(_mutex);
diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp
index 5f0589aded1..05d228e5ba3 100644
--- a/src/mongo/s/server.cpp
+++ b/src/mongo/s/server.cpp
@@ -85,6 +85,7 @@
#include "mongo/s/grid.h"
#include "mongo/s/is_mongos.h"
#include "mongo/s/mongos_options.h"
+#include "mongo/s/mongos_server_parameters_gen.h"
#include "mongo/s/mongos_topology_coordinator.h"
#include "mongo/s/query/cluster_cursor_cleanup_job.h"
#include "mongo/s/query/cluster_cursor_manager.h"
@@ -254,7 +255,8 @@ void implicitlyAbortAllTransactions(OperationContext* opCtx) {
* NOTE: This function may be called at any time after registerShutdownTask is called below. It must
* not depend on the prior execution of mongo initializers or the existence of threads.
*/
-void cleanupTask(ServiceContext* serviceContext) {
+void cleanupTask(const ShutdownTaskArgs& shutdownArgs) {
+ const auto serviceContext = getGlobalServiceContext();
{
// This client initiation pattern is only to be used here, with plans to eliminate this
// pattern down the line.
@@ -269,11 +271,20 @@ void cleanupTask(ServiceContext* serviceContext) {
opCtx = uniqueTxn.get();
}
+ Milliseconds quiesceTime;
+ if (shutdownArgs.quiesceTime) {
+ quiesceTime = *shutdownArgs.quiesceTime;
+ } else {
+ // IDL gaurantees that quiesceTime is populated.
+ invariant(!shutdownArgs.isUserInitiated);
+ quiesceTime = Milliseconds(mongosShutdownTimeoutMillisForSignaledShutdown.load());
+ }
+
// Enter quiesce mode so that existing and new short operations are allowed to finish.
// At this point, we will start responding to any isMaster request with ShutdownInProgress
// so that clients can re-route their operations.
if (auto mongosTopCoord = MongosTopologyCoordinator::get(opCtx)) {
- mongosTopCoord->enterQuiesceModeAndWait(opCtx);
+ mongosTopCoord->enterQuiesceModeAndWait(opCtx, quiesceTime);
}
// Shutdown the TransportLayer so that new connections aren't accepted
@@ -928,9 +939,9 @@ ExitCode mongoSMain(int argc, char* argv[], char** envp) {
return EXIT_ABRUPT;
}
- const auto service = getGlobalServiceContext();
+ registerShutdownTask(cleanupTask);
- registerShutdownTask([service]() { cleanupTask(service); });
+ const auto service = getGlobalServiceContext();
ErrorExtraInfo::invariantHaveAllParsers();
diff --git a/src/mongo/shell/servers.js b/src/mongo/shell/servers.js
index c5cf428d778..94638d450c7 100644
--- a/src/mongo/shell/servers.js
+++ b/src/mongo/shell/servers.js
@@ -626,14 +626,17 @@ var _isMongodVersionEqualOrAfter = function(version1, version2) {
return false;
};
-// Removes a setParameter parameter from mongods running a version that won't recognize them.
-var _removeSetParameterIfBeforeVersion = function(opts, parameterName, requiredVersion) {
+// Removes a setParameter parameter from mongods or mongoses running a version that won't recognize
+// them.
+var _removeSetParameterIfBeforeVersion = function(
+ opts, parameterName, requiredVersion, isMongos = false) {
+ var processString = isMongos ? "mongos" : "mongod";
var versionCompatible = (opts.binVersion === "" || opts.binVersion === undefined ||
_isMongodVersionEqualOrAfter(requiredVersion, opts.binVersion));
if (!versionCompatible && opts.setParameter && opts.setParameter[parameterName] != undefined) {
print("Removing '" + parameterName + "' setParameter with value " +
- opts.setParameter[parameterName] +
- " because it isn't compatibile with mongod running version " + opts.binVersion);
+ opts.setParameter[parameterName] + " because it isn't compatible with " +
+ processString + " running version " + opts.binVersion);
delete opts.setParameter[parameterName];
}
};
@@ -793,6 +796,9 @@ MongoRunner.mongosOptions = function(opts) {
opts.binVersion = MongoRunner.getBinVersionFor(testOptions.mongosBinVersion);
}
+ _removeSetParameterIfBeforeVersion(
+ opts, "mongosShutdownTimeoutMillisForSignaledShutdown", "4.5.0", true);
+
// If the mongos is being restarted with a newer version, make sure we remove any options
// that no longer exist in the newer version.
if (opts.restart && MongoRunner.areBinVersionsTheSame('latest', opts.binVersion)) {
diff --git a/src/mongo/shell/shardingtest.js b/src/mongo/shell/shardingtest.js
index af86706a6aa..fa3bf67b546 100644
--- a/src/mongo/shell/shardingtest.js
+++ b/src/mongo/shell/shardingtest.js
@@ -1544,6 +1544,12 @@ var ShardingTest = function(params) {
options = Object.merge(options, otherParams.mongosOptions);
options = Object.merge(options, otherParams["s" + i]);
+ // The default time for mongos quiesce mode in response to SIGTERM is 15 seconds.
+ // Reduce this to 100ms for faster shutdown.
+ options.setParameter = options.setParameter || {};
+ options.setParameter.mongosShutdownTimeoutMillisForSignaledShutdown =
+ options.setParameter.mongosShutdownTimeoutMillisForSignaledShutdown || 100;
+
options.port = options.port || _allocatePortForMongos();
mongosOptions.push(options);