summaryrefslogtreecommitdiff
path: root/jstests
diff options
context:
space:
mode:
authorYuhong Zhang <yuhong.zhang@mongodb.com>2022-05-09 15:29:25 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-05-09 16:35:12 +0000
commit8de3932931f6db1a37fc7077fd01e25f7e652769 (patch)
tree5cd4c2d6908bcb84181f113cc9050d3f246358bf /jstests
parent39ccb28e092ad8f6e4748fceb59319ef32d97b02 (diff)
downloadmongo-8de3932931f6db1a37fc7077fd01e25f7e652769.tar.gz
SERVER-65797 Remove invalid index specs in memory before parsing for `listIndexes`
Diffstat (limited to 'jstests')
-rw-r--r--jstests/multiVersion/targetedTestsLastLtsFeatures/invalid_index_options.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/jstests/multiVersion/targetedTestsLastLtsFeatures/invalid_index_options.js b/jstests/multiVersion/targetedTestsLastLtsFeatures/invalid_index_options.js
new file mode 100644
index 00000000000..8abc86d65ac
--- /dev/null
+++ b/jstests/multiVersion/targetedTestsLastLtsFeatures/invalid_index_options.js
@@ -0,0 +1,95 @@
+/**
+ * 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();
+})(); \ No newline at end of file