Commit 0819b2e4 authored by willem's avatar willem
Browse files

Switched to int from void* for peer references

parent 825ca97e
......@@ -20,7 +20,7 @@ typedef struct {
void* inbox;
} sender_t;
int sender_send(void* caller, void* udata, void* peer, const unsigned char* data, int len)
int sender_send(void* caller, void* udata, int peer, const unsigned char* data, int len)
{
sender_t* me = caller;
unsigned char * n;
......
int sender_send(void* caller, void* udata, void* peer,
int sender_send(void* caller, void* udata, int peer,
const unsigned char* data, const int len);
void* sender_new();
......
......@@ -92,7 +92,7 @@ typedef int (
) (
void *caller,
void *udata,
void* peer,
int peer,
const unsigned char *send_data,
const int len
);
......@@ -151,11 +151,11 @@ int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae);
int raft_periodic(raft_server_t* me, int msec_since_last_period);
int raft_recv_appendentries(raft_server_t* me, void* peer, msg_appendentries_t* ae);
int raft_recv_appendentries(raft_server_t* me, int peer, msg_appendentries_t* ae);
int raft_recv_requestvote(raft_server_t* me, void* peer, msg_requestvote_t* vr);
int raft_recv_requestvote(raft_server_t* me, int peer, msg_requestvote_t* vr);
int raft_recv_requestvote_response(raft_server_t* me, void* peer, msg_requestvote_response_t* r);
int raft_recv_requestvote_response(raft_server_t* me, int peer, msg_requestvote_response_t* r);
void raft_execute_command(raft_server_t* me);
......@@ -163,15 +163,15 @@ void raft_set_election_timeout(raft_server_t* me, int millisec);
int raft_get_election_timeout(raft_server_t* me);
int raft_vote(raft_server_t* me, void* peer);
int raft_vote(raft_server_t* me, int peer);
raft_peer_t* raft_add_peer(raft_server_t* me, void* peer_udata);
raft_peer_t* raft_add_peer(raft_server_t* me, int peer_udata);
int raft_remove_peer(raft_server_t* me, void* peer);
int raft_remove_peer(raft_server_t* me, int peer);
int raft_get_num_peers(raft_server_t* me);
int raft_recv_command(raft_server_t* me, void* peer, msg_command_t* cmd);
int raft_recv_command(raft_server_t* me, int peer, msg_command_t* cmd);
int raft_get_log_count(raft_server_t* me);
......@@ -191,9 +191,9 @@ int raft_is_leader(raft_server_t* me);
int raft_is_candidate(raft_server_t* me);
int raft_send_requestvote(raft_server_t* me, void* peer);
int raft_send_requestvote(raft_server_t* me, int peer);
void raft_send_appendentries(raft_server_t* me, void* peer);
void raft_send_appendentries(raft_server_t* me, int peer);
int raft_append_command(raft_server_t* me, unsigned char* data, int len);
......
......@@ -77,7 +77,10 @@ typedef struct {
/* amount of time left till timeout */
int timeout_elapased;
hashmap_t* peers;
raft_peer_t* peers;
int npeers;
// hashmap_t* peers;
// int log_Size;
} raft_server_private_t;
......@@ -106,7 +109,7 @@ raft_server_t* raft_new()
me = calloc(1,sizeof(raft_server_private_t));
me->current_index = 0;
me->timeout_elapased = 0;
me->peers = hashmap_new(__peer_hash, __peer_compare, 100);
// me->peers = hashmap_new(__peer_hash, __peer_compare, 100);
return (void*)me;
}
......@@ -149,15 +152,17 @@ void raft_become_leader(raft_server_t* me_)
void raft_become_candidate(raft_server_t* me_)
{
raft_server_private_t* me = (void*)me_;
hashmap_iterator_t iter;
// hashmap_iterator_t iter;
void* p;
int ii;
me->current_term += 1;
me->voted_for = me;
me->timeout_elapased = 0;
for (hashmap_iterator(me->peers, &iter);
(p = hashmap_iterator_next_value(me->peers, &iter));)
// for (hashmap_iterator(me->peers, &iter);
// (p = hashmap_iterator_next_value(me->peers, &iter));)
for (ii=0; ii<me->npeers; ii++)
{
msg_requestvote_t rv;
......@@ -166,7 +171,7 @@ void raft_become_candidate(raft_server_t* me_)
// rv.last_log_index = me->log
if (me->ext_func && me->ext_func->send)
me->ext_func->send(me->caller,NULL, NULL, (void*)&rv, sizeof(msg_requestvote_t));
me->ext_func->send(me->caller,NULL, ii, (void*)&rv, sizeof(msg_requestvote_t));
}
}
......@@ -203,22 +208,22 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
/**
* Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */
int raft_recv_appendentries(raft_server_t* me_, void* peer, msg_appendentries_t* ae)
int raft_recv_appendentries(raft_server_t* me_, int peer, msg_appendentries_t* ae)
{
return 0;
}
int raft_recv_appendentries_response(raft_server_t* me_, void* peer, msg_appendentries_response_t* ae)
int raft_recv_appendentries_response(raft_server_t* me_, int peer, msg_appendentries_response_t* ae)
{
return 0;
}
int raft_recv_requestvote(raft_server_t* me_, void* peer, msg_requestvote_t* vr)
int raft_recv_requestvote(raft_server_t* me_, int peer, msg_requestvote_t* vr)
{
return 0;
}
int raft_recv_requestvote_response(raft_server_t* me_, void* peer, msg_requestvote_response_t* r)
int raft_recv_requestvote_response(raft_server_t* me_, int peer, msg_requestvote_response_t* r)
{
return 0;
}
......@@ -245,12 +250,13 @@ int raft_get_request_timeout(raft_server_t* me_)
return 0;
}
int raft_vote(raft_server_t* me_, void* peer)
int raft_vote(raft_server_t* me_, int peer)
{
return 0;
}
raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata)
#if 0
raft_peer_t* raft_add_peer(raft_server_t* me_, int peer_udata)
{
raft_server_private_t* me = (void*)me_;
raft_peer_t* p;
......@@ -265,10 +271,11 @@ raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata)
return p;
}
int raft_remove_peer(raft_server_t* me_, void* peer)
int raft_remove_peer(raft_server_t* me_, int peer)
{
return 0;
}
#endif
int raft_get_num_peers(raft_server_t* me_)
{
......@@ -276,7 +283,7 @@ int raft_get_num_peers(raft_server_t* me_)
return 0;
}
int raft_recv_command(raft_server_t* me_, void* peer, msg_command_t* cmd)
int raft_recv_command(raft_server_t* me_, int peer, msg_command_t* cmd)
{
return 0;
}
......@@ -334,7 +341,7 @@ int raft_is_candidate(raft_server_t* me_)
return 0;
}
int raft_send_requestvote(raft_server_t* me_, void* peer)
int raft_send_requestvote(raft_server_t* me_, int peer)
{
return 0;
......@@ -368,12 +375,22 @@ void raft_commit_command(raft_server_t* me_, int logIndex)
}
void raft_send_appendentries(raft_server_t* me_, void* peer)
void raft_send_appendentries(raft_server_t* me_, int peer)
{
}
void raft_set_configuration(raft_server_t* me_, raft_peer_configuration_t* peers)
{
raft_server_private_t* me = (void*)me_;
int npeers = 0;
while (peers->udata_address)
{
npeers++;
me->peers = realloc(me->peers,sizeof(raft_peer_t*) * npeers);
me->npeers = npeers;
me->peers[npeers-1] = raft_peer_new(peers);
peers++;
}
}
......@@ -89,15 +89,15 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(CuTe
/* Candidate 5.2 */
void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
void *msg;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
/* 2 peers */
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
......@@ -111,32 +111,35 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C
sender = sender_new();
r = raft_new();
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE);
raft_periodic(r,1);
raft_recv_requestvote_response(r,peer,&vr);
raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 0 == raft_is_leader(r));
/* now has majority */
raft_recv_requestvote_response(r,peer,&vr);
raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 1 == raft_is_leader(r));
}
/* Candidate 5.2 */
void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
void *msg;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_requestvote_response_t vr;
memset(&vr,0,sizeof(msg_requestvote_response_t));
......@@ -146,24 +149,22 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
sender = sender_new();
r = raft_new();
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE);
raft_recv_requestvote_response(r,peer,&vr);
raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 0 == raft_is_leader(r));
/* now has majority */
raft_recv_requestvote_response(r,peer,&vr);
raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 1 == raft_is_leader(r));
}
/* Candidate 5.2 */
void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
void *msg;
raft_external_functions_t funcs = {
......@@ -171,6 +172,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t));
......@@ -180,11 +188,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
sender = sender_new();
r = raft_new();
raft_set_configuration(r,cfg);
raft_set_election_timeout(r,1000);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE);
......@@ -192,14 +199,14 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
CuAssertTrue(tc, 0 == raft_is_follower(r));
raft_periodic(r,1);
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r));
}
/* Candidate 5.2 */
void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
......@@ -207,18 +214,22 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
};
msg_requestvote_t* rv;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new();
r = raft_new();
raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_CANDIDATE);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,5);
raft_set_current_index(r,3);
raft_send_requestvote(r,peer);
raft_send_requestvote(r,1);
rv = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rv);
......@@ -229,7 +240,7 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
/* Candidate 5.2 */
void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
void *msg;
raft_external_functions_t funcs = {
......@@ -237,16 +248,20 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t));
sender = sender_new();
r = raft_new();
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
......@@ -254,34 +269,38 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
CuAssertTrue(tc, 0 == raft_is_follower(r));
raft_periodic(r,1);
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r));
}
/* Candidate 5.2 */
void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follower(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae;
sender = sender_new();
r = raft_new();
raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* server's log is newer */
raft_set_current_term(r,1);
raft_set_current_index(r,2);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* is a candidate */
raft_set_state(r,RAFT_STATE_CANDIDATE);
CuAssertTrue(tc, 0 == raft_is_follower(r));
......@@ -293,7 +312,7 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
ae.prev_log_term = 1;
/* appendentry from invalid leader doesn't make candidate become follower */
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_candidate(r));
}
......@@ -12,7 +12,7 @@
/* 5.1 */
void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
......@@ -21,9 +21,16 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
msg_appendentries_t ae;
msg_appendentries_response_t *aer;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
/* term is low */
memset(&ae,0,sizeof(msg_appendentries_t));
......@@ -32,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */
raft_set_current_term(r,5);
raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
/* response is false */
aer = sender_poll_msg(sender);
......@@ -42,22 +49,29 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(CuTest * tc)
{
void *r, *peer;
void *r;
msg_appendentries_t ae;
msg_appendentries_response_t *aer;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* newer term */
memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 2;
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
/* older currentterm */
raft_set_current_term(r,1);
/* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 2 == raft_get_current_term(r));
}
......@@ -65,19 +79,25 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* 5.3 */
void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
void *msg;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae;
msg_appendentries_response_t *aer;
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
/* log index that server doesn't have */
......@@ -89,7 +109,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
raft_set_current_term(r,5);
/* trigger reply */
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
aer = sender_poll_msg(sender);
/* reply is false */
......@@ -100,11 +120,17 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
/* 5.3 */
void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries(CuTest * tc)
{
void *r, *peer;
void *r;
msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_current_term(r,2);
......@@ -122,13 +148,13 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 2;
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 0 == raft_get_log_count(r));
}
void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
......@@ -136,6 +162,13 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
};
msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* appendentries has multiple entries */
memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 2;
......@@ -143,11 +176,11 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_current_term(r,1);
raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 0);
// msg = sender_poll_msg(sender);
......@@ -160,7 +193,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
//min(leaderCommit, last log index)
void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
......@@ -168,9 +201,15 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
};
msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
/* receive an appendentry with commit */
......@@ -181,14 +220,14 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
ae.leader_commit = 5;
/* receipt of appendentries changes commit index */
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
/* set to 4 because prevLogIdx is lower */
CuAssertTrue(tc, 4 == raft_get_commit_index(r));
}
void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
......@@ -196,9 +235,16 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
};
msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
/* receive an appendentry with commit */
......@@ -209,46 +255,54 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
ae.leader_commit = 3;
/* receipt of appendentries changes commit index */
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
/* set to 3 because leaderCommit is lower */
CuAssertTrue(tc, 3 == raft_get_commit_index(r));
}
void TestRaft_follower_increases_log_after_appendentry(CuTest * tc)
{
void *r, *peer;
void *r;
msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* appendentry */
memset(&ae,0,sizeof(msg_appendentries_t));
r = raft_new();
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_FOLLOWER);
/* log size s */
CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
}
void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones(CuTest * tc)
{
void *r, *peer;
void *r;
msg_appendentries_t ae;
r = raft_new();
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
r = raft_new();
raft_set_configuration(r,cfg);
raft_set_current_term(r,1);
......@@ -260,14 +314,14 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin
CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
}
#if 0
void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc)
{
void *r, *peer;
void *r;
msg_appendentries_t ae;
......@@ -292,16 +346,21 @@ void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest *
void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * tc)
{
void *r, *peer;
void *r;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
r = raft_new();
/* 1 second election timeout */
raft_set_election_timeout(r, 1000);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* 1.001 seconds have passed */
raft_periodic(r, 1001);
......@@ -313,23 +372,27 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * t
/* Candidate 5.2 */
void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_requestvote_t rv;
msg_requestvote_response_t *rvr;
sender = sender_new();
r = raft_new();
raft_set_external_functions(r,&funcs,sender);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* request vote */
/* vote indicates candidate's log is not complete compared to follower */
......@@ -344,7 +407,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTe
raft_set_current_index(r,2);
/* vote not granted */
raft_recv_requestvote(r,peer,&rv);
raft_recv_requestvote(r,1,&rv);
rvr = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rvr);
CuAssertTrue(tc, 0 == rvr->vote_granted);
......
......@@ -19,15 +19,18 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t* ae;
sender = sender_new();
r = raft_new();
raft_set_external_functions(r,&funcs,sender);
/* three nodes */
raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* candidate to leader */
raft_set_state(r,RAFT_STATE_CANDIDATE);
......@@ -43,20 +46,24 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
/* 5.2 */
void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest * tc)
{
void *r, *peer, *sender;
void *r, *sender;
msg_command_response_t *cr;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new();
r = raft_new();
raft_set_external_functions(r,&funcs,sender);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* I am the leader */
raft_set_state(r,RAFT_STATE_LEADER);
......@@ -69,7 +76,7 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
cmd.len = strlen("command");
/* receive command */
raft_recv_command(r,peer,&cmd);
raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
/* trigger response through commit */
......@@ -83,28 +90,32 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
/* 5.3 */
void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t* ae;
sender = sender_new();
r = raft_new();
raft_set_external_functions(r,&funcs,sender);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* i'm leader */
raft_set_state(r,RAFT_STATE_LEADER);
/* receive appendentries messages */
raft_send_appendentries(r,peer);
raft_send_appendentries(r,1);
ae = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != ae);
}
......@@ -112,28 +123,32 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
/* 5.3 */
void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency(CuTest * tc)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t* ae;
sender = sender_new();
r = raft_new();
raft_set_external_functions(r,&funcs,sender);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* i'm leader */
raft_set_state(r,RAFT_STATE_LEADER);
/* receive appendentries messages */
raft_send_appendentries(r,peer);
raft_send_appendentries(r,1);
ae = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != ae);
}
......@@ -146,7 +161,14 @@ set commitIndex = N (
void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
{
void *r, *peer;
void *r;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_command_t cmd;
cmd.id = 1;
......@@ -154,17 +176,23 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
cmd.len = strlen("command");
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_LEADER);
CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_command(r,peer,&cmd);
raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
}
void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc)
{
void *r, *peer;
void *r;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_command_t cmd;
cmd.id = 1;
......@@ -172,20 +200,20 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
cmd.len = strlen("command");
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_LEADER);
CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_command(r,peer,&cmd);
raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
raft_recv_command(r,peer,&cmd);
raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
}
void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry(CuTest * tc)
{
void *p1, *p2;
void *r;
void *sender;
raft_external_functions_t funcs = {
......@@ -194,12 +222,15 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
};
msg_appendentries_response_t aer;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new();
r = raft_new();
/* 3 nodes */
p1 = raft_add_peer(r,(void*)1);
p2 = raft_add_peer(r,(void*)2);
raft_set_configuration(r,cfg);
/* I'm the leader */
raft_set_state(r,RAFT_STATE_LEADER);
......@@ -210,8 +241,8 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
raft_set_commit_index(r,4);
raft_set_external_functions(r,&funcs,sender);
raft_send_appendentries(r, p1);
raft_send_appendentries(r, p2);
raft_send_appendentries(r, 1);
raft_send_appendentries(r, 2);
/* respond that we have the appendentries */
memset(&aer,0,sizeof(msg_appendentries_response_t));
......@@ -219,20 +250,26 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
aer.success = 1;
/* announce to leader that the majority have appended this log */
raft_recv_appendentries_response(r,p1,&aer);
raft_recv_appendentries_response(r,p2,&aer);
raft_recv_appendentries_response(r,1,&aer);
raft_recv_appendentries_response(r,2,&aer);
CuAssertTrue(tc, 5 == raft_get_commit_index(r));
}
void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(CuTest * tc)
{
void* peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
.log = NULL
};
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t));
......@@ -242,12 +279,13 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_LEADER);
raft_set_current_term(r,5);
raft_set_current_index(r,5);
raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,peer,&ae);
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r));
}
......
......@@ -37,7 +37,8 @@ void TestRaft_election_start_increments_term(CuTest * tc)
CuAssertTrue(tc, 2 == raft_get_current_term(r));
}
void TestRaft_add_peer(CuTest * tc)
#if 0
void T_estRaft_add_peer(CuTest * tc)
{
void *r;
......@@ -47,7 +48,7 @@ void TestRaft_add_peer(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
}
void TestRaft_dont_add_duplicate_peers(CuTest * tc)
void T_estRaft_dont_add_duplicate_peers(CuTest * tc)
{
void *r;
......@@ -58,7 +59,7 @@ void TestRaft_dont_add_duplicate_peers(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
}
void TestRaft_remove_peer(CuTest * tc)
void T_estRaft_remove_peer(CuTest * tc)
{
void *r;
void *peer;
......@@ -69,6 +70,7 @@ void TestRaft_remove_peer(CuTest * tc)
raft_remove_peer(r,peer);
CuAssertTrue(tc, 0 == raft_get_num_peers(r));
}
#endif
void TestRaft_set_state(CuTest * tc)
{
......
......@@ -18,7 +18,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
CuTest * tc
)
{
void *r, *peer;
void *r;
void *sender;
raft_external_functions_t funcs = {
.send = sender_send,
......@@ -27,17 +27,24 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
msg_requestvote_t rv;
msg_requestvote_response_t *rvr;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
memset(&rv,0,sizeof(msg_requestvote_t));
rv.term = 2;
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_current_term(r,1);
raft_set_external_functions(r,&funcs,sender);
raft_recv_requestvote(r,peer,&rv);
raft_recv_requestvote(r,1,&rv);
rvr = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rvr);
CuAssertTrue(tc, 0 == rvr->vote_granted);
......@@ -49,7 +56,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest * tc
)
{
void *r, *peer;
void *r;
void *sender;
void *msg;
raft_external_functions_t funcs = {
......@@ -59,18 +66,24 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
msg_requestvote_t rv;
msg_requestvote_response_t *rvr;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
memset(&rv,0,sizeof(msg_requestvote_response_t));
rv.term = 1;
sender = sender_new();
r = raft_new();
peer = raft_add_peer(r,(void*)1);
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
raft_vote(r,peer);
raft_recv_requestvote(r,peer,&rv);
raft_vote(r,1);
raft_recv_requestvote(r,1,&rv);
rvr = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rvr);
CuAssertTrue(tc, 0 == rvr->vote_granted);
......
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