summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2015-11-16 09:57:44 -0500
committerBenety Goh <benety@mongodb.com>2015-11-16 09:57:44 -0500
commit00ab207234ebe0139f3b4d597027254c76a0a4c8 (patch)
tree64f91543d3405d095b8ebc474404b7e2c5c01610
parent7790034b4b1cba68d44a8df920edd64cc05ccdd9 (diff)
downloadmongo-00ab207234ebe0139f3b4d597027254c76a0a4c8.tar.gz
SERVER-21452 hearbeat response from secondary should not schedule a priority takeover
-rw-r--r--src/mongo/db/repl/topology_coordinator_impl.cpp3
-rw-r--r--src/mongo/db/repl/topology_coordinator_impl_v1_test.cpp10
2 files changed, 12 insertions, 1 deletions
diff --git a/src/mongo/db/repl/topology_coordinator_impl.cpp b/src/mongo/db/repl/topology_coordinator_impl.cpp
index 40e36edc9ba..0808aa91153 100644
--- a/src/mongo/db/repl/topology_coordinator_impl.cpp
+++ b/src/mongo/db/repl/topology_coordinator_impl.cpp
@@ -1081,9 +1081,10 @@ HeartbeatResponseAction TopologyCoordinatorImpl::_updatePrimaryFromHBDataV1(
// Priority takeover when the replset is stable.
//
// Take over the primary only if the remote primary is in the latest term I know.
+ // This is done only when we get a heartbeat response from the primary.
// Otherwise, there must be an outstanding election, which may succeed or not, but
// the remote primary will become aware of that election eventually and step down.
- if (_hbdata[primaryIndex].getTerm() == _term &&
+ if (_hbdata[primaryIndex].getTerm() == _term && updatedConfigIndex == primaryIndex &&
_rsConfig.getMemberAt(primaryIndex).getPriority() <
_rsConfig.getMemberAt(_selfIndex).getPriority()) {
LOG(4) << "I can take over the primary due to higher priority."
diff --git a/src/mongo/db/repl/topology_coordinator_impl_v1_test.cpp b/src/mongo/db/repl/topology_coordinator_impl_v1_test.cpp
index 32e258ee2b0..10dcad1ad5f 100644
--- a/src/mongo/db/repl/topology_coordinator_impl_v1_test.cpp
+++ b/src/mongo/db/repl/topology_coordinator_impl_v1_test.cpp
@@ -2757,6 +2757,16 @@ TEST_F(HeartbeatResponseTestV1, UpdateHeartbeatDataTermPreventsPriorityTakeover)
ASSERT_EQUALS(HeartbeatResponseAction::PriorityTakeover, nextAction.getAction());
ASSERT_EQUALS(2, getCurrentPrimaryIndex());
+ // Heartbeat from a secondary node shouldn't schedule a priority takeover.
+ nextAction = receiveUpHeartbeat(HostAndPort("host1"),
+ "rs0",
+ MemberState::RS_SECONDARY,
+ election,
+ election,
+ lastOpTimeApplied);
+ ASSERT_NO_ACTION(nextAction.getAction());
+ ASSERT_EQUALS(2, getCurrentPrimaryIndex());
+
now()++;
// Host 1 starts an election due to higher priority by sending vote requests.
// Vote request updates my term.