diff options
-rw-r--r-- | jstests/libs/override_methods/sharding_continuous_config_stepdown.js | 484 | ||||
-rw-r--r-- | src/mongo/shell/servers.js | 9 |
2 files changed, 239 insertions, 254 deletions
diff --git a/jstests/libs/override_methods/sharding_continuous_config_stepdown.js b/jstests/libs/override_methods/sharding_continuous_config_stepdown.js index ee508762a50..d0d2814fc90 100644 --- a/jstests/libs/override_methods/sharding_continuous_config_stepdown.js +++ b/jstests/libs/override_methods/sharding_continuous_config_stepdown.js @@ -1,246 +1,238 @@ -/** - * Loading this file extends the prototype for ReplSetTest to spawn a thread, which continuously - * step down the primary. - */ - -// Contains the declaration for ScopedThread and CountDownLatch -load('jstests/libs/parallelTester.js'); -load("jstests/replsets/rslib.js"); - -/** - * Executes the specified function and if it fails due to exception, which is related to network - * error retries the call once. If the second attempt also fails, simply throws the last - * exception. - * - * Returns the return value of the input call. - */ -function retryOnNetworkError(func) { - var networkErrorRetriesLeft = 1; - - while (true) { - try { - return func(); - } catch (e) { - if (e.toString().indexOf("network error") > -1 && networkErrorRetriesLeft > 0) { - print("Network error occurred and the call will be retried: " + - tojson({error: e.toString(), stack: e.stack})); - networkErrorRetriesLeft--; - } else { - throw e; - } - } - } -} - -(function() { - 'use strict'; - - // Preserve the original ReplSetTest and ShardingTest constructors, because we are overriding - // them - var originalReplSetTest = ReplSetTest; - var originalShardingTest = ShardingTest; - - /** - * Overrides the ReplSetTest constructor to start the continuous config server stepdown thread. - */ - ReplSetTest = function ReplSetTestWithContinuousPrimaryStepdown() { - // Construct the original object - originalReplSetTest.apply(this, arguments); - - /** - * This function is intended to be called in a separate thread and it continuously steps - * down the current primary for a number of attempts. - * - * @param {string} seedNode The connection string of a node from which to discover the - * primary of the replica set. - * @param {CountDownLatch} stopCounter Object, which can be used to stop the thread. - * - * @return Object with the following fields: - * ok {integer}: 0 if it failed, 1 if it succeeded. - * error {string}: Only present if ok == 0. Contains the cause for the error. - * stack {string}: Only present if ok == 0. Contains the stack at the time of the - * error. - */ - function _continuousPrimaryStepdownFn(seedNode, stopCounter) { - 'use strict'; - - load('jstests/libs/override_methods/sharding_continuous_config_stepdown.js'); - - var stepdownDelaySeconds = 10; - - print('*** Continuous stepdown thread running with seed node ' + seedNode); - - try { - // The config primary may unexpectedly step down during startup if under heavy load - // and too slowly processing heartbeats. When it steps down, it closes all of its - // connections. This can happen during the call to new ReplSetTest, so in order to - // account for this and make the tests stable, retry discovery of the replica set's - // configuration once (SERVER-22794). - var replSet = retryOnNetworkError(function() { - return new ReplSetTest(seedNode); - }); - - var primary = replSet.getPrimary(); - - while (stopCounter.getCount() > 0) { - print('*** Stepping down ' + primary); - - assert.throws(function() { - var result = primary.adminCommand( - {replSetStepDown: stepdownDelaySeconds, force: true}); - print('replSetStepDown command did not throw and returned: ' + - tojson(result)); - - // The call to replSetStepDown should never succeed - assert.commandWorked(result); - }); - - // Wait for primary to get elected and allow the test to make some progress - // before - // attempting another stepdown. - if (stopCounter.getCount() > 0) - primary = replSet.getPrimary(); - - if (stopCounter.getCount() > 0) - sleep(8000); - } - - print('*** Continuous stepdown thread completed successfully'); - return {ok: 1}; - } catch (e) { - print('*** Continuous stepdown thread caught exception: ' + tojson(e)); - return {ok: 0, error: e.toString(), stack: e.stack}; - } - } - - // Preserve the original stopSet method, because we are overriding it to stop the continuous - // stepdown thread. - var _originalStartSetFn = this.startSet; - var _originalStopSetFn = this.stopSet; - - // We override these methods to retry on network errors - var _originalAwaitLastOpCommitted = this.awaitLastOpCommitted; - - // These two manage the scoped failover thread - var _scopedPrimaryStepdownThread; - var _scopedPrimaryStepdownThreadStopCounter; - - /** - * Overrides the startSet call so we can increase the logging verbosity - */ - this.startSet = function(options) { - if (!options) { - options = {}; - } - options.setParameter = { - logComponentVerbosity: - "{ verbosity: 0, command: {verbosity: 1}, network: {verbosity: 1, \ -asio: {verbosity: 2}}, tracking: {verbosity: 1} }" - }; - return _originalStartSetFn.call(this, options); - }; - - /** - * Overrides the stopSet call so it terminates the failover thread. - */ - this.stopSet = function() { - this.stopContinuousFailover(); - _originalStopSetFn.apply(this, arguments); - }; - - /** - * Overrides the awaitLastOpCommitted to retry on network errors. - */ - this.awaitLastOpCommitted = function() { - return retryOnNetworkError(_originalAwaitLastOpCommitted.bind(this)); - }; - - /** - * Spawns a thread to invoke continuousPrimaryStepdownFn. See its comments for more - * information. - */ - this.startContinuousFailover = function() { - if (_scopedPrimaryStepdownThread) { - throw new Error('Continuous failover thread is already active'); - } - - _scopedPrimaryStepdownThreadStopCounter = new CountDownLatch(1); - _scopedPrimaryStepdownThread = - new ScopedThread(_continuousPrimaryStepdownFn, - this.nodes[0].host, - _scopedPrimaryStepdownThreadStopCounter); - _scopedPrimaryStepdownThread.start(); - }; - - /** - * Blocking method, which tells the thread running continuousPrimaryStepdownFn to stop and - * waits - * for it to terminate. - */ - this.stopContinuousFailover = function() { - if (!_scopedPrimaryStepdownThread) { - return; - } - - _scopedPrimaryStepdownThreadStopCounter.countDown(); - _scopedPrimaryStepdownThreadStopCounter = null; - - _scopedPrimaryStepdownThread.join(); - - var retVal = _scopedPrimaryStepdownThread.returnData(); - _scopedPrimaryStepdownThread = null; - - return assert.commandWorked(retVal); - }; - }; - - Object.extend(ReplSetTest, originalReplSetTest); - - /** - * Overrides the ShardingTest constructor to start the continuous config server stepdown thread. - */ - ShardingTest = function ShardingTestWithContinuousConfigPrimaryStepdown() { - if (!arguments[0].other) { - arguments[0].other = {}; - } - arguments[0].setParameter = { - logComponentVerbosity: - "{ verbosity: 0, command: {verbosity: 1}, network: {verbosity: 1, \ -asio: {verbosity: 2}}, tracking: {verbosity: 1} }" - }; - - // Set electionTimeoutMillis to 5 seconds, from 10, so that chunk migrations don't - // time out because of the CSRS primary being down so often for so long. - arguments[0].configReplSetTestOptions = - Object.merge(arguments[0].configReplSetTestOptions, { - settings: { - electionTimeoutMillis: 5000, - }, - }); - - // Construct the original object - originalShardingTest.apply(this, arguments); - - if (!this.configRS) { - throw new Error('Continuous config server step down only available with CSRS'); - } - - /** - * This method is disabled because it runs aggregation, which doesn't handle config server - * stepdown correctly. - */ - this.printShardingStatus = function() { - - }; - - assert.eq(this.configRS.getReplSetConfigFromNode().settings.electionTimeoutMillis, - 5000, - "Failed to set the electionTimeoutMillis to 5000 milliseconds"); - - // Start the continuous config server stepdown thread - this.configRS.startContinuousFailover(); - }; - - Object.extend(ShardingTest, originalShardingTest); - -})(); +/**
+ * Loading this file extends the prototype for ReplSetTest to spawn a thread, which continuously
+ * step down the primary.
+ */
+
+// Contains the declaration for ScopedThread and CountDownLatch
+load('jstests/libs/parallelTester.js');
+load("jstests/replsets/rslib.js");
+
+/**
+ * Executes the specified function and if it fails due to exception, which is related to network
+ * error retries the call once. If the second attempt also fails, simply throws the last
+ * exception.
+ *
+ * Returns the return value of the input call.
+ */
+function retryOnNetworkError(func) {
+ var networkErrorRetriesLeft = 1;
+
+ while (true) {
+ try {
+ return func();
+ } catch (e) {
+ if (e.toString().indexOf("network error") > -1 && networkErrorRetriesLeft > 0) {
+ print("Network error occurred and the call will be retried: " +
+ tojson({error: e.toString(), stack: e.stack}));
+ networkErrorRetriesLeft--;
+ } else {
+ throw e;
+ }
+ }
+ }
+}
+
+(function() {
+ 'use strict';
+
+ // Preserve the original ReplSetTest and ShardingTest constructors, because we are overriding
+ // them
+ var originalReplSetTest = ReplSetTest;
+ var originalShardingTest = ShardingTest;
+
+ /**
+ * Overrides the ReplSetTest constructor to start the continuous config server stepdown thread.
+ */
+ ReplSetTest = function ReplSetTestWithContinuousPrimaryStepdown() {
+ // Construct the original object
+ originalReplSetTest.apply(this, arguments);
+
+ /**
+ * This function is intended to be called in a separate thread and it continuously steps
+ * down the current primary for a number of attempts.
+ *
+ * @param {string} seedNode The connection string of a node from which to discover the
+ * primary of the replica set.
+ * @param {CountDownLatch} stopCounter Object, which can be used to stop the thread.
+ *
+ * @return Object with the following fields:
+ * ok {integer}: 0 if it failed, 1 if it succeeded.
+ * error {string}: Only present if ok == 0. Contains the cause for the error.
+ * stack {string}: Only present if ok == 0. Contains the stack at the time of the
+ * error.
+ */
+ function _continuousPrimaryStepdownFn(seedNode, stopCounter) {
+ 'use strict';
+
+ load('jstests/libs/override_methods/sharding_continuous_config_stepdown.js');
+
+ var stepdownDelaySeconds = 10;
+
+ print('*** Continuous stepdown thread running with seed node ' + seedNode);
+
+ try {
+ // The config primary may unexpectedly step down during startup if under heavy load
+ // and too slowly processing heartbeats. When it steps down, it closes all of its
+ // connections. This can happen during the call to new ReplSetTest, so in order to
+ // account for this and make the tests stable, retry discovery of the replica set's
+ // configuration once (SERVER-22794).
+ var replSet = retryOnNetworkError(function() {
+ return new ReplSetTest(seedNode);
+ });
+
+ var primary = replSet.getPrimary();
+
+ while (stopCounter.getCount() > 0) {
+ print('*** Stepping down ' + primary);
+
+ assert.throws(function() {
+ var result = primary.adminCommand(
+ {replSetStepDown: stepdownDelaySeconds, force: true});
+ print('replSetStepDown command did not throw and returned: ' +
+ tojson(result));
+
+ // The call to replSetStepDown should never succeed
+ assert.commandWorked(result);
+ });
+
+ // Wait for primary to get elected and allow the test to make some progress
+ // before
+ // attempting another stepdown.
+ if (stopCounter.getCount() > 0)
+ primary = replSet.getPrimary();
+
+ if (stopCounter.getCount() > 0)
+ sleep(8000);
+ }
+
+ print('*** Continuous stepdown thread completed successfully');
+ return {ok: 1};
+ } catch (e) {
+ print('*** Continuous stepdown thread caught exception: ' + tojson(e));
+ return {ok: 0, error: e.toString(), stack: e.stack};
+ }
+ }
+
+ // Preserve the original stopSet method, because we are overriding it to stop the continuous
+ // stepdown thread.
+ var _originalStartSetFn = this.startSet;
+ var _originalStopSetFn = this.stopSet;
+
+ // We override these methods to retry on network errors
+ var _originalAwaitLastOpCommitted = this.awaitLastOpCommitted;
+
+ // These two manage the scoped failover thread
+ var _scopedPrimaryStepdownThread;
+ var _scopedPrimaryStepdownThreadStopCounter;
+
+ /**
+ * Overrides the startSet call so we can increase the logging verbosity
+ */
+ this.startSet = function(options) {
+ if (!options) {
+ options = {};
+ }
+ options.verbose = 2;
+ return _originalStartSetFn.call(this, options);
+ };
+
+ /**
+ * Overrides the stopSet call so it terminates the failover thread.
+ */
+ this.stopSet = function() {
+ this.stopContinuousFailover();
+ _originalStopSetFn.apply(this, arguments);
+ };
+
+ /**
+ * Overrides the awaitLastOpCommitted to retry on network errors.
+ */
+ this.awaitLastOpCommitted = function() {
+ return retryOnNetworkError(_originalAwaitLastOpCommitted.bind(this));
+ };
+
+ /**
+ * Spawns a thread to invoke continuousPrimaryStepdownFn. See its comments for more
+ * information.
+ */
+ this.startContinuousFailover = function() {
+ if (_scopedPrimaryStepdownThread) {
+ throw new Error('Continuous failover thread is already active');
+ }
+
+ _scopedPrimaryStepdownThreadStopCounter = new CountDownLatch(1);
+ _scopedPrimaryStepdownThread =
+ new ScopedThread(_continuousPrimaryStepdownFn,
+ this.nodes[0].host,
+ _scopedPrimaryStepdownThreadStopCounter);
+ _scopedPrimaryStepdownThread.start();
+ };
+
+ /**
+ * Blocking method, which tells the thread running continuousPrimaryStepdownFn to stop and
+ * waits
+ * for it to terminate.
+ */
+ this.stopContinuousFailover = function() {
+ if (!_scopedPrimaryStepdownThread) {
+ return;
+ }
+
+ _scopedPrimaryStepdownThreadStopCounter.countDown();
+ _scopedPrimaryStepdownThreadStopCounter = null;
+
+ _scopedPrimaryStepdownThread.join();
+
+ var retVal = _scopedPrimaryStepdownThread.returnData();
+ _scopedPrimaryStepdownThread = null;
+
+ return assert.commandWorked(retVal);
+ };
+ };
+
+ Object.extend(ReplSetTest, originalReplSetTest);
+
+ /**
+ * Overrides the ShardingTest constructor to start the continuous config server stepdown thread.
+ */
+ ShardingTest = function ShardingTestWithContinuousConfigPrimaryStepdown() {
+ if (!arguments[0].other) {
+ arguments[0].other = {};
+ }
+ arguments[0].verbose = 2;
+
+ // Set electionTimeoutMillis to 5 seconds, from 10, so that chunk migrations don't
+ // time out because of the CSRS primary being down so often for so long.
+ arguments[0].configReplSetTestOptions =
+ Object.merge(arguments[0].configReplSetTestOptions, {
+ settings: {
+ electionTimeoutMillis: 5000,
+ },
+ });
+
+ // Construct the original object
+ originalShardingTest.apply(this, arguments);
+
+ if (!this.configRS) {
+ throw new Error('Continuous config server step down only available with CSRS');
+ }
+
+ /**
+ * This method is disabled because it runs aggregation, which doesn't handle config server
+ * stepdown correctly.
+ */
+ this.printShardingStatus = function() {
+
+ };
+
+ assert.eq(this.configRS.getReplSetConfigFromNode().settings.electionTimeoutMillis,
+ 5000,
+ "Failed to set the electionTimeoutMillis to 5000 milliseconds");
+
+ // Start the continuous config server stepdown thread
+ this.configRS.startContinuousFailover();
+ };
+
+ Object.extend(ShardingTest, originalShardingTest);
+
+})();
diff --git a/src/mongo/shell/servers.js b/src/mongo/shell/servers.js index 7b7ee8dbbdf..d897bf7e5df 100644 --- a/src/mongo/shell/servers.js +++ b/src/mongo/shell/servers.js @@ -967,14 +967,7 @@ var MongoRunner, _startMongod, startMongoProgram, runMongoProgram, startMongoPro argArray.push(...['--setParameter', "enableTestCommands=1"]); if (!programVersion || (parseInt(programVersion.split(".")[0]) >= 3 && parseInt(programVersion.split(".")[1]) >= 3)) { - if (argArray - .filter((val) => { - return typeof val === "string" && - val.indexOf("logComponentVerbosity") === 0; - }) - .length === 0) { - argArray.push(...['--setParameter', "logComponentVerbosity={tracking:1}"]); - } + argArray.push(...['--setParameter', "logComponentVerbosity={tracking:1}"]); } } if (jsTest.options().authMechanism && jsTest.options().authMechanism != "SCRAM-SHA-1") { |