diff options
author | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2020-05-11 15:55:29 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-05-13 20:23:51 +0000 |
commit | 74cc45677605baf25cd57caa497e254883e88567 (patch) | |
tree | 711371ec22eb4f1e2b55534a819c14257a147357 /src/mongo/db/repl/topology_coordinator_v1_test.cpp | |
parent | 8a3c23aa1139c9835223ebecc583ef0e7fca9223 (diff) | |
download | mongo-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.cpp | 40 |
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; |