diff options
Diffstat (limited to 'jstests/replsets/rollback4.js')
-rw-r--r-- | jstests/replsets/rollback4.js | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/jstests/replsets/rollback4.js b/jstests/replsets/rollback4.js new file mode 100644 index 0000000..5d3299b --- /dev/null +++ b/jstests/replsets/rollback4.js @@ -0,0 +1,117 @@ +//Test for SERVER-3650 (rollback from slave) +if (0) { // enable for SERVER-3772 + +var num = 7; +var host = getHostName(); +var name = "rollback4"; + +var replTest = new ReplSetTest( {name: name, nodes: num} ); +var config = replTest.getReplSetConfig(); + +// set preferred masters +config.members[0].priority = 3 +config.members[6].priority = 2 +// all other are 1 + +var nodes = replTest.startSet(); +replTest.initiate(config); +replTest.awaitReplication() +replTest.bridge(); + +replTest.waitForMaster(); +var master = replTest.getMaster(); +printjson(master.adminCommand("replSetGetStatus")); + +var mColl = master.getCollection('test.foo'); + +mColl.insert({}); +printjson(master.adminCommand("replSetGetStatus")); +printjson(master.adminCommand({getLastError:1, w:7, wtimeout:30*1000})); + +// partition 012 | 3456 with 0 and 6 the old and new master + + +printjson({startPartition: new Date()}); +replTest.partition(0,3) +replTest.partition(0,4) +replTest.partition(0,5) +replTest.partition(0,6) +replTest.partition(1,3) +replTest.partition(1,4) +replTest.partition(1,5) +replTest.partition(1,6) +replTest.partition(2,3) +replTest.partition(2,4) +replTest.partition(2,5) +replTest.partition(2,6) +printjson({endPartition: new Date()}); + +var gotThrough = 0 +try { + while (true){ + mColl.insert({}) + out = master.adminCommand({getLastError:1, w:3}); + if (out.err) + break; + + gotThrough++; + } +} +catch (e) { + print("caught exception"); +} + +printjson({gotThrough: gotThrough}); +printjson({cantWriteOldPrimary: new Date()}); +printjson(master.adminCommand("replSetGetStatus")); + +assert(gotThrough > 0, "gotOneThrough"); + +sleep(5*1000); // make sure new seconds field in opTime + +replTest.waitForMaster(); +var master2 = replTest.getMaster(); +printjson(master2.adminCommand("replSetGetStatus")); + +var m2Coll = master2.getCollection('test.foo'); + +var sentinel = {_id: 'sentinel'} // used to detect which master's data is used +m2Coll.insert(sentinel); +printjson(master2.adminCommand({getLastError:1, w:4, wtimeout:30*1000})); +printjson(master2.adminCommand("replSetGetStatus")); + +m2Coll.insert({}); // this shouldn't be necessary but the next GLE doesn't work without it + +printjson({startUnPartition: new Date()}); +replTest.unPartition(0,3) +replTest.unPartition(0,4) +replTest.unPartition(0,5) +replTest.unPartition(0,6) +replTest.unPartition(1,3) +replTest.unPartition(1,4) +replTest.unPartition(1,5) +replTest.unPartition(1,6) +replTest.unPartition(2,3) +replTest.unPartition(2,4) +replTest.unPartition(2,5) +replTest.unPartition(2,6) +printjson({endUnPartition: new Date()}); + +printjson(master2.adminCommand({getLastError:1, w:7, wtimeout:30*1000})); +printjson(master2.adminCommand("replSetGetStatus")); + +assert.soon(function() {return master.adminCommand('isMaster').ismaster}, + "Node 0 back to primary", + 60*1000/*needs to be longer than LeaseTime*/); +printjson(master.adminCommand("replSetGetStatus")); + +// make sure old master rolled back to new master +assert.eq(m2Coll.count(sentinel), 1, "check sentinal on node 6"); +assert.eq(mColl.count(sentinel), 1, "check sentinal on node 0"); + +replTest.stopSet(); + +} + + + |