summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamyukta Lanka <samy.lanka@mongodb.com>2019-09-25 18:33:26 +0000
committerevergreen <evergreen@mongodb.com>2019-09-25 18:33:26 +0000
commit4b996efc59f51c1e2994e3a0fc864f65a7d105a8 (patch)
tree1ad3f725ceae9cb421698012279d696b78c5edf5
parentd3df5c2a2050ac95da998e09316cef4f37707f19 (diff)
downloadmongo-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.cpp3
-rw-r--r--src/mongo/db/repl/topology_coordinator_v1_test.cpp45
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";