diff options
author | Samyukta Lanka <samy.lanka@mongodb.com> | 2019-09-25 18:33:26 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-09-25 18:33:26 +0000 |
commit | 4b996efc59f51c1e2994e3a0fc864f65a7d105a8 (patch) | |
tree | 1ad3f725ceae9cb421698012279d696b78c5edf5 | |
parent | d3df5c2a2050ac95da998e09316cef4f37707f19 (diff) | |
download | mongo-4b996efc59f51c1e2994e3a0fc864f65a7d105a8.tar.gz |
SERVER-7681 Report majority number in ReplSetGetStatus
(cherry picked from commit 4b985d5460a2ddb889942f3b4ede04d7051b3921)
SERVER-7681 Report write majority in ReplSetGetStatus
(cherry picked from commit f92cc6fbdd660015f746ea3f59abfd4fb5485071)
-rw-r--r-- | src/mongo/db/repl/topology_coordinator.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/repl/topology_coordinator_v1_test.cpp | 45 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/mongo/db/repl/topology_coordinator.cpp b/src/mongo/db/repl/topology_coordinator.cpp index b57480c4836..9d4e1235ba6 100644 --- a/src/mongo/db/repl/topology_coordinator.cpp +++ b/src/mongo/db/repl/topology_coordinator.cpp @@ -1608,6 +1608,9 @@ void TopologyCoordinator::prepareStatusResponse(const ReplSetStatusArgs& rsStatu response->append("heartbeatIntervalMillis", durationCount<Milliseconds>(_rsConfig.getHeartbeatInterval())); + response->append("majorityVoteCount", _rsConfig.getMajorityVoteCount()); + response->append("writeMajorityCount", _rsConfig.getWriteMajority()); + // New optimes, to hold them all. BSONObjBuilder optimes; _lastCommittedOpTimeAndWallTime.opTime.append(&optimes, "lastCommittedOpTime"); diff --git a/src/mongo/db/repl/topology_coordinator_v1_test.cpp b/src/mongo/db/repl/topology_coordinator_v1_test.cpp index 388b8e84dc1..9dd69ddd6cb 100644 --- a/src/mongo/db/repl/topology_coordinator_v1_test.cpp +++ b/src/mongo/db/repl/topology_coordinator_v1_test.cpp @@ -1704,6 +1704,8 @@ TEST_F(TopoCoordTest, ReplSetGetStatus) { ASSERT_FALSE(selfStatus.hasField("pingMs")); ASSERT_EQUALS(2000, rsStatus["heartbeatIntervalMillis"].numberInt()); + ASSERT_EQUALS(3, rsStatus["majorityVoteCount"].numberInt()); + ASSERT_EQUALS(3, rsStatus["writeMajorityCount"].numberInt()); ASSERT_BSONOBJ_EQ(initialSyncStatus, rsStatus["initialSyncStatus"].Obj()); ASSERT_BSONOBJ_EQ(electionCandidateMetrics, rsStatus["electionCandidateMetrics"].Obj()); @@ -1727,6 +1729,49 @@ TEST_F(TopoCoordTest, ReplSetGetStatus) { ASSERT_FALSE(rsStatus.hasField("electionCandidateMetrics")); } +TEST_F(TopoCoordTest, ReplSetGetStatusWriteMajorityDifferentFromMajorityVoteCount) { + // This tests that writeMajorityCount differs from majorityVoteCount in replSetGetStatus when + // the number of non-arbiter voters is less than majorityVoteCount. + Date_t startupTime = Date_t::fromMillisSinceEpoch(100); + Date_t heartbeatTime = Date_t::fromMillisSinceEpoch(5000); + Seconds uptimeSecs(10); + Date_t curTime = heartbeatTime + uptimeSecs; + OpTime readConcernMajorityOpTime(Timestamp(4, 1), 20); + Date_t readConcernMajorityWallTime = Date_t() + Seconds(readConcernMajorityOpTime.getSecs()); + BSONObj initialSyncStatus = BSON("failedInitialSyncAttempts" << 1); + std::string setName = "mySet"; + + updateConfig(BSON("_id" << setName << "version" << 1 << "members" + << BSON_ARRAY(BSON("_id" << 0 << "host" + << "test0:1234") + << BSON("_id" << 1 << "host" + << "test1:1234") + << BSON("_id" << 2 << "host" + << "test2:1234" + << "arbiterOnly" << true) + << BSON("_id" << 3 << "host" + << "test3:1234" + << "arbiterOnly" << true))), + 3, + startupTime + Milliseconds(1)); + + BSONObjBuilder statusBuilder; + Status resultStatus(ErrorCodes::InternalError, "prepareStatusResponse didn't set result"); + getTopoCoord().prepareStatusResponse( + TopologyCoordinator::ReplSetStatusArgs{ + curTime, + static_cast<unsigned>(durationCount<Seconds>(uptimeSecs)), + {readConcernMajorityOpTime, readConcernMajorityWallTime}, + initialSyncStatus}, + &statusBuilder, + &resultStatus); + ASSERT_OK(resultStatus); + BSONObj rsStatus = statusBuilder.obj(); + ASSERT_EQUALS(3, rsStatus["majorityVoteCount"].numberInt()); + ASSERT_EQUALS(2, rsStatus["writeMajorityCount"].numberInt()); +} + + TEST_F(TopoCoordTest, ReplSetGetStatusIPs) { BSONObj initialSyncStatus = BSON("failedInitialSyncAttempts" << 1); std::string setName = "mySet"; |