0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 01:21:03 +01:00
mongodb/jstests/replsets/rollback.js
2010-08-13 18:16:03 -04:00

155 lines
4.4 KiB
JavaScript

// test rollback in replica sets
// try running as :
//
// mongo --nodb rollback.js | tee out | grep -v ^m31
//
var debugging = 0;
function pause(s) {
print(s);
while (debugging) {
sleep(3000);
print(s);
}
}
function deb(obj) {
if( debugging ) {
print("\n\n\n" + obj + "\n\n");
}
}
w = 0;
function wait(f) {
w++;
var n = 0;
while (!f()) {
if( n % 4 == 0 )
print("waiting " + w);
if (++n == 4) {
print("" + f);
}
sleep(1000);
}
}
doTest = function (signal) {
var replTest = new ReplSetTest({ name: 'unicomplex', nodes: 3 });
var nodes = replTest.nodeList();
//print(tojson(nodes));
var conns = replTest.startSet();
var r = replTest.initiate({ "_id": "unicomplex",
"members": [
{ "_id": 0, "host": nodes[0] },
{ "_id": 1, "host": nodes[1] },
{ "_id": 2, "host": nodes[2], arbiterOnly: true}]
});
// Make sure we have a master
var master = replTest.getMaster();
a_conn = conns[0];
A = a_conn.getDB("admin");
b_conn = conns[1];
a_conn.setSlaveOk();
b_conn.setSlaveOk();
B = b_conn.getDB("admin");
assert(master == conns[0], "conns[0] assumed to be master");
assert(a_conn == master);
//deb(master);
// Make sure we have an arbiter
assert.soon(function () {
res = conns[2].getDB("admin").runCommand({ replSetGetStatus: 1 });
return res.myState == 7;
}, "Arbiter failed to initialize.");
// Wait for initial replication
var a = a_conn.getDB("foo");
var b = b_conn.getDB("foo");
/* force the oplog to roll */
if (new Date() % 2 == 0) {
print("ROLLING OPLOG AS PART OF TEST (we only do this sometimes)");
var pass = 1;
var first = a.getSisterDB("local").oplog.rs.find().sort({ $natural: 1 }).limit(1)[0];
a.roll.insert({ x: 1 });
while (1) {
for (var i = 0; i < 10000; i++)
a.roll.update({}, { $inc: { x: 1} });
var op = a.getSisterDB("local").oplog.rs.find().sort({ $natural: 1 }).limit(1)[0];
if (tojson(op.h) != tojson(first.h)) {
printjson(op);
printjson(first);
break;
}
pass++;
a.getLastError(2); // unlikely secondary isn't keeping up, but let's avoid possible intermittent issues with that.
}
print("PASSES FOR OPLOG ROLL: " + pass);
}
else {
print("NO ROLL");
}
a.bar.insert({ q: 1, a: "foo" });
a.bar.insert({ q: 2, a: "foo", x: 1 });
a.bar.insert({ q: 3, bb: 9, a: "foo" });
assert(a.bar.count() == 3, "t.count");
// wait for secondary to get this data
wait(function () { return b.bar.count() == 3; });
A.runCommand({ replSetTest: 1, blind: true });
wait(function () { return B.isMaster().ismaster; });
b.bar.insert({ q: 4 });
b.bar.insert({ q: 5 });
b.bar.insert({ q: 6 });
assert(b.bar.count() == 6, "u.count");
// a should not have the new data as it was in blind state.
B.runCommand({ replSetTest: 1, blind: true });
A.runCommand({ replSetTest: 1, blind: false });
wait(function () { return !B.isMaster().ismaster; });
wait(function () { return A.isMaster().ismaster; });
assert(a.bar.count() == 3, "t is 3");
a.bar.insert({ q: 7 });
a.bar.insert({ q: 8 });
{
assert(a.bar.count() == 5);
var x = a.bar.find().toArray();
assert(x[0].q == 1, '1');
assert(x[1].q == 2, '2');
assert(x[2].q == 3, '3');
assert(x[3].q == 7, '7');
assert(x[4].q == 8, '8');
}
// A is 1 2 3 7 8
// B is 1 2 3 4 5 6
// bring B back online
B.runCommand({ replSetTest: 1, blind: false });
wait(function () { return B.isMaster().ismaster || B.isMaster().secondary; });
// everyone is up here...
assert(A.isMaster().ismaster || A.isMaster().secondary, "A up");
assert(B.isMaster().ismaster || B.isMaster().secondary, "B up");
friendlyEqual(a.bar.find().sort({ _id: 1 }).toArray(), b.bar.find().sort({ _id: 1 }).toArray(), "server data sets do not match");
pause("SUCCESS");
replTest.stopSet(signal);
}
doTest( 15 );