summaryrefslogtreecommitdiff
path: root/jstests/multiVersion/genericSetFCVUsage/move_primary_setFCV.js
blob: 34eea8fedb9ef8dc6f045f371f19669cac6863c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
 * Test that `movePrimary` works for databases created under a different FCV
 */
(function() {

"use strict";

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}));

    // 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]}));

    // Make sure movePrimary works for `createdBeforeDowngrading`
    testMovePrimary(createdBeforeDowngradingDB);

    // Create database `createdBeforeUpgrading` under downgraded FCV
    assert.commandWorked(mongos.adminCommand({setFeatureCompatibilityVersion: latestFCV}));
    assert.commandWorked(
        mongos.adminCommand({enableSharding: kBeforeUpgradingDbName, primaryShard: shard0}));
    assert.commandWorked(createdBeforeUpgradingDB.coll.insert({_id: 'foo'}));

    // Upgrade FCV
    assert.commandWorked(mongos.adminCommand({setFeatureCompatibilityVersion: latestFCV}));

    // 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();
})();