// Test a large rollback SERVER-2737

var replTest = new ReplSetTest({ name: 'unicomplex', 
                                 nodes: 3, 
                                 oplogSize: 2000
                              });
var nodes = replTest.nodeList();

var conns = replTest.startSet();
var r = replTest.initiate({ "_id": "unicomplex",
                          "members": [
                                      { "_id": 0, "host": nodes[0], priority: 2 },
                                      { "_id": 1, "host": nodes[1] },
                                      { "_id": 2, "host": nodes[2], arbiterOnly: true}]
                          }, 'replSetInitiate', 600000);

replTest.waitForState(replTest.nodes[0], replTest.PRIMARY, 60 * 1000);
// Make sure we have a master
var master = replTest.getMaster();
var b_conn = conns[1];
b_conn.setSlaveOk();
var B = b_conn.getDB("admin");

// Make sure we have an arbiter
replTest.waitForState(conns[2], replTest.ARBITER, 10000);

// Wait for initial replication
replTest.awaitReplication();

// Insert into master
var big = { b:new Array( 1000 ).toString() };
var bulk = master.getDB('db').c.initializeUnorderedBulkOp();
for( var i = 0; i < 1000000; ++i ) {
    bulk.insert( big );
}
assert.writeOK(bulk.execute());

// Stop master
replTest.stop( 0 );

// Wait for slave to take over
// This can take a while if the secondary has queued up many writes in its
// buffer, since it needs to flush those out before it can assume the primaryship.
//
// In the legacy replication implementation (through 2.7.7), this waiting takes place before the
// node reports that it is primary, while in the refactored implementation (2.7.8+) it takes place
// after the node reports that it is primary via heartbeats, but before ismaster indicates that the
// node will accept writes.
replTest.waitForState(conns[1], replTest.PRIMARY, 5 * 60 * 1000);
master = replTest.getMaster(5 * 60 * 1000);

// Save to new master, forcing rollback of old master
master.getDB( 'db' ).c.save( big );

// Restart old master
replTest.restart( 0 );
// Wait five minutes to ensure there is enough time for rollback
replTest.awaitReplication(5*60*1000);
