Commit eefa3687 authored by Willem Thiart's avatar Willem Thiart
Browse files

Change voted_for to int

parent 9f79cca3
...@@ -564,6 +564,11 @@ int raft_get_my_id(raft_server_t* me); ...@@ -564,6 +564,11 @@ int raft_get_my_id(raft_server_t* me);
* @param[in] node The server to vote for */ * @param[in] node The server to vote for */
void raft_vote(raft_server_t* me_, raft_node_t* node); void raft_vote(raft_server_t* me_, raft_node_t* node);
/** Vote for a server.
* This should be used to reload persistent state, ie. the voted-for field.
* @param[in] nodeid The server to vote for by nodeid */
void raft_vote_for_nodeid(raft_server_t* me_, const int nodeid);
/** Set the current term. /** Set the current term.
* This should be used to reload persistent state, ie. the current_term field. * This should be used to reload persistent state, ie. the current_term field.
* @param[in] term The new current term */ * @param[in] term The new current term */
......
...@@ -21,7 +21,7 @@ typedef struct { ...@@ -21,7 +21,7 @@ typedef struct {
/* The candidate the server voted for in its current term, /* The candidate the server voted for in its current term,
* or Nil if it hasn't voted for any. */ * or Nil if it hasn't voted for any. */
raft_node_t* voted_for; int voted_for;
/* the log which is replicated */ /* the log which is replicated */
void* log; void* log;
......
...@@ -44,7 +44,7 @@ raft_server_t* raft_new() ...@@ -44,7 +44,7 @@ raft_server_t* raft_new()
if (!me) if (!me)
return NULL; return NULL;
me->current_term = 0; me->current_term = 0;
me->voted_for = NULL; me->voted_for = -1;
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
me->request_timeout = 200; me->request_timeout = 200;
me->election_timeout = 1000; me->election_timeout = 1000;
...@@ -289,7 +289,7 @@ int raft_recv_appendentries( ...@@ -289,7 +289,7 @@ int raft_recv_appendentries(
if (raft_is_candidate(me_) && me->current_term == ae->term) if (raft_is_candidate(me_) && me->current_term == ae->term)
{ {
me->voted_for = NULL; me->voted_for = -1;
raft_become_follower(me_); raft_become_follower(me_);
} }
else if (me->current_term < ae->term) else if (me->current_term < ae->term)
...@@ -403,7 +403,7 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr) ...@@ -403,7 +403,7 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
/* TODO: if voted for is candiate return 1 (if below checks pass) */ /* TODO: if voted for is candiate return 1 (if below checks pass) */
/* we've already voted */ /* we've already voted */
if (me->voted_for) if (0 < me->voted_for)
return 0; return 0;
int current_idx = raft_get_current_idx((void*)me); int current_idx = raft_get_current_idx((void*)me);
...@@ -428,9 +428,6 @@ int raft_recv_requestvote(raft_server_t* me_, ...@@ -428,9 +428,6 @@ int raft_recv_requestvote(raft_server_t* me_,
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
assert(node);
assert(node != me->node);
if (raft_get_current_term(me_) < vr->term) if (raft_get_current_term(me_) < vr->term)
{ {
raft_set_current_term(me_, vr->term); raft_set_current_term(me_, vr->term);
...@@ -443,7 +440,7 @@ int raft_recv_requestvote(raft_server_t* me_, ...@@ -443,7 +440,7 @@ int raft_recv_requestvote(raft_server_t* me_,
* Both states would have voted for themselves */ * Both states would have voted for themselves */
assert(!(raft_is_leader(me_) || raft_is_candidate(me_))); assert(!(raft_is_leader(me_) || raft_is_candidate(me_)));
raft_vote(me_, node); raft_vote_for_nodeid(me_, vr->candidate_id);
r->vote_granted = 1; r->vote_granted = 1;
/* there must be in an election. */ /* there must be in an election. */
...@@ -475,9 +472,6 @@ int raft_recv_requestvote_response(raft_server_t* me_, ...@@ -475,9 +472,6 @@ int raft_recv_requestvote_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_;
assert(node);
assert(node != me->node);
__log(me_, node, "node responded to requestvote status: %s", __log(me_, node, "node responded to requestvote status: %s",
r->vote_granted == 1 ? "granted" : "not granted"); r->vote_granted == 1 ? "granted" : "not granted");
...@@ -506,7 +500,8 @@ int raft_recv_requestvote_response(raft_server_t* me_, ...@@ -506,7 +500,8 @@ int raft_recv_requestvote_response(raft_server_t* me_,
if (1 == r->vote_granted) if (1 == r->vote_granted)
{ {
raft_node_vote_for_me(node, 1); if (node)
raft_node_vote_for_me(node, 1);
int votes = raft_get_nvotes_for_me(me_); int votes = raft_get_nvotes_for_me(me_);
if (raft_votes_is_majority(me->num_nodes, votes)) if (raft_votes_is_majority(me->num_nodes, votes))
raft_become_leader(me_); raft_become_leader(me_);
...@@ -729,7 +724,7 @@ int raft_get_nvotes_for_me(raft_server_t* me_) ...@@ -729,7 +724,7 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
if (raft_node_has_vote_for_me(me->nodes[i])) if (raft_node_has_vote_for_me(me->nodes[i]))
votes += 1; votes += 1;
if (me->voted_for == me->node) if (me->voted_for == raft_get_nodeid(me_))
votes += 1; votes += 1;
return votes; return votes;
...@@ -737,13 +732,16 @@ int raft_get_nvotes_for_me(raft_server_t* me_) ...@@ -737,13 +732,16 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
void raft_vote(raft_server_t* me_, raft_node_t* node) void raft_vote(raft_server_t* me_, raft_node_t* node)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_vote_for_nodeid(me_, node ? raft_node_get_id(node) : -1);
}
assert(!me->voted_for || node != me->voted_for); void raft_vote_for_nodeid(raft_server_t* me_, const int nodeid)
{
raft_server_private_t* me = (raft_server_private_t*)me_;
me->voted_for = node; me->voted_for = nodeid;
if (me->cb.persist_vote) if (me->cb.persist_vote)
me->cb.persist_vote(me_, me->udata, raft_node_get_id(node)); me->cb.persist_vote(me_, me->udata, nodeid);
} }
int raft_msg_entry_response_committed(raft_server_t* me_, int raft_msg_entry_response_committed(raft_server_t* me_,
......
...@@ -66,9 +66,7 @@ int raft_get_log_count(raft_server_t* me_) ...@@ -66,9 +66,7 @@ int raft_get_log_count(raft_server_t* me_)
int raft_get_voted_for(raft_server_t* me_) int raft_get_voted_for(raft_server_t* me_)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
if (me->voted_for) return me->voted_for;
return raft_node_get_id(me->voted_for);
return -1;
} }
void raft_set_current_term(raft_server_t* me_, const int term) void raft_set_current_term(raft_server_t* me_, const int term)
...@@ -77,7 +75,7 @@ void raft_set_current_term(raft_server_t* me_, const int term) ...@@ -77,7 +75,7 @@ void raft_set_current_term(raft_server_t* me_, const int term)
if (me->current_term < term) if (me->current_term < term)
{ {
me->current_term = term; me->current_term = term;
me->voted_for = NULL; me->voted_for = -1;
if (me->cb.persist_term) if (me->cb.persist_term)
me->cb.persist_term(me_, me->udata, term); me->cb.persist_term(me_, me->udata, term);
} }
......
...@@ -594,6 +594,7 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than ...@@ -594,6 +594,7 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than
/* current term is less than term */ /* current term is less than term */
msg_requestvote_t rv; msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.candidate_id = 2;
rv.term = 2; rv.term = 2;
rv.last_log_idx = 1; rv.last_log_idx = 1;
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
...@@ -603,6 +604,30 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than ...@@ -603,6 +604,30 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than
CuAssertIntEquals(tc, 2, raft_get_voted_for(r)); CuAssertIntEquals(tc, 2, raft_get_voted_for(r));
} }
void TestRaft_server_recv_requestvote_depends_on_candidate_id(
CuTest * tc
)
{
void *r = raft_new();
raft_add_node(r, NULL, 1, 1);
raft_add_node(r, NULL, 2, 0);
raft_become_candidate(r);
raft_set_current_term(r, 1);
CuAssertIntEquals(tc, 1, raft_get_voted_for(r));
/* current term is less than term */
msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t));
rv.candidate_id = 3;
rv.term = 2;
rv.last_log_idx = 1;
msg_requestvote_response_t rvr;
raft_recv_requestvote(r, NULL, &rv, &rvr);
CuAssertIntEquals(tc, 1, raft_is_follower(r));
CuAssertIntEquals(tc, 2, raft_get_current_term(r));
CuAssertIntEquals(tc, 3, raft_get_voted_for(r));
}
/* If votedFor is null or candidateId, and candidate's log is at /* If votedFor is null or candidateId, and candidate's log is at
* least as up-to-date as local log, grant vote (5.2, 5.4) */ * least as up-to-date as local log, grant vote (5.2, 5.4) */
void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate( void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
......
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