int raft_recv_requestvote_response(raft_server_t* me_, int node, msg_requestvote_response_t* r) { raft_server_private_t* me = (raft_server_private_t*)me_; __log(me_, "node responded to requestvote: %d status: %s", node, r->vote_granted == 1 ? "granted" : "not granted"); if (raft_is_leader(me_)) return 0; assert(node < me->num_nodes); // if (r->term != raft_get_current_term(me_)) // return 0; if (1 == r->vote_granted) { me->votes_for_me[node] = 1; int votes = raft_get_nvotes_for_me(me_); if (raft_votes_is_majority(me->num_nodes, votes)) raft_become_leader(me_); } return 0; }
/* If term > currentTerm, set currentTerm to term (step down if candidate or * leader) */ void TestRaft_votes_are_majority_is_true( CuTest * tc ) { /* 1 of 3 = lose */ CuAssertTrue(tc, 0 == raft_votes_is_majority(3, 1)); /* 2 of 3 = win */ CuAssertTrue(tc, 1 == raft_votes_is_majority(3, 2)); /* 2 of 5 = lose */ CuAssertTrue(tc, 0 == raft_votes_is_majority(5, 2)); /* 3 of 5 = win */ CuAssertTrue(tc, 1 == raft_votes_is_majority(5, 3)); /* 2 of 1?? This is an error */ CuAssertTrue(tc, 0 == raft_votes_is_majority(1, 2)); }
int raft_recv_requestvote_response(raft_server_t* me_, raft_node_t* node, msg_requestvote_response_t* r) { raft_server_private_t* me = (raft_server_private_t*)me_; __log(me_, node, "node responded to requestvote status: %s", r->vote_granted == 1 ? "granted" : "not granted"); if (!raft_is_candidate(me_)) { return 0; } else if (raft_get_current_term(me_) < r->term) { raft_set_current_term(me_, r->term); raft_become_follower(me_); return 0; } else if (raft_get_current_term(me_) != r->term) { /* The node who voted for us would have obtained our term. * Therefore this is an old message we should ignore. * This happens if the network is pretty choppy. */ return 0; } __log(me_, node, "node responded to requestvote: %d status: %s ct:%d rt:%d", node, r->vote_granted == 1 ? "granted" : "not granted", me->current_term, r->term); if (1 == r->vote_granted) { if (node) raft_node_vote_for_me(node, 1); int votes = raft_get_nvotes_for_me(me_); if (raft_votes_is_majority(me->num_nodes, votes)) raft_become_leader(me_); } return 0; }