summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2015-09-22 16:03:39 -0400
committerScott Hernandez <scotthernandez@gmail.com>2015-09-22 16:41:07 -0400
commit8d11ca1a42b8c5d1c03028af53293b7a708d7fae (patch)
treef543c55132393453388347c1edc9f70853342d4c
parented51568a5d7351538248323324fdc63a26c60213 (diff)
downloadmongo-8d11ca1a42b8c5d1c03028af53293b7a708d7fae.tar.gz
SERVER-19956: fix stale term handling/errors
-rw-r--r--src/mongo/db/repl/repl_set_request_votes_args.cpp17
-rw-r--r--src/mongo/db/repl/repl_set_request_votes_args.h19
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp2
-rw-r--r--src/mongo/db/repl/topology_coordinator_impl.cpp1
-rw-r--r--src/mongo/db/repl/vote_requester.cpp10
-rw-r--r--src/mongo/db/repl/vote_requester_test.cpp6
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");