summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/topology_coordinator_v1_test.cpp
diff options
context:
space:
mode:
authorSiyuan Zhou <siyuan.zhou@mongodb.com>2020-05-11 15:55:29 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-05-13 20:23:51 +0000
commit74cc45677605baf25cd57caa497e254883e88567 (patch)
tree711371ec22eb4f1e2b55534a819c14257a147357 /src/mongo/db/repl/topology_coordinator_v1_test.cpp
parent8a3c23aa1139c9835223ebecc583ef0e7fca9223 (diff)
downloadmongo-74cc45677605baf25cd57caa497e254883e88567.tar.gz
SERVER-48102 Update heartbeat state on primary even if heartbeat response includes a new config
Diffstat (limited to 'src/mongo/db/repl/topology_coordinator_v1_test.cpp')
-rw-r--r--src/mongo/db/repl/topology_coordinator_v1_test.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/mongo/db/repl/topology_coordinator_v1_test.cpp b/src/mongo/db/repl/topology_coordinator_v1_test.cpp
index fc370fbee11..fa7ffbd01a8 100644
--- a/src/mongo/db/repl/topology_coordinator_v1_test.cpp
+++ b/src/mongo/db/repl/topology_coordinator_v1_test.cpp
@@ -4356,6 +4356,46 @@ TEST_F(HeartbeatResponseReconfigTestV1, NodeAcceptsConfigIfVersionInHeartbeatRes
ASSERT_EQ(action.getAction(), HeartbeatResponseAction::Reconfig);
}
+TEST_F(HeartbeatResponseReconfigTestV1, PrimaryAcceptsConfigAfterUpdatingHeartbeatData) {
+ // Become primary but don't completeTransitionToPrimary.
+ Timestamp electionTimestamp(2, 0);
+ getTopoCoord().changeMemberState_forTest(MemberState::RS_PRIMARY, electionTimestamp);
+ getTopoCoord().setCurrentPrimary_forTest(getSelfIndex(), electionTimestamp);
+ OpTime dummyOpTime(electionTimestamp, getTopoCoord().getTerm());
+ setMyOpTime(dummyOpTime);
+
+ long long version = initConfigVersion + 1;
+ long long term = initConfigTerm;
+ auto config = ReplSetConfig::parse(makeRSConfigWithVersionAndTerm(version, term));
+
+ auto remote = HostAndPort("host2");
+ auto remoteId = getCurrentConfig().findMemberByHostAndPort(remote)->getId();
+ auto oldOpTime = getTopoCoord().latestKnownOpTimeSinceHeartbeatRestartPerMember().at(remoteId);
+ ASSERT_FALSE(oldOpTime);
+
+ // Construct a higher OpTime.
+ OpTime newOpTime{{20, 1}, term};
+ ReplSetHeartbeatResponse hb;
+ hb.initialize(BSON("ok" << 1 << "v" << 1 << "state" << MemberState::RS_SECONDARY), 1).ignore();
+ hb.setConfig(config);
+ hb.setConfigVersion(version);
+ hb.setConfigTerm(term);
+ hb.setAppliedOpTimeAndWallTime({newOpTime, now()});
+ StatusWith<ReplSetHeartbeatResponse> hbResponse(hb);
+
+ getTopoCoord().prepareHeartbeatRequestV1(now(), "rs0", remote);
+ now() += Milliseconds(1);
+ auto action =
+ getTopoCoord().processHeartbeatResponse(now(), Milliseconds(1), remote, hbResponse);
+ ASSERT_EQ(action.getAction(), HeartbeatResponseAction::Reconfig);
+
+ // Check that heartbeat response updated the heartbeat data even on reconfig.
+ auto actualOpTime =
+ getTopoCoord().latestKnownOpTimeSinceHeartbeatRestartPerMember().at(remoteId);
+ ASSERT(actualOpTime);
+ ASSERT_EQUALS(*actualOpTime, newOpTime);
+}
+
TEST_F(HeartbeatResponseReconfigTestV1, NodeAcceptsConfigIfTermInHeartbeatResponseIsNewer) {
long long version = initConfigVersion;
long long term = initConfigTerm + 1;