mirror of https://github.com/mongodb/mongo
130 lines
4.2 KiB
JavaScript
130 lines
4.2 KiB
JavaScript
/**
|
|
* Test the validity of parameters in the dbCheck command.
|
|
*
|
|
* @tags: [
|
|
* requires_fcv_71
|
|
* ]
|
|
*/
|
|
|
|
import {FeatureFlagUtil} from "jstests/libs/feature_flag_util.js";
|
|
|
|
const dbName = "dbCheckValidationModeParameters";
|
|
const colName = "dbCheckValidationModeParameters-collection";
|
|
|
|
const replSet = new ReplSetTest({
|
|
name: jsTestName(),
|
|
nodes: 2,
|
|
});
|
|
replSet.startSet();
|
|
replSet.initiateWithHighElectionTimeout();
|
|
|
|
const primary = replSet.getPrimary();
|
|
const db = primary.getDB(dbName);
|
|
const col = db[colName];
|
|
const nDocs = 1000;
|
|
|
|
assert.commandWorked(col.insertMany([...Array(nDocs).keys()].map(x => ({a: x})), {ordered: false}));
|
|
replSet.awaitReplication();
|
|
|
|
function testFeatureFlagDisabled() {
|
|
jsTestLog("Testing dbCheck with feature flag disabled.");
|
|
// validateMode field is not allowed if feature flag is disabled.
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistency",
|
|
}),
|
|
ErrorCodes.InvalidOptions);
|
|
assert.commandWorked(db.runCommand({
|
|
dbCheck: colName,
|
|
}));
|
|
}
|
|
|
|
function testInvalidParameter() {
|
|
jsTestLog("Testing dbCheck with invalid parameters.");
|
|
// Unsupported enum passed in to validateMode field.
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "invalidParam",
|
|
}),
|
|
ErrorCodes.BadValue);
|
|
|
|
// secondaryIndex field must be specified when validateMode is extraIndexKeysCheck.
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "extraIndexKeysCheck",
|
|
}),
|
|
ErrorCodes.InvalidOptions);
|
|
assert.commandFailedWithCode(
|
|
db.runCommand(
|
|
{dbCheck: colName, validateMode: "extraIndexKeysCheck", skipLookupForExtraKeys: true}),
|
|
ErrorCodes.InvalidOptions);
|
|
|
|
// Neither secondaryIndex nor skipLookupForExtraKeys fields can be specified when validateMode
|
|
// is dataConsistency or dataConsistencyAndMissingIndexKeysCheck.
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistency",
|
|
secondaryIndex: "secondaryIndex",
|
|
}),
|
|
ErrorCodes.InvalidOptions);
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistencyAndMissingIndexKeysCheck",
|
|
secondaryIndex: "secondaryIndex",
|
|
}),
|
|
ErrorCodes.InvalidOptions);
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistency",
|
|
skipLookupForExtraKeys: true,
|
|
}),
|
|
ErrorCodes.InvalidOptions);
|
|
assert.commandFailedWithCode(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistencyAndMissingIndexKeysCheck",
|
|
skipLookupForExtraKeys: true,
|
|
}),
|
|
ErrorCodes.InvalidOptions);
|
|
}
|
|
|
|
function testValidParameter() {
|
|
jsTestLog("Testing dbCheck with valid parameters.");
|
|
// dataConsistency is a supported enum for the validateMode field.
|
|
assert.commandWorked(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistency",
|
|
}));
|
|
|
|
// dataConsistencyAndMissingIndexKeysCheck is a supported enum for the validateMode
|
|
// field.
|
|
assert.commandWorked(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "dataConsistencyAndMissingIndexKeysCheck",
|
|
}));
|
|
|
|
// extraIndexKeysCheck is a supported enum for the validateMode field.
|
|
assert.commandWorked(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "extraIndexKeysCheck",
|
|
secondaryIndex: "secondaryIndex",
|
|
skipLookupForExtraKeys: true,
|
|
}));
|
|
// skipLookupForExtraKeys is default to false when validateMode is set.
|
|
assert.commandWorked(db.runCommand({
|
|
dbCheck: colName,
|
|
validateMode: "extraIndexKeysCheck",
|
|
secondaryIndex: "secondaryIndex",
|
|
}));
|
|
}
|
|
|
|
const secondaryIndexChecks =
|
|
FeatureFlagUtil.isPresentAndEnabled(primary, "SecondaryIndexChecksInDbCheck");
|
|
if (secondaryIndexChecks) {
|
|
testInvalidParameter();
|
|
testValidParameter();
|
|
} else {
|
|
testFeatureFlagDisabled();
|
|
}
|
|
|
|
replSet.stopSet();
|