summaryrefslogtreecommitdiff
path: root/jstests/serverless/shard_split_apply_splitconfig.js
blob: 5527fb613213fb0594f430e900e4aceafd43f4eb (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
load("jstests/libs/fail_point_util.js");         // for "configureFailPoint"
load('jstests/libs/parallel_shell_helpers.js');  // for "startParallelShell"
load("jstests/serverless/libs/basic_serverless_test.js");

function populateRecipientMembers(splitConfig) {
    return splitConfig.members.filter(m => m._id >= 3).map((member, idx) => {
        member._id = idx;
        member.votes = 1;
        member.priority = 1;
        member.hidden = false;
        return member;
    });
}

function runReconfigToSplitConfig() {
    "use strict";

    const kRecipientSetName = "receiveSet";

    jsTestLog("Starting serverless");
    const test =
        new BasicServerlessTest({recipientTagName: "recipientNode", recipientSetName: "recipient"});

    jsTestLog("Adding recipient nodes");
    test.addRecipientNodes();

    test.donor.awaitSecondaryNodes();

    jsTestLog("Reconfigure the donor to apply a `splitConfig`");
    const config = test.donor.getReplSetConfigFromNode();
    const splitConfig = Object.extend({}, config, /* deepCopy */ true);
    splitConfig._id = kRecipientSetName;
    splitConfig.version++;
    splitConfig.members = populateRecipientMembers(splitConfig);

    // TODO: possible future validation in replSetReconfig command?
    delete splitConfig.settings.replicaSetId;

    const configWithSplitConfig = Object.extend({}, config, /* deepCopy */ true);
    configWithSplitConfig.version++;
    configWithSplitConfig.recipientConfig = splitConfig;
    configWithSplitConfig.members = configWithSplitConfig.members.filter(m => m._id < 3);

    jsTestLog("Applying the split config, and waiting for it to propagate to recipient");
    const admin = test.donor.getPrimary().getDB("admin");
    assert.commandWorked(admin.runCommand({replSetReconfig: configWithSplitConfig}));
    assert.soon(() => {
        const recipientNode = test.recipientNodes[0];
        const status =
            assert.commandWorked(recipientNode.getDB('admin').runCommand({replSetGetStatus: 1}));
        return status.set === kRecipientSetName;
    }, "waiting for split config to take", 30000, 2000);

    jsTestLog("Confirming we can write to recipient");
    let recipientPrimary = undefined;
    assert.soon(function() {
        recipientPrimary = test.recipientNodes.find(node => {
            const n = node.adminCommand('hello');
            return n.isWritablePrimary || n.ismaster;
        });
        return recipientPrimary != undefined;
    }, "waiting for primary to be available", 30000, 1000);

    assert(recipientPrimary);
    assert.commandWorked(recipientPrimary.getDB('foo').bar.insert({fake: 'document'}));

    test.stop();
}

runReconfigToSplitConfig();