Files
mongo/jstests/multiVersion/genericSetFCVUsage/move_primary_setFCV.js
2025-11-24 11:21:39 +00:00

81 lines
3.3 KiB
JavaScript

/**
* Test that `movePrimary` works for databases created under a different FCV
*/
import {ShardingTest} from "jstests/libs/shardingtest.js";
let st = new ShardingTest({shards: 2, mongos: 1, rs: {nodes: 1}});
const mongos = st.s;
const kBeforeDowngradingDbName = "createdBeforeDowngrading";
const kBeforeUpgradingDbName = "createdBeforeUpgrading";
const shard0 = st.shard0.shardName;
const shard1 = st.shard1.shardName;
const createdBeforeDowngradingDB = mongos.getDB(kBeforeDowngradingDbName);
const createdBeforeUpgradingDB = mongos.getDB(kBeforeUpgradingDbName);
const fcvValues = [lastLTSFCV, lastContinuousFCV];
function testMovePrimary(db) {
const dbName = db.getName();
// The following pipeline update modifies the config.databases entry to simulate its database
// version field order as having come from running {setFeatureCompatibility: "5.0"} as part of
// upgrading from MongoDB 4.4. See SERVER-68511 for more details of the original issue.
mongos.getDB("config").databases.update({_id: dbName}, [
{
$replaceWith: {
$mergeObjects: [
"$$ROOT",
{
version: {
uuid: "$version.uuid",
lastMod: "$version.lastMod",
timestamp: "$version.timestamp",
},
},
],
},
},
]);
const currentPrimary = mongos.getDB("config").databases.findOne({_id: dbName}).primary;
const newPrimary = currentPrimary == shard0 ? shard1 : shard0;
assert.eq(db.coll.countDocuments({}), 1);
assert.commandWorked(mongos.adminCommand({movePrimary: dbName, to: newPrimary}));
assert.eq(newPrimary, mongos.getDB("config").databases.findOne({_id: dbName}).primary);
assert.eq(db.coll.countDocuments({}), 1);
}
for (let i = 0; i < fcvValues.length; i++) {
// Latest FCV
assert.commandWorked(mongos.adminCommand({setFeatureCompatibilityVersion: latestFCV, confirm: true}));
// Create database `createdBeforeDowngrading` under latest FCV
assert.commandWorked(mongos.adminCommand({enableSharding: kBeforeDowngradingDbName, primaryShard: shard0}));
assert.commandWorked(createdBeforeDowngradingDB.coll.insert({_id: "foo"}));
// Downgrade FCV
assert.commandWorked(mongos.adminCommand({setFeatureCompatibilityVersion: fcvValues[i], confirm: true}));
// Make sure movePrimary works for `createdBeforeDowngrading`
testMovePrimary(createdBeforeDowngradingDB);
// Create database `createdBeforeUpgrading` under downgraded FCV
assert.commandWorked(mongos.adminCommand({enableSharding: kBeforeUpgradingDbName, primaryShard: shard0}));
assert.commandWorked(createdBeforeUpgradingDB.coll.insert({_id: "foo"}));
// Upgrade FCV
assert.commandWorked(mongos.adminCommand({setFeatureCompatibilityVersion: latestFCV, confirm: true}));
// Make sure movePrimary works (again) for `createdBeforeDowngrading`
testMovePrimary(createdBeforeDowngradingDB);
// Make sure movePrimary works for `createdBeforeUpgrading`
testMovePrimary(createdBeforeUpgradingDB);
// Drop databases for next round
assert.commandWorked(createdBeforeDowngradingDB.dropDatabase());
assert.commandWorked(createdBeforeUpgradingDB.dropDatabase());
}
st.stop();