Files
mongo/jstests/replsets/rollback4.js

124 lines
3.2 KiB
JavaScript

//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');
assert.writeOK(mColl.insert({}, { writeConcern: { w: 7, wtimeout: 30*1000 }}));
printjson(master.adminCommand("replSetGetStatus"));
// 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){
res = mColl.insert({}, { writeConcern: { w: 3 }});
if (res.hasWriteErrors())
break;
gotThrough++;
}
}
catch (e) {
print("caught exception: " + tojson(e));
}
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
assert.writeOK(m2Coll.insert(sentinel, { writeConcern: { 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()});
assert.soon(function() {
try {
m2Coll.insert({}, { writeConcern: { w: 7, wtimeout: 10*1000 }});
return true;
}
catch (e) {
print("getLastError returned an exception; retrying: " + tojson(e));
return false;
}
});
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();
}