From 72e8f24832a2582b6dd15f37f8e3b97358cc0a04 Mon Sep 17 00:00:00 2001 From: Willem Thiart Date: Wed, 18 Nov 2015 20:06:46 +0700 Subject: [PATCH] Only candidates read requestvote responses --- src/raft_server.c | 3 ++- tests/test_server.c | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/raft_server.c b/src/raft_server.c index 343e97db..3f40b1db 100644 --- a/src/raft_server.c +++ b/src/raft_server.c @@ -116,6 +116,7 @@ void raft_become_candidate(raft_server_t* me_) raft_set_state(me_, RAFT_STATE_CANDIDATE); /* we need a random factor here to prevent simultaneous candidates */ + /* TODO: this should probably be lower */ me->timeout_elapsed = rand() % me->election_timeout; for (i = 0; i < me->num_nodes; i++) @@ -454,7 +455,7 @@ int raft_recv_requestvote_response(raft_server_t* me_, __log(me_, "node responded to requestvote: %d status: %s", node, r->vote_granted == 1 ? "granted" : "not granted"); - if (raft_is_leader(me_)) + if (!raft_is_candidate(me_)) return 0; assert(node < me->num_nodes); diff --git a/tests/test_server.c b/tests/test_server.c index 9c50263d..6519c26a 100644 --- a/tests/test_server.c +++ b/tests/test_server.c @@ -444,6 +444,8 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me( raft_set_current_term(r, 1); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); + raft_become_candidate(r); + msg_requestvote_response_t rvr; memset(&rvr, 0, sizeof(msg_requestvote_response_t)); rvr.term = 1; @@ -452,6 +454,26 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me( 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) */ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term( CuTest * tc @@ -1168,7 +1190,7 @@ void TestRaft_follower_becoming_candidate_resets_election_timeout(CuTest * tc) raft_become_candidate(r); /* 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(