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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
print("\nstepdown2.js");
var replTest = new ReplSetTest({ name: 'testSet', nodes: 2 });
var nodes = replTest.startSet();
replTest.initiate();
var master = replTest.getMaster();
// do a write
print("\ndo a write");
master.getDB("foo").bar.insert({x:1});
replTest.awaitReplication();
// lock secondary
print("\nlock secondary");
var locked = replTest.liveNodes.slaves[0];
printjson( locked.getDB("admin").runCommand({fsync : 1, lock : 1}) );
print("\nwaiting 11ish seconds");
sleep(3003);
for (var i = 0; i < 11; i++) {
// do another write
master.getDB("foo").bar.insert({x:i});
sleep(1008);
}
print("\n do stepdown that should not work");
// this should fail, so we don't need to try/catch
var result = master.getDB("admin").runCommand({replSetStepDown: 10});
printjson(result);
assert.eq(result.ok, 0);
print("\n do stepdown that should work");
try {
master.getDB("admin").runCommand({replSetStepDown: 50, force : true});
}
catch (e) {
print(e);
}
var r2 = master.getDB("admin").runCommand({ismaster : 1});
assert.eq(r2.ismaster, false);
assert.eq(r2.secondary, true);
print("\nunlock");
printjson(locked.getDB("admin").$cmd.sys.unlock.findOne());
print("\nreset stepped down time");
master.getDB("admin").runCommand({replSetFreeze:0});
master = replTest.getMaster();
print("\nmake 1 config with priorities");
var config = master.getDB("local").system.replset.findOne();
print("\nmake 2");
config.version++;
config.members[0].priority = 2;
config.members[1].priority = 1;
// make sure 1 can stay master once 0 is down
config.members[0].votes = 0;
try {
master.getDB("admin").runCommand({replSetReconfig : config});
}
catch (e) {
print(e);
}
print("\nawait");
replTest.awaitReplication();
master = replTest.getMaster();
var firstMaster = master;
print("\nmaster is now "+firstMaster);
try {
printjson(master.getDB("admin").runCommand({replSetStepDown : 100, force : true}));
}
catch (e) {
print(e);
}
print("\nget a master");
replTest.getMaster();
assert.soon(function() {
var secondMaster = replTest.getMaster();
return firstMaster+"" != secondMaster+"";
}, 'making sure '+firstMaster+' isn\'t still master', 60000);
print("\ncheck shutdown command");
master = replTest.liveNodes.master;
var slave = replTest.liveNodes.slaves[0];
var slaveId = replTest.getNodeId(slave);
try {
slave.adminCommand({shutdown :1})
}
catch (e) {
print(e);
}
print("\nsleeping");
sleep(2000);
print("\nrunning shutdown without force on master: "+master);
result = replTest.getMaster().getDB("admin").runCommand({shutdown : 1, timeoutSecs : 3});
assert.eq(result.ok, 0);
print("\nsend shutdown command");
var currentMaster = replTest.getMaster();
try {
printjson(currentMaster.getDB("admin").runCommand({shutdown : 1, force : true}));
}
catch (e) {
print(e);
}
print("checking "+currentMaster+" is actually shutting down");
assert.soon(function() {
try {
currentMaster.findOne();
}
catch(e) {
return true;
}
return false;
});
print("\nOK 1 stepdown2.js");
replTest.stopSet();
print("\nOK 2 stepdown2.js");
|