/** * 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 (var 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({setFeatureCompatibilityVersion: latestFCV, confirm: true})); 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();