// FAILING TEST // replication is not rolled back function pause(s) { // for debugging just to keep processes running print(s); if (0) { while (1) { print(s); sleep(4000); } } } doTest = function (signal) { var replTest = new ReplSetTest({ name: 'testSet', nodes: 3 }); var nodes = replTest.startSet({ oplogSize: "40" }); sleep(5000); replTest.initiate(); // get master var master = replTest.getMaster(); var dbs = [master.getDB("foo")]; for (var i in nodes) { if (nodes[i] + "" == master + "") { continue; } dbs.push(nodes[i].getDB("foo")); nodes[i].setSlaveOk(); } dbs[0].bar.drop(); // slow things down a bit dbs[0].bar.ensureIndex({ x: 1 }); dbs[0].bar.ensureIndex({ y: 1 }); dbs[0].bar.ensureIndex({ z: 1 }); dbs[0].bar.ensureIndex({ w: 1 }); var ok = false; var inserts = 100000; for (var i = 0; i < inserts; i++) { dbs[0].bar.insert({ x: "foo" + i, y: "bar" + i, z: i, w: "biz baz bar boo" }); } dbs[0].getSisterDB("admin").runCommand({ replSetTest: 1, blind: true }); // yay! there are out-of-date nodes var max1 = dbs[1].bar.find().sort({ z: -1 }).limit(1).next(); var max2 = dbs[2].bar.find().sort({ z: -1 }).limit(1).next(); if (max1.z == inserts && max2.z == inserts) { print("try increasing # if inserts and running again"); replTest.stopSet(signal); return; } // wait for a new master to be elected sleep(5000); // figure out who is master now var newMaster = replTest.getMaster(); print("**********************************************"); assert(newMaster + "" != master + "", "new master is " + newMaster + ", old master was " + master); print("new master is " + newMaster + ", old master was " + master); var count = 0; do { max1 = dbs[1].bar.find().sort({ z: -1 }).limit(1).next(); max2 = dbs[2].bar.find().sort({ z: -1 }).limit(1).next(); print(count + " sync1.js: WAITING FOR MATCH " + Date() + " z[1]:" + max1.z + " z[2]:" + max2.z); // printjson(max1); // printjson(max2); sleep(2000); count++; if (count == 100) { pause("fail phase 1"); assert(false, "replsets/sync1.js fails timing out"); replTest.stopSet(signal); return; } } while (max1.z != max2.z); // okay, now they're caught up. We have a max: var max = max1.z; // now, let's see if rollback works var result = dbs[0].getSisterDB("admin").runCommand({ replSetTest: 1, blind: false }); dbs[0].getMongo().setSlaveOk(); printjson(result); sleep(5000); // FAIL! This never resyncs // now this should resync var max0; count = 0; do { max0 = dbs[0].bar.find().sort({ z: -1 }).limit(1).next(); print(count + " sync1.js: WAITING FOR MATCH " + Date() + " z[0]:" + max0.z + " z:" + max); sleep(2000); count++; if (count == 100) { pause("fail phase 2"); assert(false, "replsets/sync1.js fails timing out"); replTest.stopSet(signal); return; } } while (max0.z != max); pause("success"); replTest.stopSet(signal); } //doTest( 15 );