diff options
author | Suganthi Mani <suganthi.mani@mongodb.com> | 2018-05-14 13:41:11 -0400 |
---|---|---|
committer | Suganthi Mani <suganthi.mani@mongodb.com> | 2018-05-23 12:06:30 -0400 |
commit | e4e2162c489c1faa569463f51058ebc09368a5f9 (patch) | |
tree | fdebaecfbada45561c74f62625707e07028efaa2 /src/mongo/db/repl/vote_requester_test.cpp | |
parent | ae8f7d8160aef246ea4c31169d42865fc55e98c3 (diff) | |
download | mongo-e4e2162c489c1faa569463f51058ebc09368a5f9.tar.gz |
SERVER-34661 Return early when the vote request response has an error.
Fixed by making VoteRequester::Algorithm::processResponseto to check ok field in the vote response message.
Diffstat (limited to 'src/mongo/db/repl/vote_requester_test.cpp')
-rw-r--r-- | src/mongo/db/repl/vote_requester_test.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/mongo/db/repl/vote_requester_test.cpp b/src/mongo/db/repl/vote_requester_test.cpp index 5d3cd98749e..ad7501440a9 100644 --- a/src/mongo/db/repl/vote_requester_test.cpp +++ b/src/mongo/db/repl/vote_requester_test.cpp @@ -31,6 +31,7 @@ #include <memory> #include "mongo/base/status.h" +#include "mongo/db/commands.h" #include "mongo/db/jsobj.h" #include "mongo/db/repl/repl_set_request_votes_args.h" #include "mongo/db/repl/vote_requester.h" @@ -112,7 +113,16 @@ protected: void processResponse(const RemoteCommandRequest& request, const RemoteCommandResponse& response) { - _requester->processResponse(request, response); + if (!response.isOK()) { + _requester->processResponse(request, response); + return; + } + BSONObjBuilder builder(response.data); + // Appends ok:1.0 (status ok) to response data if 'ok' field is missing. + CommandHelpers::appendCommandStatusNoThrow(builder, Status::OK()); + RemoteCommandResponse responseWithCmdStatus = response; + responseWithCmdStatus.data = builder.obj(); + _requester->processResponse(request, responseWithCmdStatus); } int getNumResponders() { @@ -142,6 +152,18 @@ protected: return RemoteCommandResponse(response.toBSON(), BSONObj(), Milliseconds(10)); } + RemoteCommandResponse votedYesStatusNotOkBecauseFailedToStoreLastVote() { + ReplSetRequestVotesResponse response; + BSONObjBuilder result; + response.setVoteGranted(true); + response.setTerm(1); + response.addToBSON(&result); + auto status = + Status(ErrorCodes::InterruptedDueToReplStateChange, "operation was interrupted"); + CommandHelpers::appendCommandStatusNoThrow(result, status); + return RemoteCommandResponse(result.obj(), BSONObj(), Milliseconds(10)); + } + RemoteCommandResponse votedNoBecauseConfigVersionDoesNotMatch() { ReplSetRequestVotesResponse response; response.setVoteGranted(false); @@ -272,6 +294,19 @@ TEST_F(VoteRequesterTest, ImmediateGoodResponseWinElection) { ASSERT_EQUALS(1, getNumResponders()); } +TEST_F(VoteRequesterTest, VoterFailedToStoreLastVote) { + startCapturingLogMessages(); + ASSERT_FALSE(hasReceivedSufficientResponses()); + processResponse(requestFrom("host1"), votedYesStatusNotOkBecauseFailedToStoreLastVote()); + ASSERT_FALSE(hasReceivedSufficientResponses()); + ASSERT_EQUALS(1, countLogLinesContaining("received an invalid response from host1:27017")); + processResponse(requestFrom("host2"), votedYes()); + ASSERT_TRUE(hasReceivedSufficientResponses()); + ASSERT(VoteRequester::Result::kSuccessfullyElected == getResult()); + ASSERT_EQUALS(2, getNumResponders()); + stopCapturingLogMessages(); +} + TEST_F(VoteRequesterTest, BadConfigVersionWinElection) { startCapturingLogMessages(); ASSERT_FALSE(hasReceivedSufficientResponses()); |