void sender_poll_msgs(void* s) { sender_t* me = s; msg_t* m; while ((m = llqueue_poll(me->inbox))) { switch (m->type) { case RAFT_MSG_APPENDENTRIES: raft_recv_appendentries(me->raft, m->sender, m->data); break; case RAFT_MSG_APPENDENTRIES_RESPONSE: raft_recv_appendentries_response(me->raft, m->sender, m->data); break; case RAFT_MSG_REQUESTVOTE: raft_recv_requestvote(me->raft, m->sender, m->data); break; case RAFT_MSG_REQUESTVOTE_RESPONSE: raft_recv_requestvote_response(me->raft, m->sender, m->data); break; case RAFT_MSG_ENTRY: raft_recv_entry(me->raft, m->sender, m->data); break; case RAFT_MSG_ENTRY_RESPONSE: //raft_recv_entry_response(me->raft, m->sender, m->data); break; } } }
/* Candidate 5.2 */ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log( CuTest * tc) { msg_requestvote_t rv; msg_requestvote_response_t rvr; void *r = raft_new(); raft_add_node(r, (void*)1, 1); raft_add_node(r, (void*)2, 0); /* request vote */ /* vote indicates candidate's log is not complete compared to follower */ memset(&rv, 0, sizeof(msg_requestvote_t)); rv.term = 1; rv.candidate_id = 1; rv.last_log_idx = 1; rv.last_log_term = 1; /* server's term and idx are more up-to-date */ raft_set_current_term(r, 1); raft_entry_t ety; ety.term = 1; ety.id = 100; ety.data.len = 4; ety.data.buf = (unsigned char*)"aaa"; raft_append_entry(r, &ety); ety.id = 101; raft_append_entry(r, &ety); /* vote not granted */ raft_recv_requestvote(r, 1, &rv, &rvr); CuAssertTrue(tc, 0 == rvr.vote_granted); }
int RaftConsensus::onReceivedRequestVote(const Connection::Ptr& pConnection, msg_requestvote_t& data) { OSS::mutex_lock lock(_raftMutex); int ret = 0; msg_requestvote_response_t response; ret = raft_recv_requestvote(_raft, pConnection->getNode().node(), &data, &response); if (ret != 0) { return ret; } return pConnection->onSendRequestVoteResponse(response); }
void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than_current_term( CuTest * tc ) { void *r = raft_new(); raft_add_node(r, (void*)1, 1); raft_add_node(r, (void*)2, 0); raft_become_candidate(r); raft_set_current_term(r, 1); /* current term is less than term */ msg_requestvote_t rv; memset(&rv, 0, sizeof(msg_requestvote_t)); rv.term = 2; rv.last_log_idx = 1; msg_requestvote_response_t rvr; raft_recv_requestvote(r, 1, &rv, &rvr); CuAssertTrue(tc, 1 == raft_is_follower(r)); }
/* Reply false if term < currentTerm (§5.1) */ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term( CuTest * tc ) { msg_requestvote_response_t rvr; void *r = raft_new(); raft_add_node(r, (void*)1, 1); raft_add_node(r, (void*)2, 0); raft_set_current_term(r, 2); /* term is less than current term */ msg_requestvote_t rv; memset(&rv, 0, sizeof(msg_requestvote_t)); rv.term = 1; raft_recv_requestvote(r, 1, &rv, &rvr); CuAssertTrue(tc, 0 == rvr.vote_granted); }
/* 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); }
/* Reply true if term >= currentTerm (§5.1) */ void TestRaft_server_recv_requestvote_reply_true_if_term_greater_than_or_equal_to_current_term( CuTest * tc ) { msg_requestvote_t rv; msg_requestvote_response_t rvr; void *r = raft_new(); raft_add_node(r, (void*)1, 1); raft_add_node(r, (void*)2, 0); raft_set_current_term(r, 1); /* term is less than current term */ memset(&rv, 0, sizeof(msg_requestvote_t)); rv.term = 2; rv.last_log_idx = 1; raft_recv_requestvote(r, 1, &rv, &rvr); CuAssertTrue(tc, 1 == rvr.vote_granted); }