Files
mongo/jstests/replsets/initial_sync_rename_collection_before_cloning.js
Zac 591928c619 SERVER-108478 JS formatted by prettier and remove clang-format (#39656)
GitOrigin-RevId: 6c8f6aded47f260aa4f7c231b17dae3302cb1e04
2025-08-21 17:27:09 +00:00

119 lines
3.9 KiB
JavaScript

/**
* Tests that initial sync is completed successfully if a 'renameCollection' operation
* occurs on the sync source during initial sync.
* See SERVER-4941.
*/
import {configureFailPoint} from "jstests/libs/fail_point_util.js";
import {ReplSetTest} from "jstests/libs/replsettest.js";
const basename = "initial_sync_rename_collection_before_cloning";
jsTestLog("Bring up a replica set");
const rst = new ReplSetTest({name: basename, nodes: 1});
rst.startSet();
rst.initiate();
const db0_name = "db0";
const db1_name = "db1";
const primary = rst.getPrimary();
// Create two separate databases so that we can rename a collection across databases.
const primary_db0 = primary.getDB(db0_name);
const primary_db1 = primary.getDB(db1_name);
jsTestLog("Create collections on primary");
const collRenameWithinDB_name = "coll_1";
const collRenameAcrossDBs_name = "coll_2";
const collWithinFinal_name = "renamed";
const collAcrossFinal_name = "renamed_across";
// Create two collections on the same database. One will be renamed within the database
// and the other will be renamed to a different database.
assert.commandWorked(primary_db0[collRenameWithinDB_name].save({}));
assert.commandWorked(primary_db0[collRenameAcrossDBs_name].save({}));
jsTestLog("Waiting for replication");
rst.awaitReplication();
jsTestLog("Bring up a new node");
const secondary = rst.add({setParameter: "numInitialSyncAttempts=1"});
// Add a fail point that causes the secondary's initial sync to hang before
// copying databases.
const failPoint = configureFailPoint(secondary, "initialSyncHangBeforeCopyingDatabases");
jsTestLog("Begin initial sync on secondary");
let conf = rst.getPrimary().getDB("admin").runCommand({replSetGetConfig: 1}).config;
conf.members.push({_id: 1, host: secondary.host, priority: 0, votes: 0});
conf.version++;
assert.commandWorked(rst.getPrimary().getDB("admin").runCommand({replSetReconfig: conf}));
assert.eq(primary, rst.getPrimary(), "Primary changed after reconfig");
// Confirm that initial sync started on the secondary node.
jsTestLog("Waiting for initial sync to start");
failPoint.wait();
// Start renaming collections while initial sync is hanging.
jsTestLog(
"Rename collection " +
db0_name +
"." +
collRenameWithinDB_name +
" to " +
db0_name +
"." +
collWithinFinal_name +
" on the sync source " +
db0_name,
);
assert.commandWorked(primary_db0[collRenameWithinDB_name].renameCollection(collWithinFinal_name));
jsTestLog(
"Rename collection " +
db0_name +
"." +
collRenameAcrossDBs_name +
" to " +
db1_name +
"." +
collAcrossFinal_name +
" on the sync source " +
db0_name,
);
assert.commandWorked(
primary.adminCommand({
renameCollection: primary_db0[collRenameAcrossDBs_name].getFullName(),
to: primary_db1[collAcrossFinal_name].getFullName(), // Collection 'renamed_across' is implicitly created.
}),
);
// Disable fail point so that the secondary can finish its initial sync.
failPoint.off();
jsTestLog("Wait for both nodes to be up-to-date");
rst.awaitSecondaryNodes();
rst.awaitReplication();
const secondary_db0 = secondary.getDB(db0_name);
const secondary_db1 = secondary.getDB(db1_name);
jsTestLog("Check that collection was renamed correctly on the secondary");
assert.eq(secondary_db0[collWithinFinal_name].find().itcount(), 1, "renamed collection does not exist");
assert.eq(secondary_db1[collAcrossFinal_name].find().itcount(), 1, "renamed_across collection does not exist");
assert.eq(
secondary_db0[collRenameWithinDB_name].find().itcount(),
0,
"collection " + collRenameWithinDB_name + " still exists after it was supposed to be renamed",
);
assert.eq(
secondary_db0[collRenameAcrossDBs_name].find().itcount(),
0,
"collection " + collRenameAcrossDBs_name + " still exists after it was supposed to be renamed",
);
rst.checkReplicatedDataHashes();
rst.checkOplogs();
rst.stopSet();