void TestRaft_server_voting_results_in_voting(CuTest * tc) { void *r = raft_new(); raft_vote(r, 1); CuAssertTrue(tc, 1 == raft_get_voted_for(r)); raft_vote(r, 9); CuAssertTrue(tc, 9 == raft_get_voted_for(r)); }
int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr) { raft_server_private_t* me = (void*)me_; msg_requestvote_response_t r; if (raft_get_current_term(me_) < vr->term) { me->voted_for = -1; } if (vr->term < raft_get_current_term(me_) || /* 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); r.vote_granted = 1; } __log(me_, NULL, "node requested vote: %d replying: %s", node, r.vote_granted == 1 ? "granted" : "not granted"); r.term = raft_get_current_term(me_); if (me->cb.send) me->cb.send(me->cb_ctx, me, node, RAFT_MSG_REQUESTVOTE_RESPONSE, (void*)&r, sizeof(msg_requestvote_response_t)); return 0; }
int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr, msg_requestvote_response_t *r) { raft_server_private_t* me = (raft_server_private_t*)me_; if (raft_get_current_term(me_) < vr->term) me->voted_for = -1; if (vr->term < raft_get_current_term(me_) || /* 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); r->vote_granted = 1; } __log(me_, "node requested vote: %d replying: %s", node, r->vote_granted == 1 ? "granted" : "not granted"); r->term = raft_get_current_term(me_); return 0; }
void TestRaft_follower_becomes_follower_clears_voted_for(CuTest * tc) { void *r = raft_new(); raft_vote(r, 1); CuAssertTrue(tc, 1 == raft_get_voted_for(r)); raft_become_follower(r); CuAssertTrue(tc, -1 == raft_get_voted_for(r)); }
void raft_become_candidate(raft_server_t* me_) { raft_server_private_t* me = (raft_server_private_t*)me_; int i; __log(me_, "becoming candidate"); memset(me->votes_for_me, 0, sizeof(int) * me->num_nodes); me->current_term += 1; raft_vote(me_, me->nodeid); raft_set_state(me_, RAFT_STATE_CANDIDATE); /* we need a random factor here to prevent simultaneous candidates */ me->timeout_elapsed = rand() % 500; for (i = 0; i < me->num_nodes; i++) if (me->nodeid != i) raft_send_requestvote(me_, i); }
/* 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) */ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate( 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); raft_vote(r, 0); msg_requestvote_t rv; memset(&rv, 0, sizeof(msg_requestvote_t)); rv.term = 1; rv.candidate_id = 1; rv.last_log_idx = 1; rv.last_log_term = 1; msg_requestvote_response_t rvr; raft_recv_requestvote(r, 1, &rv, &rvr); CuAssertTrue(tc, 0 == rvr.vote_granted); }
void raft_become_candidate(raft_server_t* me_) { raft_server_private_t* me = (raft_server_private_t*)me_; int i; __log(me_, NULL, "becoming candidate"); raft_set_current_term(me_, raft_get_current_term(me_) + 1); for (i = 0; i < me->num_nodes; i++) raft_node_vote_for_me(me->nodes[i], 0); raft_vote(me_, me->node); me->current_leader = NULL; 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++) if (me->node != me->nodes[i] && raft_node_is_voting(me->nodes[i])) raft_send_requestvote(me_, me->nodes[i]); }
void TestRaft_server_voted_for_records_who_we_voted_for(CuTest * tc) { void *r = raft_new(); raft_vote(r, 2); CuAssertTrue(tc, 2 == raft_get_voted_for(r)); }