diff options
-rw-r--r-- | jstests/noPassthrough/index_shutdown_cmd_primary.js | 63 | ||||
-rw-r--r-- | jstests/noPassthrough/index_shutdown_cmd_secondary.js | 59 |
2 files changed, 122 insertions, 0 deletions
diff --git a/jstests/noPassthrough/index_shutdown_cmd_primary.js b/jstests/noPassthrough/index_shutdown_cmd_primary.js new file mode 100644 index 00000000000..aff009756bb --- /dev/null +++ b/jstests/noPassthrough/index_shutdown_cmd_primary.js @@ -0,0 +1,63 @@ +/** + * If a user attempts to shut down the server using the shutdown command without the force: true + * option while there is an index build in progress, we should reject the shutdown request. + * @tags: [requires_replication] + */ +(function() { +"use strict"; + +load('jstests/noPassthrough/libs/index_build.js'); + +const rst = new ReplSetTest({ + nodes: [ + {}, + { + // Disallow elections on secondary. + rsConfig: { + priority: 0, + votes: 0, + }, + }, + ] +}); +const nodes = rst.startSet(); +rst.initiate(); + +const primary = rst.getPrimary(); +const testDB = primary.getDB('test'); +const coll = testDB.getCollection('test'); + +assert.commandWorked(coll.insert({a: 1})); + +IndexBuildTest.pauseIndexBuilds(primary); + +const createIdx = IndexBuildTest.startIndexBuild(primary, coll.getFullName(), {a: 1}); +IndexBuildTest.waitForIndexBuildToStart(testDB, coll.getName(), 'a_1'); + +// Stop the primary using the shutdown command without {force: true}. +try { + assert.commandFailedWithCode(primary.adminCommand({shutdown: 1, force: false}), + ErrorCodes.ExceededTimeLimit); +} finally { + IndexBuildTest.resumeIndexBuilds(primary); +} + +IndexBuildTest.waitForIndexBuildToStop(testDB); + +const exitCode = createIdx({checkExitSuccess: false}); +assert.neq(0, exitCode, 'expected shell to exit abnormally due to index build being terminated'); + +if (IndexBuildTest.supportsTwoPhaseIndexBuild(primary)) { + // Two phased index build would resume after stepped down primary node is re-elected. + IndexBuildTest.assertIndexes(coll, 2, ['_id_', 'a_1']); +} else { + // Single-phased ndex build would be aborted by step down triggered by the shutdown command. + IndexBuildTest.assertIndexes(coll, 1, ['_id_']); +} + +// This runs the shutdown command without {force: true} with additional handling for expected +// network errors when the command succeeds. +testDB.shutdownServer(); + +rst.stopSet(); +})(); diff --git a/jstests/noPassthrough/index_shutdown_cmd_secondary.js b/jstests/noPassthrough/index_shutdown_cmd_secondary.js new file mode 100644 index 00000000000..9928179e5c3 --- /dev/null +++ b/jstests/noPassthrough/index_shutdown_cmd_secondary.js @@ -0,0 +1,59 @@ +/** + * If a user attempts to shut down the server using the shutdown command without the force: true + * option while there is an index build in progress, we should reject the shutdown request. + * @tags: [requires_replication] + */ +(function() { +"use strict"; + +load('jstests/noPassthrough/libs/index_build.js'); + +const rst = new ReplSetTest({ + nodes: [ + {}, + { + // Disallow elections on secondary. + rsConfig: { + priority: 0, + votes: 0, + }, + }, + ] +}); +const nodes = rst.startSet(); +rst.initiate(); + +const primary = rst.getPrimary(); +const testDB = primary.getDB('test'); +const coll = testDB.getCollection('test'); + +assert.commandWorked(coll.insert({a: 1})); + +const secondary = rst.getSecondary(); +IndexBuildTest.pauseIndexBuilds(secondary); + +const createIdx = IndexBuildTest.startIndexBuild(primary, coll.getFullName(), {a: 1}); + +const secondaryDB = secondary.getDB(testDB.getName()); +const secondaryColl = secondaryDB.getCollection(coll.getName()); +IndexBuildTest.waitForIndexBuildToStart(secondaryDB, secondaryColl.getName(), 'a_1'); + +// Stop the secondary using the shutdown command without {force: true}. +try { + // assert.commandWorked(secondary.adminCommand({shutdown: 1, force: false})); +} finally { + IndexBuildTest.resumeIndexBuilds(secondary); +} + +IndexBuildTest.waitForIndexBuildToStop(secondaryDB); + +createIdx(); + +IndexBuildTest.assertIndexes(secondaryColl, 2, ['_id_', 'a_1']); + +// This runs the shutdown command without {force: true} with additional handling for expected +// network errors when the command succeeds. +secondaryDB.shutdownServer(); + +rst.stopSet(); +})(); |