diff options
author | matt dannenberg <matt.dannenberg@10gen.com> | 2015-11-02 09:01:02 -0500 |
---|---|---|
committer | matt dannenberg <matt.dannenberg@10gen.com> | 2015-11-02 14:29:21 -0500 |
commit | 42d0577042dbc4b63e54eb40765c052baafed555 (patch) | |
tree | 935d545c3f6f89bdeee2adfa732570a426b41b33 | |
parent | 70c5435a48b5a8e8c6559371b1136ecdca0d49ae (diff) | |
download | mongo-42d0577042dbc4b63e54eb40765c052baafed555.tar.gz |
SERVER-21237 fix ReplSetTest.prototype.awaitReplication to use getReplSetStatus rather than query the oplog directly
-rw-r--r-- | jstests/replsets/remove1.js | 3 | ||||
-rw-r--r-- | src/mongo/shell/replsettest.js | 78 |
2 files changed, 36 insertions, 45 deletions
diff --git a/jstests/replsets/remove1.js b/jstests/replsets/remove1.js index b70de7c257d..745cf3de7f0 100644 --- a/jstests/replsets/remove1.js +++ b/jstests/replsets/remove1.js @@ -82,8 +82,7 @@ wait(function() { // master will likely step down (and close all connections) sometime after the reconfig if it // thinks the newly re-added secondary is down. So wait for that then reconnect the connection // we are using. - replTest.awaitReplication(); - reconnect(master); + master = replTest.getMaster(); printjson(master.getDB("admin").runCommand({replSetGetStatus:1})); master.setSlaveOk(); diff --git a/src/mongo/shell/replsettest.js b/src/mongo/shell/replsettest.js index 88fae5c84e9..8a844f105e9 100644 --- a/src/mongo/shell/replsettest.js +++ b/src/mongo/shell/replsettest.js @@ -514,13 +514,18 @@ ReplSetTest.prototype.reInitiate = function() { } } +ReplSetTest.prototype.getLastOpTime = function(conn) { + var replStatus = conn.getDB("admin").runCommand("replSetGetStatus"); + var myOpTime = replStatus.members.filter(m=>m.self)[0].optime; + return myOpTime.ts ? myOpTime.ts : myOpTime; +} + ReplSetTest.prototype.getLastOpTimeWritten = function() { - this.getMaster(); + var master = this.getMaster(); var self = this; assert.soon(function() { try { - var cursor = self.liveNodes.master.getDB("local")['oplog.rs'].find({}); - self.latest = cursor.sort({'$natural': -1}).limit(1).next()['ts']; + self.latest = self.getLastOpTime(master); } catch(e) { print("ReplSetTest caught exception " + e); @@ -589,24 +594,24 @@ ReplSetTest.prototype.awaitReplication = function(timeout) { // get the latest config version from master. if there is a problem, grab master and try again var configVersion; - var newestOplogEntry; + var masterOpTime; var masterName; try { var master = this.getMaster(); - configVersion = master.getDB("local")['system.replset'].findOne().version; - newestOplogEntry = master.getDB("local")['oplog.rs'].findOne(); + configVersion = this.conf().version; + masterOpTime = this.getLastOpTime(master); masterName = master.toString().substr(14); // strip "connection to " } catch (e) { var master = this.getMaster(); - configVersion = master.getDB("local")['system.replset'].findOne().version; - newestOplogEntry = master.getDB("local")['oplog.rs'].findOne(); + configVersion = this.conf().version; + masterOpTime = this.getLastOpTime(master); masterName = master.toString().substr(14); // strip "connection to " } print("ReplSetTest awaitReplication: starting: timestamp for primary, " + masterName + ", is " + tojson(this.latest) + - ", last oplog entry is " + tojsononeline(newestOplogEntry)); + ", last oplog entry is " + tojsononeline(masterOpTime)); var self = this; assert.soon(function() { @@ -629,12 +634,12 @@ ReplSetTest.prototype.awaitReplication = function(timeout) { if (slaveConfigVersion > configVersion) { var master = this.getMaster(); configVersion = master.getDB("local")['system.replset'].findOne().version; - newestOplogEntry = master.getDB("local")['oplog.rs'].findOne(); + masterOpTime = self.getLastOpTime(master); masterName = master.toString().substr(14); // strip "connection to " print("ReplSetTest awaitReplication: timestamp for primary, " + masterName + ", is " + tojson(this.latest) - + ", last oplog entry is " + tojsononeline(newestOplogEntry)); + + ", last oplog entry is " + tojsononeline(masterOpTime)); } return false; @@ -653,42 +658,29 @@ ReplSetTest.prototype.awaitReplication = function(timeout) { slave.getDB("admin").getMongo().setSlaveOk(); - var log = slave.getDB("local")['oplog.rs']; - if (log.find({}).sort({'$natural': -1}).limit(1).hasNext()) { - var entry = log.find({}).sort({'$natural': -1}).limit(1).next(); - var ts = entry['ts']; - if (self.latest.t < ts.t || - (self.latest.t == ts.t && self.latest.i < ts.i)) { - self.latest = self.liveNodes.master.getDB("local")['oplog.rs']. - find({}). - sort({'$natural': -1}). - limit(1). - next()['ts']; - print("ReplSetTest awaitReplication: timestamp for " + slaveName + - " is newer, resetting latest to " + tojson(self.latest)); - return false; - } - - if (!friendlyEqual(self.latest, ts)) { - print("ReplSetTest awaitReplication: timestamp for secondary #" + - secondaryCount + ", " + slaveName + ", is " + tojson(ts) + - " but latest is " + tojson(self.latest)); - print("ReplSetTest awaitReplication: last oplog entry (of " + - log.count() + ") for secondary #" + secondaryCount + - ", " + slaveName + ", is " + tojsononeline(entry)); - print("ReplSetTest awaitReplication: secondary #" + - secondaryCount + ", " + slaveName + ", is NOT synced"); - return false; - } + var ts = self.getLastOpTime(slave); + if (self.latest.t < ts.t || + (self.latest.t == ts.t && self.latest.i < ts.i)) { + self.latest = self.getLastOpTime(master); + print("ReplSetTest awaitReplication: timestamp for " + slaveName + + " is newer, resetting latest to " + tojson(self.latest)); + return false; + } + if (!friendlyEqual(self.latest, ts)) { + print("ReplSetTest awaitReplication: timestamp for secondary #" + + secondaryCount + ", " + slaveName + ", is " + tojson(ts) + + " but latest is " + tojson(self.latest)); + print("ReplSetTest awaitReplication: last oplog entry (of " + + log.count() + ") for secondary #" + secondaryCount + + ", " + slaveName + ", is " + tojsononeline(entry)); print("ReplSetTest awaitReplication: secondary #" + - secondaryCount + ", " + slaveName + ", is synced"); - } - else { - print("ReplSetTest awaitReplication: waiting for secondary #" + - secondaryCount + ", " + slaveName + ", to have an oplog built"); + secondaryCount + ", " + slaveName + ", is NOT synced"); return false; } + + print("ReplSetTest awaitReplication: secondary #" + + secondaryCount + ", " + slaveName + ", is synced"); } print("ReplSetTest awaitReplication: finished: all " + secondaryCount + |