mongo/jstests/replsets/stepdown_during_set_fcv.js

66 lines
2.1 KiB
JavaScript

/**
* Tests that a stepdown during the execution of the setFeatureCompatibilityVersion command causes
* it to fail gracefully.
*
* @tags: [
* multiversion_incompatible
* ]
*
*/
import {configureFailPoint} from "jstests/libs/fail_point_util.js";
import {ReplSetTest} from "jstests/libs/replsettest.js";
function runTest(downgradeFCV) {
const rst = new ReplSetTest({name: jsTestName(), nodes: 2});
rst.startSet();
rst.initiate(null, null, {initiateWithDefaultElectionTimeout: true});
let primary = rst.getPrimary();
const failpoint = configureFailPoint(primary, "hangBeforeUpdatingFcvDoc");
jsTestLog(
"Issue a setFeatureCompatibilityVersion command that will wait on the " + "hangBeforeUpdatingFcvDoc failpoint",
);
const parallelFn = `
assert.commandFailedWithCode(
db.adminCommand({setFeatureCompatibilityVersion: "${downgradeFCV}", confirm: true}),
ErrorCodes.InterruptedDueToReplStateChange); `;
const awaitShell = startParallelShell(parallelFn, primary.port);
failpoint.wait();
jsTestLog("Stepping down the primary");
assert.commandWorked(primary.adminCommand({replSetStepDown: 10 * 60, force: 1}));
rst.awaitSecondaryNodes(null, [primary]);
rst.awaitNodesAgreeOnPrimary();
primary = rst.getPrimary();
const secondary = rst.getSecondaries()[0];
jsTestLog("Issue a setFeatureCompatibilityVersion command on the new primary");
assert.commandWorked(primary.adminCommand({setFeatureCompatibilityVersion: downgradeFCV, confirm: true}));
rst.awaitReplication();
jsTestLog("Unset the failpoint on the former primary so it finishes running " + "setFeatureCompatibilityVersion");
failpoint.off();
awaitShell();
jsTestLog("Verify that both nodes are running with downgraded featureCompatibilityVersion");
rst.awaitReplication();
checkFCV(primary.getDB("admin"), downgradeFCV);
checkFCV(secondary.getDB("admin"), downgradeFCV);
rst.stopSet();
}
jsTestLog("Running test against lastLTSFCV");
runTest(lastLTSFCV);
if (lastLTSFCV !== lastContinuousFCV) {
jsTestLog("Running test against lastContinuousFCV");
runTest(lastContinuousFCV);
}