This is just a cleanup work to hide some of the private state of ReplSetTest so it is easier to encapsulate and add new logic. Also enables strict mode.
66 lines
2.2 KiB
JavaScript
66 lines
2.2 KiB
JavaScript
// Tests tracking of latestOptime and earliestOptime in serverStatus.oplog
|
|
|
|
function timestampCompare(o1, o2) {
|
|
if (o1.t < o2.t) {
|
|
return -1;
|
|
} else if (o1.t > o2.t) {
|
|
return 1;
|
|
} else {
|
|
if (o1.i < o2.i) {
|
|
return -1;
|
|
} else if (o1.i > o2.i) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
function optimesAreEqual(replTest) {
|
|
var prevStatus = replTest.nodes[0].getDB('admin').serverStatus({oplog:true}).oplog;
|
|
for (var i = 1; i < replTest.nodes.length; i++) {
|
|
var status = replTest.nodes[i].getDB('admin').serverStatus({oplog:true}).oplog;
|
|
if (timestampCompare(prevStatus.latestOptime, status.latestOptime) != 0) {
|
|
return false;
|
|
}
|
|
prevStatus = status;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
var replTest = new ReplSetTest( { name : "replStatus" , nodes: 3, oplogSize: 1 } );
|
|
|
|
replTest.startSet();
|
|
replTest.initiate();
|
|
var master = replTest.getPrimary();
|
|
replTest.awaitReplication();
|
|
replTest.awaitSecondaryNodes();
|
|
|
|
// Check initial optimes
|
|
assert(optimesAreEqual(replTest));
|
|
var initialInfo = master.getDB('admin').serverStatus({oplog:true}).oplog;
|
|
|
|
// Do an insert to increment optime, but without rolling the oplog
|
|
// latestOptime should be updated, but earliestOptime should be unchanged
|
|
var options = { writeConcern: { w: replTest.nodes.length }};
|
|
assert.writeOK(master.getDB('test').foo.insert({ a: 1 }, options));
|
|
assert(optimesAreEqual(replTest));
|
|
|
|
var info = master.getDB('admin').serverStatus({oplog:true}).oplog;
|
|
assert.gt(timestampCompare(info.latestOptime, initialInfo.latestOptime), 0);
|
|
assert.eq(timestampCompare(info.earliestOptime, initialInfo.earliestOptime), 0);
|
|
|
|
// Insert some large documents to force the oplog to roll over
|
|
var largeString = new Array(1024*10).toString();
|
|
for (var i = 0; i < 2000; i++) {
|
|
master.getDB('test').foo.insert({ largeString: largeString }, options);
|
|
}
|
|
assert.soon(function() { return optimesAreEqual(replTest); } );
|
|
|
|
// Test that earliestOptime was updated
|
|
info = master.getDB('admin').serverStatus({oplog:true}).oplog;
|
|
assert.gt(timestampCompare(info.latestOptime, initialInfo.latestOptime), 0);
|
|
assert.gt(timestampCompare(info.earliestOptime, initialInfo.earliestOptime), 0);
|
|
|
|
replTest.stopSet();
|