Files
mongo/jstests/multiVersion/targetedTestsLastLtsFeatures/invalid_index_options.js

95 lines
3.5 KiB
JavaScript

/**
* Tests that in 6.1 version listIndexes can parse invalid index specs created before 5.0 version.
*
* @tags: [requires_replication]
*/
(function() {
"use strict";
load('jstests/multiVersion/libs/multi_rs.js');
var nodes = {
n1: {binVersion: "4.4"},
n2: {binVersion: "4.4"},
};
var rst = new ReplSetTest({nodes: nodes});
rst.startSet();
rst.initiate();
const dbName = "test";
const collName = jsTestName();
let primaryDB = rst.getPrimary().getDB(dbName);
let primaryColl = primaryDB.getCollection(collName);
// In earlier versions, users were able to add invalid index options when creating an index. The
// option could still be interpreted accordingly.
assert.commandWorked(primaryColl.createIndex({x: 1}, {sparse: "yes"}));
// Upgrades from 4.4 to 5.0.
jsTestLog("Upgrading to version 5.0");
rst.upgradeSet({binVersion: "5.0"});
assert.commandWorked(rst.getPrimary().adminCommand({setFeatureCompatibilityVersion: "5.0"}));
// Upgrades from 5.0 to 6.0.
jsTestLog("Upgrading to version last-lts");
rst.upgradeSet({binVersion: "last-lts"});
assert.commandWorked(rst.getPrimary().adminCommand({setFeatureCompatibilityVersion: lastLTSFCV}));
// Upgrades from 6.0 to latest.
jsTestLog("Upgrading to version latest");
rst.upgradeSet({binVersion: "latest"});
const primary = rst.getPrimary();
assert.commandWorked(primary.adminCommand({setFeatureCompatibilityVersion: latestFCV}));
primaryDB = primary.getDB(dbName);
// Verify listIndexes command can correctly output the repaired index specs.
assert.commandWorked(primaryDB.runCommand({listIndexes: collName}));
// Add a new node to make sure the initial sync works correctly with the invalid index specs.
jsTestLog("Bringing up a new node");
rst.add();
rst.reInitiate();
jsTestLog("Waiting for new node to be synced.");
rst.awaitReplication();
rst.awaitSecondaryNodes();
const [secondary1, secondary2] = rst.getSecondaries();
const secondaryDB1 = secondary1.getDB(dbName);
const secondaryDB2 = secondary2.getDB(dbName);
// Verify that the existing nodes detect invalid index options, but the new node has the repaired
// index spec.
let validateRes = assert.commandWorked(primaryDB.runCommand({validate: collName}));
assert(!validateRes.valid, "validate should fail: " + tojson(validateRes));
validateRes = assert.commandWorked(secondaryDB1.runCommand({validate: collName}));
assert(!validateRes.valid, "validate should fail: " + tojson(validateRes));
validateRes = assert.commandWorked(secondaryDB2.runCommand({validate: collName}));
assert(validateRes.valid, "validate should succeed: " + tojson(validateRes));
// Use collMod to fix the invalid index options in the collection.
assert.commandWorked(primaryDB.runCommand({collMod: collName}));
// Fix the invalid fields from index spec.
checkLog.containsJson(primary, 6444400, {fieldName: "sparse"});
checkLog.containsJson(secondary1, 6444400, {fieldName: "sparse"});
// Verify that the index no longer has invalid index options.
assert.commandWorked(primaryDB.runCommand({listIndexes: collName}));
validateRes = assert.commandWorked(primaryDB.runCommand({validate: collName}));
assert(validateRes.valid, "validate should succeed: " + tojson(validateRes));
validateRes = assert.commandWorked(secondaryDB1.runCommand({validate: collName}));
assert(validateRes.valid, "validate should succeed: " + tojson(validateRes));
validateRes = assert.commandWorked(secondaryDB2.runCommand({validate: collName}));
assert(validateRes.valid, "validate should succeed: " + tojson(validateRes));
rst.stopSet();
})();