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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
load("jstests/replsets/rslib.js");
doTest = function(signal) {
var name = "slaveDelay";
var host = getHostName();
var replTest = new ReplSetTest({name: name, nodes: 3});
var nodes = replTest.startSet();
/* set slaveDelay to 30 seconds */
var config = replTest.getReplSetConfig();
config.members[2].priority = 0;
config.members[2].slaveDelay = 30;
replTest.initiate(config);
var master = replTest.getPrimary().getDB(name);
var slaveConns = replTest._slaves;
var slaves = [];
for (var i in slaveConns) {
var d = slaveConns[i].getDB(name);
slaves.push(d);
}
waitForAllMembers(master);
// insert a record
assert.commandWorked(master.foo.insert({x: 1}, {writeConcern: {w: 2}}));
var doc = master.foo.findOne();
assert.eq(doc.x, 1);
// make sure slave has it
var doc = slaves[0].foo.findOne();
assert.eq(doc.x, 1);
// make sure delayed slave doesn't have it
for (var i = 0; i < 8; i++) {
assert.eq(slaves[1].foo.findOne(), null);
sleep(1000);
}
// within 120 seconds delayed slave should have it
assert.soon(function() {
var z = slaves[1].foo.findOne();
return z && z.x == 1;
}, 'waiting for inserted document ' + tojson(doc) + ' on delayed slave', 120 * 1000);
/************* Part 2 *******************/
// how about if we add a new server? will it sync correctly?
conn = replTest.add();
config = master.getSiblingDB("local").system.replset.findOne();
printjson(config);
config.version++;
config.members.push({
_id: 3,
host: host + ":" + replTest.ports[replTest.ports.length - 1],
priority: 0,
slaveDelay: 30
});
master = reconfig(replTest, config);
master = master.getSiblingDB(name);
assert.commandWorked(master.foo.insert(
{_id: 123, x: 'foo'}, {writeConcern: {w: 2, wtimeout: ReplSetTest.kDefaultTimeoutMS}}));
for (var i = 0; i < 8; i++) {
assert.eq(conn.getDB(name).foo.findOne({_id: 123}), null);
sleep(1000);
}
assert.soon(function() {
var z = conn.getDB(name).foo.findOne({_id: 123});
return z != null && z.x == "foo";
});
/************* Part 3 ******************/
print("reconfigure slavedelay");
config.version++;
config.members[3].slaveDelay = 15;
reconfig(replTest, config);
master = replTest.getPrimary().getDB(name);
assert.soon(function() {
return conn.getDB("local").system.replset.findOne().version == config.version;
});
// wait for node to become secondary
assert.soon(function() {
var result = conn.getDB("admin").isMaster();
printjson(result);
return result.secondary;
});
print("testing insert");
master.foo.insert({_id: 124, "x": "foo"});
assert(master.foo.findOne({_id: 124}) != null);
for (var i = 0; i < 10; i++) {
assert.eq(conn.getDB(name).foo.findOne({_id: 124}), null);
sleep(1000);
}
assert.soon(function() {
return conn.getDB(name).foo.findOne({_id: 124}) != null;
}, "findOne should complete within default timeout");
replTest.stopSet();
};
doTest(15);
|