summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2014-12-16 08:29:51 -0500
committermatt dannenberg <matt.dannenberg@10gen.com>2014-12-17 08:34:13 -0500
commit4f329663c1908d90a73c69e8223520e5aecc8608 (patch)
tree772d9d39227f1aef641951f96569206b1f405517
parentc5ebc6be8e3a865655acbc5ecd1cb3b96fdf44ff (diff)
downloadmongo-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.js19
-rw-r--r--src/mongo/db/repl/repl_coordinator_impl_heartbeat.cpp4
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,