Commit 0baa4b07 authored by Willem Thiart's avatar Willem Thiart
Browse files

Step down if requestvote response has higher term

parent 75b01044
...@@ -404,9 +404,12 @@ int raft_recv_requestvote_response(raft_server_t* me_, int node, ...@@ -404,9 +404,12 @@ int raft_recv_requestvote_response(raft_server_t* me_, int node,
assert(node < me->num_nodes); assert(node < me->num_nodes);
// TODO: if invalid leader then stepdown if (raft_get_current_term(me_) < r->term)
// if (r->term != raft_get_current_term(me_)) {
// return 0; raft_set_current_term(me_, r->term);
raft_become_follower(me_);
return 0;
}
if (1 == r->vote_granted) if (1 == r->vote_granted)
{ {
......
...@@ -401,7 +401,7 @@ void TestRaft_votes_are_majority_is_true( ...@@ -401,7 +401,7 @@ void TestRaft_votes_are_majority_is_true(
CuAssertTrue(tc, 0 == raft_votes_is_majority(1, 2)); CuAssertTrue(tc, 0 == raft_votes_is_majority(1, 2));
} }
void TestRaft_server_dont_increase_votes_for_me_when_receive_request_vote_response_is_not_granted( void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_not_granted(
CuTest * tc CuTest * tc
) )
{ {
...@@ -419,7 +419,7 @@ void TestRaft_server_dont_increase_votes_for_me_when_receive_request_vote_respon ...@@ -419,7 +419,7 @@ void TestRaft_server_dont_increase_votes_for_me_when_receive_request_vote_respon
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
} }
void TestRaft_server_increase_votes_for_me_when_receive_request_vote_response( void TestRaft_server_recv_requestvote_response_increase_votes_for_me(
CuTest * tc CuTest * tc
) )
{ {
...@@ -1213,6 +1213,30 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc) ...@@ -1213,6 +1213,30 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc)
CuAssertTrue(tc, 1 == rv->candidate_id); CuAssertTrue(tc, 1 == rv->candidate_id);
} }
void TestRaft_candidate_recv_requestvote_response_becomes_follower_if_current_term_is_less_than_term(
CuTest * tc)
{
void *r = raft_new();
raft_add_node(r, (void*)1, 1);
raft_add_node(r, (void*)2, 0);
raft_set_current_term(r, 1);
raft_set_state(r, RAFT_STATE_CANDIDATE);
raft_vote(r, 0);
CuAssertTrue(tc, 0 == raft_is_follower(r));
CuAssertTrue(tc, -1 == raft_get_current_leader(r));
CuAssertTrue(tc, 1 == raft_get_current_term(r));
msg_requestvote_response_t rvr;
memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 2;
rvr.vote_granted = 0;
raft_recv_requestvote_response(r, 1, &rvr);
CuAssertTrue(tc, 1 == raft_is_follower(r));
CuAssertTrue(tc, 2 == raft_get_current_term(r));
CuAssertTrue(tc, -1 == raft_get_voted_for(r));
}
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower( void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
CuTest * tc) CuTest * tc)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment