Commit 54eb26df authored by Willem Thiart's avatar Willem Thiart
Browse files

Refactored vote granted check

parent f297457a
...@@ -117,7 +117,6 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -117,7 +117,6 @@ void raft_become_candidate(raft_server_t* me_)
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
if (me->nodeid != i) if (me->nodeid != i)
raft_send_requestvote(me_, i); raft_send_requestvote(me_, i);
} }
void raft_become_follower(raft_server_t* me_) void raft_become_follower(raft_server_t* me_)
...@@ -170,7 +169,8 @@ int raft_recv_appendentries_response(raft_server_t* me_, ...@@ -170,7 +169,8 @@ int raft_recv_appendentries_response(raft_server_t* me_,
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
__log(me_, "received appendentries response from: %d success: %d", node, r->success); __log(me_, "received appendentries response node: %d %s cidx: %d 1stidx: %d",
node, r->success == 1 ? "success" : "fail", r->current_idx, r->first_idx);
raft_node_t* p = raft_get_node(me_, node); raft_node_t* p = raft_get_node(me_, node);
...@@ -332,6 +332,22 @@ int raft_recv_appendentries( ...@@ -332,6 +332,22 @@ int raft_recv_appendentries(
return 0; return 0;
} }
static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
{
if (vr->term < raft_get_current_term((void*)me))
return 0;
/* we've already voted */
if (-1 != me->voted_for)
return 0;
/* we have a more up-to-date log */
if (vr->last_log_idx < me->current_idx)
return 0;
return 1;
}
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)
{ {
...@@ -340,17 +356,13 @@ int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr, ...@@ -340,17 +356,13 @@ int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr,
if (raft_get_current_term(me_) < vr->term) if (raft_get_current_term(me_) < vr->term)
me->voted_for = -1; me->voted_for = -1;
if (vr->term < raft_get_current_term(me_) || if (__should_grant_vote(me, vr))
/* we've already voted */
-1 != me->voted_for ||
/* we have a more up-to-date log */
vr->last_log_idx < me->current_idx)
r->vote_granted = 0;
else
{ {
raft_vote(me_, node); raft_vote(me_, node);
r->vote_granted = 1; r->vote_granted = 1;
} }
else
r->vote_granted = 0;
/* voted for someone, therefore must be in an election. */ /* voted for someone, therefore must be in an election. */
if (0 <= me->voted_for) if (0 <= me->voted_for)
...@@ -475,8 +487,6 @@ void raft_send_appendentries(raft_server_t* me_, int node) ...@@ -475,8 +487,6 @@ void raft_send_appendentries(raft_server_t* me_, int node)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
__log(me_, "sending appendentries to: %d", node);
if (!(me->cb.send_appendentries)) if (!(me->cb.send_appendentries))
return; return;
...@@ -516,6 +526,13 @@ void raft_send_appendentries(raft_server_t* me_, int node) ...@@ -516,6 +526,13 @@ void raft_send_appendentries(raft_server_t* me_, int node)
} }
} }
__log(me_, "sending appendentries node: %d, %d %d %d %d",
node,
ae.term,
ae.leader_commit,
ae.prev_log_idx,
ae.prev_log_term);
me->cb.send_appendentries(me_, me->udata, node, &ae); me->cb.send_appendentries(me_, me->udata, node, &ae);
} }
......
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