Files
mongo/jstests/multiVersion/genericSetFCVUsage/priority_port_downgrade_checks.js
Allison Easton 3672c86596 SERVER-112862 Enable feature flag for internal usages of maintenance port (#46801)
GitOrigin-RevId: d7d44944be371dbaa9a4b4dc78348e8ff391af9d
2026-01-23 20:35:35 +00:00

93 lines
3.6 KiB
JavaScript

/**
* Test that downgrading is forbidden when a priorityPort is present in the ReplSetConfig and that
* reconfigs are drained correctly to ensure stability of these checks.
*
* @tags: [
* # The priority port is based on ASIO, so gRPC testing is excluded
* grpc_incompatible,
* requires_fcv_83,
* ]
*/
import {configureFailPoint} from "jstests/libs/fail_point_util.js";
import {funWithArgs} from "jstests/libs/parallel_shell_helpers.js";
import {ReplSetTest} from "jstests/libs/replsettest.js";
import {ShardingTest} from "jstests/libs/shardingtest.js";
const numNodes = 3;
const rs = new ReplSetTest({nodes: numNodes, usePriorityPorts: true});
rs.startSet();
rs.initiate();
jsTest.log.info("Test that replica set with priority ports enabled cannot downgrade");
assert.commandFailedWithCode(
rs.getPrimary().adminCommand({setFeatureCompatibilityVersion: lastLTSFCV, confirm: true}),
ErrorCodes.CannotDowngrade,
);
jsTest.log.info("Remove the priority ports one by one and ensure downgrade is only possible once they are all removed");
for (let i = 0; i < numNodes; i++) {
let config = rs.getReplSetConfigFromNode();
delete config.members[i].priorityPort;
config.version += 1;
assert.commandWorked(rs.getPrimary().adminCommand({replSetReconfig: config}));
if (i == numNodes - 1) {
assert.commandWorked(rs.getPrimary().adminCommand({setFeatureCompatibilityVersion: lastLTSFCV, confirm: true}));
} else {
assert.commandFailedWithCode(
rs.getPrimary().adminCommand({setFeatureCompatibilityVersion: lastLTSFCV, confirm: true}),
ErrorCodes.CannotDowngrade,
);
}
}
jsTest.log.info("Reset FCV to fully upgraded");
assert.commandWorked(rs.getPrimary().adminCommand({setFeatureCompatibilityVersion: latestFCV, confirm: true}));
jsTest.log.info("Test concurrent downgrade and reconfig");
let timeoutOFCVDrainFP = configureFailPoint(rs.getPrimary(), "immediatelyTimeOutWaitForStaleOFCV");
let reconfigFP = configureFailPoint(rs.getPrimary(), "hangBeforeNewConfigValidationChecks");
jsTest.log.info("Begin a reconfig and pause it midway");
let newConfig = rs.getReplSetConfigFromNode();
newConfig.version += 1;
const awaitReconfig = startParallelShell(
funWithArgs(function (newConfig) {
assert.commandWorked(db.adminCommand({replSetReconfig: newConfig}));
}, newConfig),
rs.getPrimary().port,
);
reconfigFP.wait();
jsTest.log.info("Downgrade the FCV, it should fail waiting for the reconfig to complete");
assert.commandFailedWithCode(
rs.getPrimary().adminCommand({setFeatureCompatibilityVersion: lastLTSFCV, confirm: true}),
ErrorCodes.ExceededTimeLimit,
);
jsTest.log.info("Release the reconfig, it should succeed");
reconfigFP.off();
awaitReconfig();
timeoutOFCVDrainFP.off();
jsTest.log.info("Check that we cannot reconfig adding priority ports while we are in downgrading");
let membersWithPP = rs.getReplSetConfig().members;
newConfig = rs.getReplSetConfigFromNode();
newConfig.members = membersWithPP;
newConfig.version += 1;
assert.commandFailedWithCode(
rs.getPrimary().adminCommand({replSetReconfig: newConfig}),
ErrorCodes.NewReplicaSetConfigurationIncompatible,
);
jsTest.log.info("Reset FCV to fully upgraded");
assert.commandWorked(rs.getPrimary().adminCommand({setFeatureCompatibilityVersion: latestFCV, confirm: true}));
jsTest.log.info("Check that we cannot reconfig adding priority ports with force reconfig");
assert.commandFailedWithCode(
rs.getPrimary().adminCommand({replSetReconfig: newConfig, force: true}),
ErrorCodes.NewReplicaSetConfigurationIncompatible,
);
rs.stopSet();