Commit 72e8f248 authored by Willem Thiart's avatar Willem Thiart
Browse files

Only candidates read requestvote responses

parent 763799c5
...@@ -116,6 +116,7 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -116,6 +116,7 @@ void raft_become_candidate(raft_server_t* me_)
raft_set_state(me_, RAFT_STATE_CANDIDATE); raft_set_state(me_, RAFT_STATE_CANDIDATE);
/* we need a random factor here to prevent simultaneous candidates */ /* we need a random factor here to prevent simultaneous candidates */
/* TODO: this should probably be lower */
me->timeout_elapsed = rand() % me->election_timeout; me->timeout_elapsed = rand() % me->election_timeout;
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
...@@ -454,7 +455,7 @@ int raft_recv_requestvote_response(raft_server_t* me_, ...@@ -454,7 +455,7 @@ int raft_recv_requestvote_response(raft_server_t* me_,
__log(me_, "node responded to requestvote: %d status: %s", __log(me_, "node responded to requestvote: %d status: %s",
node, r->vote_granted == 1 ? "granted" : "not granted"); node, r->vote_granted == 1 ? "granted" : "not granted");
if (raft_is_leader(me_)) if (!raft_is_candidate(me_))
return 0; return 0;
assert(node < me->num_nodes); assert(node < me->num_nodes);
......
...@@ -444,6 +444,8 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me( ...@@ -444,6 +444,8 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me(
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
raft_become_candidate(r);
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1; rvr.term = 1;
...@@ -452,6 +454,26 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me( ...@@ -452,6 +454,26 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me(
CuAssertTrue(tc, 1 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 1 == raft_get_nvotes_for_me(r));
} }
void TestRaft_server_recv_requestvote_response_must_be_candidate_to_receive(
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);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
raft_become_leader(r);
msg_requestvote_response_t rvr;
memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1;
rvr.vote_granted = 1;
raft_recv_requestvote_response(r, 1, &rvr);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
}
/* Reply false if term < currentTerm (5.1) */ /* Reply false if term < currentTerm (5.1) */
void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term( void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term(
CuTest * tc CuTest * tc
...@@ -1168,7 +1190,7 @@ void TestRaft_follower_becoming_candidate_resets_election_timeout(CuTest * tc) ...@@ -1168,7 +1190,7 @@ void TestRaft_follower_becoming_candidate_resets_election_timeout(CuTest * tc)
raft_become_candidate(r); raft_become_candidate(r);
/* time is selected randomly */ /* time is selected randomly */
CuAssertTrue(tc, raft_get_timeout_elapsed(r) < 900); CuAssertTrue(tc, raft_get_timeout_elapsed(r) < 1000);
} }
void TestRaft_follower_recv_appendentries_resets_election_timeout( void TestRaft_follower_recv_appendentries_resets_election_timeout(
......
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