Commit 1ce89f2e authored by Willem Thiart's avatar Willem Thiart
Browse files

Add improved vote granting logic

parent 9f7fa0a0
...@@ -364,18 +364,29 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr) ...@@ -364,18 +364,29 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
if (vr->term < raft_get_current_term((void*)me)) if (vr->term < raft_get_current_term((void*)me))
return 0; return 0;
/* TODO: if voted for is candiate return 1 (if below checks pass) */
/* we've already voted */ /* we've already voted */
if (-1 != me->voted_for) if (-1 != me->voted_for)
return 0; return 0;
/* we have a more up-to-date log */ int current_idx = raft_get_current_idx((void*)me);
if (vr->last_log_idx < raft_get_current_idx((void*)me))
return 0; if (0 == current_idx)
return 1;
raft_entry_t* e = raft_get_entry_from_idx((void*)me, current_idx);
if (e->term < vr->last_log_term)
return 1;
return 1; if (vr->last_log_term == e->term && current_idx <= vr->last_log_idx)
return 1;
return 0;
} }
int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr, int raft_recv_requestvote(raft_server_t* me_,
int node,
msg_requestvote_t* vr,
msg_requestvote_response_t *r) msg_requestvote_response_t *r)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
......
...@@ -1085,8 +1085,9 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log( ...@@ -1085,8 +1085,9 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
rv.last_log_idx = 1; rv.last_log_idx = 1;
rv.last_log_term = 1; rv.last_log_term = 1;
/* server's term and idx are more up-to-date */
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
/* server's idx are more up-to-date */
raft_entry_t ety; raft_entry_t ety;
ety.term = 1; ety.term = 1;
ety.id = 100; ety.id = 100;
...@@ -1099,6 +1100,16 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log( ...@@ -1099,6 +1100,16 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
/* vote not granted */ /* vote not granted */
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, 1, &rv, &rvr);
CuAssertTrue(tc, 0 == rvr.vote_granted); CuAssertTrue(tc, 0 == rvr.vote_granted);
/* approve vote, because last_log_term is higher */
raft_set_current_term(r, 2);
memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 2;
rv.candidate_id = 1;
rv.last_log_idx = 1;
rv.last_log_term = 2;
raft_recv_requestvote(r, 1, &rv, &rvr);
CuAssertTrue(tc, 1 == rvr.vote_granted);
} }
void TestRaft_candidate_becomes_candidate_is_candidate(CuTest * tc) void TestRaft_candidate_becomes_candidate_is_candidate(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