diff options
Diffstat (limited to 'jstests/replsets/stepdown2.js')
-rwxr-xr-x | jstests/replsets/stepdown2.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/jstests/replsets/stepdown2.js b/jstests/replsets/stepdown2.js new file mode 100755 index 0000000..591fea2 --- /dev/null +++ b/jstests/replsets/stepdown2.js @@ -0,0 +1,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"); |