Files
mongo/jstests/fail_point/set_failpoint_through_set_parameter.js
Matt Broadstone 771dabd098 SERVER-81339 Convert ReplSetTest and ShardingTest to modules (#26332)
GitOrigin-RevId: 744aa110a53786b23c62ff53f87a1418b5991e8d
2024-08-20 22:00:49 +00:00

140 lines
5.4 KiB
JavaScript

/**
* Tests that failpoints can be set via --setParameter on the command line for mongos and mongod
* only when running with enableTestCommands=1.
* @tags: [
* disables_test_commands,
* ]
*/
import {ReplSetTest} from "jstests/libs/replsettest.js";
function assertStartupSucceeds(conn) {
assert.commandWorked(conn.adminCommand({hello: 1}));
}
function assertStartupFails(fun) {
assert.throws(fun, [], "Server started, when it was expected to fail");
}
var validFailpointPayload = {'mode': 'alwaysOn'};
var validFailpointPayloadWithData = {'mode': 'alwaysOn', 'data': {x: 1}};
var invalidFailpointPayload = "notJSON";
// In order to be able connect to a mongos that starts up successfully, start a config replica
// set so that we can provide a valid config connection string to the mongos.
var configRS = new ReplSetTest({nodes: 3});
configRS.startSet({configsvr: '', storageEngine: 'wiredTiger'});
configRS.initiate();
// Setting a failpoint via --setParameter fails if enableTestCommands is not on.
TestData.enableTestCommands = false;
assertStartupFails(() => MongoRunner.runMongod(
{setParameter: "failpoint.dummy=" + tojson(validFailpointPayload)}));
assertStartupFails(() => MongoRunner.runMongos({
setParameter: "failpoint.dummy=" + tojson(validFailpointPayload),
configdb: configRS.getURL()
}));
TestData.enableTestCommands = true;
// Passing an invalid failpoint payload fails.
assertStartupFails(() => MongoRunner.runMongod(
{setParameter: "failpoint.dummy=" + tojson(invalidFailpointPayload)}));
assertStartupFails(() => MongoRunner.runMongos({
setParameter: "failpoint.dummy=" + tojson(invalidFailpointPayload),
configdb: configRS.getURL()
}));
// Valid startup configurations succeed.
var mongod =
MongoRunner.runMongod({setParameter: "failpoint.dummy=" + tojson(validFailpointPayload)});
assertStartupSucceeds(mongod);
MongoRunner.stopMongod(mongod);
var mongos = MongoRunner.runMongos({
setParameter: "failpoint.dummy=" + tojson(validFailpointPayload),
configdb: configRS.getURL()
});
assertStartupSucceeds(mongos);
MongoRunner.stopMongos(mongos);
mongod = MongoRunner.runMongod(
{setParameter: "failpoint.dummy=" + tojson(validFailpointPayloadWithData)});
assertStartupSucceeds(mongod);
mongos = MongoRunner.runMongos({
setParameter: "failpoint.dummy=" + tojson(validFailpointPayloadWithData),
configdb: configRS.getURL()
});
assertStartupSucceeds(mongos);
// The failpoint shows up with the correct data in the results of getParameter.
var res = mongod.adminCommand({getParameter: "*"});
assert.neq(null, res);
assert.neq(null, res["failpoint.dummy"]);
assert.eq(1, res["failpoint.dummy"].mode); // the 'mode' is an enum internally; 'alwaysOn' is 1
assert.eq(validFailpointPayloadWithData.data, res["failpoint.dummy"].data);
res = mongos.adminCommand({getParameter: "*"});
assert.neq(null, res);
assert.neq(null, res["failpoint.dummy"]);
assert.eq(1, res["failpoint.dummy"].mode); // the 'mode' is an enum internally; 'alwaysOn' is 1
assert.eq(validFailpointPayloadWithData.data, res["failpoint.dummy"].data);
// The failpoint cannot be set by the setParameter command.
assert.commandFailed(mongod.adminCommand({setParameter: 1, "dummy": validFailpointPayload}));
assert.commandFailed(mongos.adminCommand({setParameter: 1, "dummy": validFailpointPayload}));
// After changing the failpoint's state through the configureFailPoint command, the changes are
// reflected in the output of the getParameter command.
var newData = {x: 2};
mongod.adminCommand({configureFailPoint: "dummy", mode: "alwaysOn", data: newData});
res = mongod.adminCommand({getParameter: 1, "failpoint.dummy": 1});
assert.neq(null, res);
assert.neq(null, res["failpoint.dummy"]);
assert.eq(1, res["failpoint.dummy"].mode); // the 'mode' is an enum internally; 'alwaysOn' is 1
assert.eq(newData, res["failpoint.dummy"].data);
mongos.adminCommand({configureFailPoint: "dummy", mode: "alwaysOn", data: newData});
res = mongos.adminCommand({getParameter: 1, "failpoint.dummy": 1});
assert.neq(null, res);
assert.neq(null, res["failpoint.dummy"]);
assert.eq(1, res["failpoint.dummy"].mode); // the 'mode' is an enum internally; 'alwaysOn' is 1
assert.eq(newData, res["failpoint.dummy"].data);
MongoRunner.stopMongod(mongod);
MongoRunner.stopMongos(mongos);
// Failpoint server parameters do not show up in the output of getParameter when not running
// with enableTestCommands=1.
TestData.enableTestCommands = false;
TestData.roleGraphInvalidationIsFatal = false;
mongod = MongoRunner.runMongod();
assertStartupSucceeds(mongod);
mongos = MongoRunner.runMongos({configdb: configRS.getURL()});
assertStartupSucceeds(mongos);
// Doing getParameter for a specific failpoint fails.
assert.commandFailed(mongod.adminCommand({getParameter: 1, "failpoint.dummy": 1}));
assert.commandFailed(mongos.adminCommand({getParameter: 1, "failpoint.dummy": 1}));
// No failpoint parameters show up when listing all parameters through getParameter.
res = mongod.adminCommand({getParameter: "*"});
assert.neq(null, res);
for (var parameter in res) { // for-in loop valid only for top-level field checks.
assert(!parameter.includes("failpoint."));
}
res = mongos.adminCommand({getParameter: "*"});
assert.neq(null, res);
for (var parameter in res) { // for-in loop valid only for top-level field checks.
assert(!parameter.includes("failpoint."));
}
MongoRunner.stopMongod(mongod);
MongoRunner.stopMongos(mongos);
configRS.stopSet();