//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();

}


