diff options
author | XueruiFa <xuerui.fa@mongodb.com> | 2020-10-06 17:28:45 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-10-13 16:14:32 +0000 |
commit | bf614cb57059c74830633855e28b3f4677cd4f8d (patch) | |
tree | 8862fd43b78067e92b12f1b028cb196100728554 /src/mongo/db/repl/repl_set_heartbeat_response.cpp | |
parent | d9c1336c11e00b985ad9fcf5cd4917dca5d9e38c (diff) | |
download | mongo-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.cpp | 16 |
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 |