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