/** * Tests that we can remove the 'recordIdsReplicated' flag from * a collection's catalog entry via the collMod command. * * This allows us to irreversibly disable replicated record IDs on a collection. * * @tags: [ * featureFlagRecordIdsReplicated, * ] */ import {ReplSetTest} from "jstests/libs/replsettest.js"; const replSet = new ReplSetTest({nodes: [{}, {rsConfig: {votes: 0, priority: 0}}]}); replSet.startSet(); replSet.initiate(); const primary = replSet.getPrimary(); const collName = "replRecIdCollForCollMod"; // Create a collection with the param set. const testDB = primary.getDB("test"); testDB.runCommand({create: collName, recordIdsReplicated: true}); const coll = testDB.getCollection(collName); assert.commandWorked(coll.insert({_id: 1})); // For the coll the recordId should be in the oplog, and should match // the actual recordId on disk. const primOplog = replSet.findOplog(primary, {ns: coll.getFullName(), "o._id": 1}).toArray()[0]; const doc = coll.find().showRecordId().toArray()[0]; assert.eq( primOplog.rid, doc["$recordId"], `Mismatching recordIds. Primary's oplog entry: ${tojson(primOplog)}, on disk: ${tojson(doc)}`, ); // Enable debug logs for catalog changes. const originalStorageLogLevel = assert.commandWorked(testDB.setLogLevel(1, "storage")).was.storage.verbosity; let result = assert.commandWorked(testDB.runCommand({collMod: collName, recordIdsReplicated: false})); jsTestLog("Result from successful collMod command: " + tojson(result)); // Check for "Unsetting 'recordIdsReplicated' catalog entry flag" debug log message. checkLog.containsJson(primary, 8650601, {namespace: coll.getFullName()}); assert.commandWorked(testDB.setLogLevel(originalStorageLogLevel, "storage")); // Confirm that 'recordIdsReplicated' option has been removed from collection options. const collInfo = coll.exists(); assert( collInfo, "unable to find collection " + coll.getFullName() + " in listCollections results: " + tojson(testDB.getCollectionInfos()), ); jsTestLog("Collection options: " + tojson(collInfo)); assert( !collInfo.options.hasOwnProperty("recordIdsReplicated"), "collMod failed to remove recordIdsReplicated flag from collection options", ); // Check collection metadata on secondary. replSet.awaitReplication(); const secondary = replSet.getSecondary(); const secondaryDB = secondary.getDB(testDB.getName()); const secondaryColl = secondaryDB.getCollection(coll.getName()); const secondaryCollInfo = secondaryColl.exists(); assert( secondaryCollInfo, "unable to find collection " + secondaryColl.getFullName() + " in listCollections results on secondary: " + tojson(secondaryDB.getCollectionInfos()), ); assert( !secondaryCollInfo.options.hasOwnProperty("recordIdsReplicated"), "collMod failed to remove recordIdsReplicated flag from collection options on secondary", ); // Running collMod on a collection that does not replicate record IDs is disallowed. let error = assert.commandFailedWithCode(testDB.runCommand({collMod: collName, recordIdsReplicated: false}), 8650600); jsTestLog("Error from running collMod on a collection that does not replicate record IDs: " + tojson(error)); // Modifying with a true 'recordIdsReplicated' value is not allowed assert.commandFailedWithCode( testDB.runCommand({collMod: collName, recordIdsReplicated: true}), ErrorCodes.InvalidOptions, ); // Insert a document and confirm that the record ID is not replicated in the oplog. assert.commandWorked(coll.insert({_id: 2})); const oplogNoRid = replSet.findOplog(primary, {ns: coll.getFullName(), "o._id": 2}).toArray()[0]; assert(!oplogNoRid.rid, `Unexpectedly found rid in entry: ${tojson(oplogNoRid)}`); replSet.stopSet();