mirror of https://github.com/mongodb/mongo
110 lines
3.3 KiB
JavaScript
110 lines
3.3 KiB
JavaScript
/**
|
|
* Checks that setClusterParameter behaves as expected during restart.
|
|
*
|
|
* @tags: [
|
|
* does_not_support_stepdowns,
|
|
* # Restarts all replica set member nodes mid-test.
|
|
* requires_persistence,
|
|
* requires_replication,
|
|
* requires_fcv_62,
|
|
* ]
|
|
*/
|
|
import {
|
|
runGetClusterParameterNode,
|
|
runGetClusterParameterReplicaSet,
|
|
runSetClusterParameter,
|
|
} from "jstests/libs/cluster_server_parameter_utils.js";
|
|
import {ReplSetTest} from "jstests/libs/replsettest.js";
|
|
|
|
let intParameter = {
|
|
_id: "testIntClusterParameter",
|
|
};
|
|
let strParameter = {
|
|
_id: "testStrClusterParameter",
|
|
};
|
|
|
|
function setParamsAndValidateCluster(rst) {
|
|
runSetClusterParameter(rst.getPrimary(), intParameter);
|
|
runSetClusterParameter(rst.getPrimary(), strParameter);
|
|
|
|
// Check that the new values are visible on the majority of the nodes.
|
|
runGetClusterParameterReplicaSet(
|
|
rst,
|
|
["testIntClusterParameter", "testStrClusterParameter"],
|
|
[intParameter, strParameter],
|
|
);
|
|
}
|
|
// Checks that up-to-date cluster parameters are transferred over to newly-added replica set nodes
|
|
// as part of initial sync.
|
|
function checkClusterParameterInitialSync(rst, newNodeOptions) {
|
|
// Update some parameter values.
|
|
intParameter.intData = 5;
|
|
strParameter.strData = "state 1";
|
|
setParamsAndValidateCluster(rst);
|
|
|
|
// Add a new node to the replica set, reinitiate the set, and wait for it to become a secondary
|
|
// with all data fully replicated to it.
|
|
const newNode = rst.add(newNodeOptions);
|
|
rst.waitForAllNewlyAddedRemovals();
|
|
rst.reInitiate();
|
|
rst.awaitSecondaryNodes(null, [newNode]);
|
|
rst.awaitReplication();
|
|
|
|
// Check that the new node has the latest cluster parameter values.
|
|
assert(
|
|
runGetClusterParameterNode(
|
|
newNode,
|
|
["testIntClusterParameter", "testStrClusterParameter"],
|
|
[intParameter, strParameter],
|
|
),
|
|
);
|
|
|
|
// Check that setClusterParameter properly works with the reconfigured replica set.
|
|
intParameter.intData = 30;
|
|
strParameter.strData = "sleep";
|
|
setParamsAndValidateCluster(rst);
|
|
}
|
|
|
|
// Checks that restarted replica sets start with the most recent majority-written cluster parameter
|
|
// values.
|
|
function checkClusterParameterRestart(rst) {
|
|
// Update some parameter values.
|
|
intParameter.intData = 7;
|
|
strParameter.strData = "state 2";
|
|
setParamsAndValidateCluster(rst);
|
|
|
|
// Bounce restart all of the nodes.
|
|
rst.nodeList().forEach((_, index) => {
|
|
rst.restart(index);
|
|
});
|
|
|
|
// Check that restarted replica set still has the most recent setClusterParameter values.
|
|
runGetClusterParameterReplicaSet(
|
|
rst,
|
|
["testIntClusterParameter", "testStrClusterParameter"],
|
|
[intParameter, strParameter],
|
|
);
|
|
}
|
|
|
|
const baseOptions = {
|
|
setParameter: {},
|
|
};
|
|
|
|
const rst = new ReplSetTest({
|
|
nodes: 3,
|
|
});
|
|
rst.startSet(baseOptions);
|
|
rst.initiate(null, null, {initiateWithDefaultElectionTimeout: true});
|
|
|
|
for (let syncMethod of ["logical", "fileCopyBased"]) {
|
|
jsTest.log("Testing initial sync w/ method = " + syncMethod);
|
|
let options = baseOptions;
|
|
options.setParameter.initialSyncMethod = syncMethod;
|
|
checkClusterParameterInitialSync(rst, options);
|
|
}
|
|
|
|
jsTest.log("Testing cluster restart");
|
|
checkClusterParameterRestart(rst);
|
|
|
|
rst.stopSet();
|