diff options
author | Pavi Vetriselvan <pvselvan@umich.edu> | 2020-05-13 19:35:57 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-05-18 21:01:55 +0000 |
commit | c15f21fa5f7c20c2747f06a100ffb8d263f4558a (patch) | |
tree | 82a91cfb63ca8b8320d24c35f73c2eac9e39c9eb | |
parent | 7812e129b6f29606a2b628a125992139330c5a5b (diff) | |
download | mongo-c15f21fa5f7c20c2747f06a100ffb8d263f4558a.tar.gz |
SERVER-46958 add mongosShutdownTimeoutMillisForSignaledShutdown server parameter
-rw-r--r-- | src/mongo/s/mongos_server_parameters.idl | 10 | ||||
-rw-r--r-- | src/mongo/s/mongos_topology_coordinator.cpp | 10 | ||||
-rw-r--r-- | src/mongo/s/mongos_topology_coordinator.h | 7 | ||||
-rw-r--r-- | src/mongo/s/server.cpp | 19 | ||||
-rw-r--r-- | src/mongo/shell/servers.js | 14 | ||||
-rw-r--r-- | src/mongo/shell/shardingtest.js | 6 |
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); |