diff options
author | Scott Hernandez <scotthernandez@gmail.com> | 2015-09-22 16:03:39 -0400 |
---|---|---|
committer | Scott Hernandez <scotthernandez@gmail.com> | 2015-09-22 16:41:07 -0400 |
commit | 8d11ca1a42b8c5d1c03028af53293b7a708d7fae (patch) | |
tree | f543c55132393453388347c1edc9f70853342d4c | |
parent | ed51568a5d7351538248323324fdc63a26c60213 (diff) | |
download | mongo-8d11ca1a42b8c5d1c03028af53293b7a708d7fae.tar.gz |
SERVER-19956: fix stale term handling/errors
-rw-r--r-- | src/mongo/db/repl/repl_set_request_votes_args.cpp | 17 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_set_request_votes_args.h | 19 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/repl/topology_coordinator_impl.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/vote_requester.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/repl/vote_requester_test.cpp | 6 |
6 files changed, 23 insertions, 32 deletions
diff --git a/src/mongo/db/repl/repl_set_request_votes_args.cpp b/src/mongo/db/repl/repl_set_request_votes_args.cpp index 9001272d94b..361309e3c38 100644 --- a/src/mongo/db/repl/repl_set_request_votes_args.cpp +++ b/src/mongo/db/repl/repl_set_request_votes_args.cpp @@ -148,15 +148,19 @@ Status ReplSetRequestVotesResponse::initialize(const BSONObj& argsObj) { if (!status.isOK()) return status; - status = bsonExtractBooleanField(argsObj, kOkFieldName, &_ok); - if (!status.isOK()) - return status; - return Status::OK(); } -bool ReplSetRequestVotesResponse::getOk() const { - return _ok; +void ReplSetRequestVotesResponse::setVoteGranted(bool voteGranted) { + _voteGranted = voteGranted; +} + +void ReplSetRequestVotesResponse::setTerm(long long term) { + _term = term; +} + +void ReplSetRequestVotesResponse::setReason(const std::string& reason) { + _reason = reason; } long long ReplSetRequestVotesResponse::getTerm() const { @@ -172,7 +176,6 @@ const std::string& ReplSetRequestVotesResponse::getReason() const { } void ReplSetRequestVotesResponse::addToBSON(BSONObjBuilder* builder) const { - builder->append(kOkFieldName, _ok); builder->append(kTermFieldName, _term); builder->append(kVoteGrantedFieldName, _voteGranted); builder->append(kReasonFieldName, _reason); diff --git a/src/mongo/db/repl/repl_set_request_votes_args.h b/src/mongo/db/repl/repl_set_request_votes_args.h index 00ba4d06c1c..180a06152b0 100644 --- a/src/mongo/db/repl/repl_set_request_votes_args.h +++ b/src/mongo/db/repl/repl_set_request_votes_args.h @@ -64,20 +64,10 @@ class ReplSetRequestVotesResponse { public: Status initialize(const BSONObj& argsObj); - void setOk(bool ok) { - _ok = ok; - } - void setVoteGranted(bool voteGranted) { - _voteGranted = voteGranted; - } - void setTerm(long long term) { - _term = term; - } - void setReason(const std::string& reason) { - _reason = reason; - } - - bool getOk() const; + void setVoteGranted(bool voteGranted); + void setTerm(long long term); + void setReason(const std::string& reason); + long long getTerm() const; bool getVoteGranted() const; const std::string& getReason() const; @@ -86,7 +76,6 @@ public: BSONObj toBSON() const; private: - bool _ok = false; long long _term = -1; bool _voteGranted = false; std::string _reason; diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp index 01635bf4dae..533b16fd114 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -2723,7 +2723,7 @@ Status ReplicationCoordinatorImpl::processReplSetRequestVotes( } auto termStatus = updateTerm(args.getTerm()); - if (!termStatus.isOK()) + if (!termStatus.isOK() && termStatus.code() != ErrorCodes::StaleTerm) return termStatus; Status result{ErrorCodes::InternalError, "didn't set status in processReplSetRequestVotes"}; diff --git a/src/mongo/db/repl/topology_coordinator_impl.cpp b/src/mongo/db/repl/topology_coordinator_impl.cpp index baa8080e7a1..37fd56caf2a 100644 --- a/src/mongo/db/repl/topology_coordinator_impl.cpp +++ b/src/mongo/db/repl/topology_coordinator_impl.cpp @@ -2367,7 +2367,6 @@ void TopologyCoordinatorImpl::summarizeAsHtml(ReplSetHtmlSummary* output) { void TopologyCoordinatorImpl::processReplSetRequestVotes(const ReplSetRequestVotesArgs& args, ReplSetRequestVotesResponse* response, const OpTime& lastAppliedOpTime) { - response->setOk(true); response->setTerm(_term); if (args.getTerm() < _term) { diff --git a/src/mongo/db/repl/vote_requester.cpp b/src/mongo/db/repl/vote_requester.cpp index 39583153832..a9026a59c88 100644 --- a/src/mongo/db/repl/vote_requester.cpp +++ b/src/mongo/db/repl/vote_requester.cpp @@ -98,12 +98,18 @@ void VoteRequester::Algorithm::processResponse(const RemoteCommandRequest& reque } else { _responders.insert(request.target); ReplSetRequestVotesResponse voteResponse; - voteResponse.initialize(response.getValue().data); + const auto status = voteResponse.initialize(response.getValue().data); + if (!status.isOK()) { + log() << "VoteRequester: Got error processing response with status: " << status + << ", resp:" << response.getValue().data; + } + if (voteResponse.getVoteGranted()) { _votes++; } else { log() << "VoteRequester: Got no vote from " << request.target - << " because: " << voteResponse.getReason() << ", resp:" << voteResponse.toBSON(); + << " because: " << voteResponse.getReason() + << ", resp:" << response.getValue().data; } if (voteResponse.getTerm() > _term) { diff --git a/src/mongo/db/repl/vote_requester_test.cpp b/src/mongo/db/repl/vote_requester_test.cpp index 70afac4ce8e..3b944df7af0 100644 --- a/src/mongo/db/repl/vote_requester_test.cpp +++ b/src/mongo/db/repl/vote_requester_test.cpp @@ -126,7 +126,6 @@ protected: ResponseStatus votedYes() { ReplSetRequestVotesResponse response; - response.setOk(true); response.setVoteGranted(true); response.setTerm(1); return ResponseStatus( @@ -135,7 +134,6 @@ protected: ResponseStatus votedNoBecauseConfigVersionDoesNotMatch() { ReplSetRequestVotesResponse response; - response.setOk(true); response.setVoteGranted(false); response.setTerm(1); response.setReason("candidate's config version differs from mine"); @@ -145,7 +143,6 @@ protected: ResponseStatus votedNoBecauseSetNameDiffers() { ReplSetRequestVotesResponse response; - response.setOk(true); response.setVoteGranted(false); response.setTerm(1); response.setReason("candidate's set name differs from mine"); @@ -155,7 +152,6 @@ protected: ResponseStatus votedNoBecauseLastOpTimeIsGreater() { ReplSetRequestVotesResponse response; - response.setOk(true); response.setVoteGranted(false); response.setTerm(1); response.setReason("candidate's data is staler than mine"); @@ -165,7 +161,6 @@ protected: ResponseStatus votedNoBecauseTermIsGreater() { ReplSetRequestVotesResponse response; - response.setOk(true); response.setVoteGranted(false); response.setTerm(3); response.setReason("candidate's term is lower than mine"); @@ -175,7 +170,6 @@ protected: ResponseStatus votedNoBecauseAlreadyVoted() { ReplSetRequestVotesResponse response; - response.setOk(true); response.setVoteGranted(false); response.setTerm(2); response.setReason("already voted for another candidate this term"); |