diff options
author | matt dannenberg <matt.dannenberg@10gen.com> | 2014-12-16 08:29:51 -0500 |
---|---|---|
committer | matt dannenberg <matt.dannenberg@10gen.com> | 2014-12-17 08:34:13 -0500 |
commit | 4f329663c1908d90a73c69e8223520e5aecc8608 (patch) | |
tree | 772d9d39227f1aef641951f96569206b1f405517 | |
parent | c5ebc6be8e3a865655acbc5ecd1cb3b96fdf44ff (diff) | |
download | mongo-4f329663c1908d90a73c69e8223520e5aecc8608.tar.gz |
SERVER-16569 do not update the replication progress map when receiving a heartbeat from primary
-rw-r--r-- | jstests/multiVersion/w_majority_change.js | 19 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_impl_heartbeat.cpp | 4 |
2 files changed, 22 insertions, 1 deletions
diff --git a/jstests/multiVersion/w_majority_change.js b/jstests/multiVersion/w_majority_change.js index 12ded450c6a..e0f79084c56 100644 --- a/jstests/multiVersion/w_majority_change.js +++ b/jstests/multiVersion/w_majority_change.js @@ -41,12 +41,15 @@ load("jstests/replsets/rslib.js"); // w: majority on node 0 (2.8) will need both voting, non-arbiter nodes in this configuration // take down one voting, non-arbiter node. fails because we are missing a voter replTest.stop(2); + replTest.waitForState(nodes[2], replTest.DOWN); assert.writeError(primary.getDB(name).foo.insert({x: 1}, writeConcern)); // bring it back replTest.restart(2); + replTest.waitForState(nodes[2], replTest.SECONDARY); assert.writeOK(primary.getDB(name).foo.insert({x: 2}, writeConcern)); // take down one non-voting, non-arbiter node. passes because the non-voter does not matter replTest.stop(1); + replTest.waitForState(nodes[1], replTest.DOWN); assert.writeOK(primary.getDB(name).foo.insert({x: 3}, writeConcern)); replTest.restart(1); replTest.waitForState(nodes[1], replTest.SECONDARY); @@ -64,12 +67,15 @@ load("jstests/replsets/rslib.js"); // w: majority on 2.6 will need all non-arbiter nodes in this configuration // take down one voting, non-arbiter node. fails because all nodes are needed replTest.stop(0); + replTest.waitForState(nodes[0], replTest.DOWN); assert.writeError(primary.getDB(name).foo.insert({x: 4}, writeConcern)); // bring it back replTest.restart(0); + replTest.waitForState(nodes[0], replTest.SECONDARY); assert.writeOK(primary.getDB(name).foo.insert({x: 5}, writeConcern)); // take down one non-voting, non-arbiter node. fails because all nodes are needed replTest.stop(1); + replTest.waitForState(nodes[1], replTest.DOWN); assert.writeError(primary.getDB(name).foo.insert({x: 6}, writeConcern)); replTest.stopSet(); @@ -108,21 +114,29 @@ load("jstests/replsets/rslib.js"); // take down both non-voting nodes. passes because non-voting nodes do not matter replTest.stop(5); replTest.stop(4); + replTest.waitForState(nodes[4], replTest.DOWN); + replTest.waitForState(nodes[5], replTest.DOWN); assert.writeOK(primary.getDB(name).foo.insert({x: 7}, writeConcern)); // take down one voting node. passes because we still have sufficient voting nodes replTest.stop(3); + replTest.waitForState(nodes[3], replTest.DOWN); assert.writeOK(primary.getDB(name).foo.insert({x: 8}, writeConcern)); // take down another voting node. fails because we have insufficient voting nodes replTest.stop(2); + replTest.waitForState(nodes[2], replTest.DOWN); assert.writeError(primary.getDB(name).foo.insert({x: 9}, writeConcern)); // bring back both non-voting nodes. fails because non-voters still do not matter replTest.restart(5); replTest.restart(4); + replTest.waitForState(nodes[4], replTest.SECONDARY); + replTest.waitForState(nodes[5], replTest.SECONDARY); assert.writeError(primary.getDB(name).foo.insert({x: 10}, writeConcern)); // bring back a voting node. passes because we have sufficient voting nodes replTest.restart(3); + replTest.waitForState(nodes[3], replTest.SECONDARY); assert.writeOK(primary.getDB(name).foo.insert({x: 11}, writeConcern)); replTest.restart(2); + replTest.waitForState(nodes[2], replTest.SECONDARY); // reconfig such that a 2.6 node (node 2) will be primary @@ -139,6 +153,8 @@ load("jstests/replsets/rslib.js"); // take down both non-voting nodes. passes because there are still sufficient nodes replTest.stop(5); replTest.stop(4); + replTest.waitForState(nodes[4], replTest.DOWN); + replTest.waitForState(nodes[5], replTest.DOWN); assert.writeOK(primary.getDB(name).foo.insert({x: 12}, writeConcern)); // take down one voting node. fails because there are insufficient nodes replTest.stop(3); @@ -149,6 +165,9 @@ load("jstests/replsets/rslib.js"); replTest.restart(5); replTest.restart(4); replTest.stop(1); + replTest.waitForState(nodes[4], replTest.SECONDARY); + replTest.waitForState(nodes[5], replTest.SECONDARY); + replTest.waitForState(nodes[1], replTest.DOWN); assert.writeOK(primary.getDB(name).foo.insert({x: 15}, writeConcern)); replTest.stopSet(); diff --git a/src/mongo/db/repl/repl_coordinator_impl_heartbeat.cpp b/src/mongo/db/repl/repl_coordinator_impl_heartbeat.cpp index ca70762bd9b..57c61401ddd 100644 --- a/src/mongo/db/repl/repl_coordinator_impl_heartbeat.cpp +++ b/src/mongo/db/repl/repl_coordinator_impl_heartbeat.cpp @@ -156,7 +156,9 @@ namespace { if (action.getAction() == HeartbeatResponseAction::NoAction && hbStatusResponse.isOK() && hbStatusResponse.getValue().hasOpTime() && - targetIndex >= 0) { + targetIndex >= 0 && + hbStatusResponse.getValue().hasState() && + hbStatusResponse.getValue().getState() != MemberState::RS_PRIMARY) { boost::lock_guard<boost::mutex> lk(_mutex); if (hbStatusResponse.getValue().getVersion() == _rsConfig.getConfigVersion()) { _updateOpTimeFromHeartbeat_inlock(targetIndex, |