summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/repl_set_heartbeat_response.cpp
diff options
context:
space:
mode:
authorXueruiFa <xuerui.fa@mongodb.com>2020-10-06 17:28:45 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-10-13 16:14:32 +0000
commitbf614cb57059c74830633855e28b3f4677cd4f8d (patch)
tree8862fd43b78067e92b12f1b028cb196100728554 /src/mongo/db/repl/repl_set_heartbeat_response.cpp
parentd9c1336c11e00b985ad9fcf5cd4917dca5d9e38c (diff)
downloadmongo-bf614cb57059c74830633855e28b3f4677cd4f8d.tar.gz
SERVER-43904: Filter unelectable nodes during election handoff
Diffstat (limited to 'src/mongo/db/repl/repl_set_heartbeat_response.cpp')
-rw-r--r--src/mongo/db/repl/repl_set_heartbeat_response.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/mongo/db/repl/repl_set_heartbeat_response.cpp b/src/mongo/db/repl/repl_set_heartbeat_response.cpp
index 138f6c84e1e..c77d454f00c 100644
--- a/src/mongo/db/repl/repl_set_heartbeat_response.cpp
+++ b/src/mongo/db/repl/repl_set_heartbeat_response.cpp
@@ -63,6 +63,7 @@ const std::string kReplSetFieldName = "set";
const std::string kSyncSourceFieldName = "syncingTo";
const std::string kTermFieldName = "term";
const std::string kTimestampFieldName = "ts";
+const std::string kIsElectableFieldName = "electable";
} // namespace
@@ -102,6 +103,9 @@ void ReplSetHeartbeatResponse::addToBSON(BSONObjBuilder* builder) const {
_appliedOpTime.append(builder, kAppliedOpTimeFieldName);
builder->appendDate(kAppliedWallTimeFieldName, _appliedWallTime);
}
+ if (_electableSet) {
+ *builder << kIsElectableFieldName << _electable;
+ }
}
BSONObj ReplSetHeartbeatResponse::toBSON() const {
@@ -180,6 +184,13 @@ Status ReplSetHeartbeatResponse::initialize(const BSONObj& doc, long long term)
_appliedWallTime = appliedWallTimeElement.Date();
_appliedOpTimeSet = true;
+ status = bsonExtractBooleanField(doc, kIsElectableFieldName, &_electable);
+ if (!status.isOK()) {
+ _electableSet = false;
+ } else {
+ _electableSet = true;
+ }
+
const BSONElement memberStateElement = doc[kMemberStateFieldName];
if (memberStateElement.eoo()) {
_stateSet = false;
@@ -300,5 +311,10 @@ OpTimeAndWallTime ReplSetHeartbeatResponse::getDurableOpTimeAndWallTime() const
return {_durableOpTime, _durableWallTime};
}
+bool ReplSetHeartbeatResponse::isElectable() const {
+ invariant(_electableSet);
+ return _electable;
+}
+
} // namespace repl
} // namespace mongo