Commit b07b44b0 authored by Willem Thiart's avatar Willem Thiart
Browse files

Replaced node idx with node pointer

parent 7690b4b7
...@@ -149,7 +149,7 @@ typedef int ( ...@@ -149,7 +149,7 @@ typedef int (
) ( ) (
raft_server_t* raft, raft_server_t* raft,
void *user_data, void *user_data,
int node, raft_node_t* node,
msg_requestvote_t* msg msg_requestvote_t* msg
); );
...@@ -164,7 +164,7 @@ typedef int ( ...@@ -164,7 +164,7 @@ typedef int (
) ( ) (
raft_server_t* raft, raft_server_t* raft,
void *user_data, void *user_data,
int node, raft_node_t* node,
msg_appendentries_t* msg msg_appendentries_t* msg
); );
...@@ -210,7 +210,7 @@ typedef int ( ...@@ -210,7 +210,7 @@ typedef int (
) ( ) (
raft_server_t* raft, raft_server_t* raft,
void *user_data, void *user_data,
const int voted_for int node
); );
/** Callback for saving log entry changes. /** Callback for saving log entry changes.
...@@ -307,17 +307,6 @@ void raft_free(raft_server_t* me); ...@@ -307,17 +307,6 @@ void raft_free(raft_server_t* me);
* @param[in] user_data "User data" - user's context that's included in a callback */ * @param[in] user_data "User data" - user's context that's included in a callback */
void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* user_data); void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* user_data);
/** Set configuration.
*
* @deprecated This function has been replaced by raft_add_node and
* raft_remove_node
*
* @param[in] nodes Array of nodes. End of array is marked by NULL entry
* @param[in] my_idx Index of the node that refers to this Raft server */
void raft_set_configuration(raft_server_t* me,
raft_node_configuration_t* nodes, int my_idx)
__attribute__ ((deprecated));
/** Add node. /** Add node.
* *
* @note This library does not yet support membership changes. * @note This library does not yet support membership changes.
...@@ -332,9 +321,11 @@ __attribute__ ((deprecated)); ...@@ -332,9 +321,11 @@ __attribute__ ((deprecated));
* Examples of what this could be: * Examples of what this could be:
* - void* pointing to implementor's networking data * - void* pointing to implementor's networking data
* - a (IP,Port) tuple * - a (IP,Port) tuple
* @param[in] id The integer ID of this node
* This is used for identifying clients across sessions.
* @param[in] is_self Set to 1 if this "node" is this server * @param[in] is_self Set to 1 if this "node" is this server
* @return 0 on success; otherwise -1 */ * @return 0 on success; otherwise -1 */
int raft_add_node(raft_server_t* me, void* user_data, int is_self); raft_node_t* raft_add_node(raft_server_t* me, void* user_data, int id, int is_self);
#define raft_add_peer raft_add_node #define raft_add_peer raft_add_node
...@@ -371,7 +362,7 @@ int raft_periodic(raft_server_t* me, int msec_elapsed); ...@@ -371,7 +362,7 @@ int raft_periodic(raft_server_t* me, int msec_elapsed);
* @param[out] r The resulting response * @param[out] r The resulting response
* @return 0 on success */ * @return 0 on success */
int raft_recv_appendentries(raft_server_t* me, int raft_recv_appendentries(raft_server_t* me,
int node, raft_node_t* node,
msg_appendentries_t* ae, msg_appendentries_t* ae,
msg_appendentries_response_t *r); msg_appendentries_response_t *r);
...@@ -380,7 +371,7 @@ int raft_recv_appendentries(raft_server_t* me, ...@@ -380,7 +371,7 @@ int raft_recv_appendentries(raft_server_t* me,
* @param[in] r The appendentries response message * @param[in] r The appendentries response message
* @return 0 on success */ * @return 0 on success */
int raft_recv_appendentries_response(raft_server_t* me, int raft_recv_appendentries_response(raft_server_t* me,
int node, raft_node_t* node,
msg_appendentries_response_t* r); msg_appendentries_response_t* r);
/** Receive a requestvote message. /** Receive a requestvote message.
...@@ -389,7 +380,7 @@ int raft_recv_appendentries_response(raft_server_t* me, ...@@ -389,7 +380,7 @@ int raft_recv_appendentries_response(raft_server_t* me,
* @param[out] r The resulting response * @param[out] r The resulting response
* @return 0 on success */ * @return 0 on success */
int raft_recv_requestvote(raft_server_t* me, int raft_recv_requestvote(raft_server_t* me,
int node, raft_node_t* node,
msg_requestvote_t* vr, msg_requestvote_t* vr,
msg_requestvote_response_t *r); msg_requestvote_response_t *r);
...@@ -398,7 +389,7 @@ int raft_recv_requestvote(raft_server_t* me, ...@@ -398,7 +389,7 @@ int raft_recv_requestvote(raft_server_t* me,
* @param[in] r The requestvote response message * @param[in] r The requestvote response message
* @return 0 on success */ * @return 0 on success */
int raft_recv_requestvote_response(raft_server_t* me, int raft_recv_requestvote_response(raft_server_t* me,
int node, raft_node_t* node,
msg_requestvote_response_t* r); msg_requestvote_response_t* r);
/** Receive an entry message from the client. /** Receive an entry message from the client.
...@@ -426,7 +417,7 @@ int raft_recv_requestvote_response(raft_server_t* me, ...@@ -426,7 +417,7 @@ int raft_recv_requestvote_response(raft_server_t* me,
* @param[out] r The resulting response * @param[out] r The resulting response
* @return 0 on success, -1 on failure */ * @return 0 on success, -1 on failure */
int raft_recv_entry(raft_server_t* me, int raft_recv_entry(raft_server_t* me,
int node, raft_node_t* node,
msg_entry_t* ety, msg_entry_t* ety,
msg_entry_response_t *r); msg_entry_response_t *r);
...@@ -506,7 +497,7 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me, int idx); ...@@ -506,7 +497,7 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me, int idx);
/** /**
* @param[in] node The node's index * @param[in] node The node's index
* @return node pointed to by node index */ * @return node pointed to by node index */
raft_node_t* raft_get_node(raft_server_t *me, int node); raft_node_t* raft_get_node(raft_server_t* me_, const int id);
/** /**
* @return number of votes this server has received this election */ * @return number of votes this server has received this election */
...@@ -532,7 +523,7 @@ int raft_get_my_id(raft_server_t* me); ...@@ -532,7 +523,7 @@ int raft_get_my_id(raft_server_t* me);
/** Vote for a server. /** Vote for a server.
* This should be used to reload persistent state, ie. the voted-for field. * This should be used to reload persistent state, ie. the voted-for field.
* @param[in] node The server to vote for */ * @param[in] node The server to vote for */
void raft_vote(raft_server_t* me, const int node); void raft_vote(raft_server_t* me_, raft_node_t* node);
/** Set the current term. /** Set the current term.
* This should be used to reload persistent state, ie. the current_term field. * This should be used to reload persistent state, ie. the current_term field.
...@@ -549,6 +540,10 @@ int raft_append_entry(raft_server_t* me, raft_entry_t* ety); ...@@ -549,6 +540,10 @@ int raft_append_entry(raft_server_t* me, raft_entry_t* ety);
int raft_msg_entry_response_committed(raft_server_t* me_, int raft_msg_entry_response_committed(raft_server_t* me_,
const msg_entry_response_t* r); const msg_entry_response_t* r);
/** Get node's ID.
* @return ID of node */
int raft_node_get_id(raft_node_t* me_);
/** Tell if we are a leader, candidate or follower. /** Tell if we are a leader, candidate or follower.
* @return get state of type raft_state_e. */ * @return get state of type raft_state_e. */
int raft_get_state(raft_server_t* me_); int raft_get_state(raft_server_t* me_);
......
...@@ -21,7 +21,7 @@ typedef struct { ...@@ -21,7 +21,7 @@ typedef struct {
/* The candidate the server voted for in its current term, /* The candidate the server voted for in its current term,
* or Nil if it hasn't voted for any. */ * or Nil if it hasn't voted for any. */
int voted_for; raft_node_t* voted_for;
/* the log which is replicated */ /* the log which is replicated */
void* log; void* log;
...@@ -40,9 +40,6 @@ typedef struct { ...@@ -40,9 +40,6 @@ typedef struct {
/* amount of time left till timeout */ /* amount of time left till timeout */
int timeout_elapsed; int timeout_elapsed;
/* who has voted for me. This is an array with N = 'num_nodes' elements */
int *votes_for_me;
raft_node_t* nodes; raft_node_t* nodes;
int num_nodes; int num_nodes;
...@@ -51,14 +48,14 @@ typedef struct { ...@@ -51,14 +48,14 @@ typedef struct {
/* what this node thinks is the node ID of the current leader, or -1 if /* what this node thinks is the node ID of the current leader, or -1 if
* there isn't a known current leader. */ * there isn't a known current leader. */
int current_leader; raft_node_t* current_leader;
/* callbacks */ /* callbacks */
raft_cbs_t cb; raft_cbs_t cb;
void* udata; void* udata;
/* my node ID */ /* my node ID */
int nodeid; raft_node_t* node;
} raft_server_private_t; } raft_server_private_t;
void raft_election_start(raft_server_t* me); void raft_election_start(raft_server_t* me);
...@@ -69,15 +66,15 @@ void raft_become_candidate(raft_server_t* me); ...@@ -69,15 +66,15 @@ void raft_become_candidate(raft_server_t* me);
void raft_become_follower(raft_server_t* me); void raft_become_follower(raft_server_t* me);
void raft_vote(raft_server_t* me, int node); void raft_vote(raft_server_t* me, raft_node_t* node);
void raft_set_current_term(raft_server_t* me,int term); void raft_set_current_term(raft_server_t* me,int term);
/** /**
* @return 0 on error */ * @return 0 on error */
int raft_send_requestvote(raft_server_t* me, int node); int raft_send_requestvote(raft_server_t* me, raft_node_t* node);
void raft_send_appendentries(raft_server_t* me, int node); int raft_send_appendentries(raft_server_t* me, raft_node_t* node);
void raft_send_appendentries_all(raft_server_t* me_); void raft_send_appendentries_all(raft_server_t* me_);
...@@ -101,7 +98,7 @@ void raft_set_state(raft_server_t* me_, int state); ...@@ -101,7 +98,7 @@ void raft_set_state(raft_server_t* me_, int state);
int raft_get_state(raft_server_t* me_); int raft_get_state(raft_server_t* me_);
raft_node_t* raft_node_new(void* udata); raft_node_t* raft_node_new(void* udata, int id);
void raft_node_set_next_idx(raft_node_t* node, int nextIdx); void raft_node_set_next_idx(raft_node_t* node, int nextIdx);
...@@ -109,6 +106,10 @@ void raft_node_set_match_idx(raft_node_t* node, int matchIdx); ...@@ -109,6 +106,10 @@ void raft_node_set_match_idx(raft_node_t* node, int matchIdx);
int raft_node_get_match_idx(raft_node_t* me_); int raft_node_get_match_idx(raft_node_t* me_);
void raft_node_vote_for_me(raft_node_t* me_, const int vote);
int raft_node_has_vote_for_me(raft_node_t* me_);
int raft_votes_is_majority(const int nnodes, const int nvotes); int raft_votes_is_majority(const int nnodes, const int nvotes);
#endif /* RAFT_PRIVATE_H_ */ #endif /* RAFT_PRIVATE_H_ */
...@@ -19,17 +19,24 @@ ...@@ -19,17 +19,24 @@
typedef struct typedef struct
{ {
void* udata; void* udata;
int next_idx; int next_idx;
int match_idx; int match_idx;
/* 1 if node has voted for me */
int voted_for_me;
int id;
} raft_node_private_t; } raft_node_private_t;
raft_node_t* raft_node_new(void* udata) raft_node_t* raft_node_new(void* udata, int id)
{ {
raft_node_private_t* me; raft_node_private_t* me;
me = (raft_node_private_t*)calloc(1, sizeof(raft_node_private_t)); me = (raft_node_private_t*)calloc(1, sizeof(raft_node_private_t));
me->udata = udata; me->udata = udata;
me->next_idx = 1; me->next_idx = 1;
me->match_idx = 0; me->match_idx = 0;
me->id = id;
return (raft_node_t*)me; return (raft_node_t*)me;
} }
...@@ -69,3 +76,21 @@ void raft_node_set_udata(raft_node_t* me_, void* udata) ...@@ -69,3 +76,21 @@ void raft_node_set_udata(raft_node_t* me_, void* udata)
raft_node_private_t* me = (raft_node_private_t*)me_; raft_node_private_t* me = (raft_node_private_t*)me_;
me->udata = udata; me->udata = udata;
} }
void raft_node_vote_for_me(raft_node_t* me_, const int vote)
{
raft_node_private_t* me = (raft_node_private_t*)me_;
me->voted_for_me = vote;
}
int raft_node_has_vote_for_me(raft_node_t* me_)
{
raft_node_private_t* me = (raft_node_private_t*)me_;
return me->voted_for_me;
}
int raft_node_get_id(raft_node_t* me_)
{
raft_node_private_t* me = (raft_node_private_t*)me_;
return me->id;
}
...@@ -44,13 +44,13 @@ raft_server_t* raft_new() ...@@ -44,13 +44,13 @@ raft_server_t* raft_new()
if (!me) if (!me)
return NULL; return NULL;
me->current_term = 0; me->current_term = 0;
me->voted_for = -1; me->voted_for = NULL;
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
me->request_timeout = 200; me->request_timeout = 200;
me->election_timeout = 1000; me->election_timeout = 1000;
me->log = log_new(); me->log = log_new();
raft_set_state((raft_server_t*)me, RAFT_STATE_FOLLOWER); raft_set_state((raft_server_t*)me, RAFT_STATE_FOLLOWER);
me->current_leader = -1; me->current_leader = NULL;
return (raft_server_t*)me; return (raft_server_t*)me;
} }
...@@ -92,12 +92,12 @@ void raft_become_leader(raft_server_t* me_) ...@@ -92,12 +92,12 @@ void raft_become_leader(raft_server_t* me_)
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
{ {
if (me->nodeid != i) if (me->node != me->nodes[i])
{ {
raft_node_t* node = raft_get_node(me_, i); raft_node_t* node = me->nodes[i];
raft_node_set_next_idx(node, raft_get_current_idx(me_) + 1); raft_node_set_next_idx(node, raft_get_current_idx(me_) + 1);
raft_node_set_match_idx(node, 0); raft_node_set_match_idx(node, 0);
raft_send_appendentries(me_, i); raft_send_appendentries(me_, node);
} }
} }
} }
...@@ -109,10 +109,11 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -109,10 +109,11 @@ void raft_become_candidate(raft_server_t* me_)
__log(me_, "becoming candidate"); __log(me_, "becoming candidate");
memset(me->votes_for_me, 0, sizeof(int) * me->num_nodes); for (i = 0; i < me->num_nodes; i++)
raft_node_vote_for_me(me->nodes[i], 0);
me->current_term += 1; me->current_term += 1;
raft_vote(me_, me->nodeid); raft_vote(me_, me->node);
me->current_leader = -1; me->current_leader = NULL;
raft_set_state(me_, RAFT_STATE_CANDIDATE); raft_set_state(me_, RAFT_STATE_CANDIDATE);
/* we need a random factor here to prevent simultaneous candidates */ /* we need a random factor here to prevent simultaneous candidates */
...@@ -120,8 +121,8 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -120,8 +121,8 @@ void raft_become_candidate(raft_server_t* me_)
me->timeout_elapsed = rand() % me->election_timeout; me->timeout_elapsed = rand() % me->election_timeout;
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
if (me->nodeid != i) if (me->node != me->nodes[i])
raft_send_requestvote(me_, i); raft_send_requestvote(me_, me->nodes[i]);
} }
void raft_become_follower(raft_server_t* me_) void raft_become_follower(raft_server_t* me_)
...@@ -163,21 +164,22 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int etyidx) ...@@ -163,21 +164,22 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int etyidx)
} }
int raft_recv_appendentries_response(raft_server_t* me_, int raft_recv_appendentries_response(raft_server_t* me_,
int node_idx, raft_node_t* node,
msg_appendentries_response_t* r) msg_appendentries_response_t* r)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
assert(node);
assert(node != me->node);
__log(me_, __log(me_,
"received appendentries response node: %d %s cidx: %d 1stidx: %d", "received appendentries response node: %d %s cidx: %d 1stidx: %d",
node_idx, r->success == 1 ? "success" : "fail", r->current_idx, node, r->success == 1 ? "success" : "fail", r->current_idx,
r->first_idx); r->first_idx);
if (!raft_is_leader(me_)) if (!raft_is_leader(me_))
return -1; return -1;
raft_node_t* node = raft_get_node(me_, node_idx);
/* If response contains term T > currentTerm: set currentTerm = T /* If response contains term T > currentTerm: set currentTerm = T
and convert to follower (§5.3) */ and convert to follower (§5.3) */
if (me->current_term < r->term) if (me->current_term < r->term)
...@@ -203,7 +205,7 @@ int raft_recv_appendentries_response(raft_server_t* me_, ...@@ -203,7 +205,7 @@ int raft_recv_appendentries_response(raft_server_t* me_,
raft_node_set_next_idx(node, next_idx - 1); raft_node_set_next_idx(node, next_idx - 1);
/* retry */ /* retry */
raft_send_appendentries(me_, node_idx); raft_send_appendentries(me_, node);
return 0; return 0;
} }
...@@ -222,7 +224,7 @@ int raft_recv_appendentries_response(raft_server_t* me_, ...@@ -222,7 +224,7 @@ int raft_recv_appendentries_response(raft_server_t* me_,
int i; int i;
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
{ {
if (me->nodeid == i) if (me->node == me->nodes[i])
continue; continue;
int match_idx = raft_node_get_match_idx(me->nodes[i]); int match_idx = raft_node_get_match_idx(me->nodes[i]);
...@@ -240,7 +242,7 @@ int raft_recv_appendentries_response(raft_server_t* me_, ...@@ -240,7 +242,7 @@ int raft_recv_appendentries_response(raft_server_t* me_,
/* Aggressively send remaining entries */ /* Aggressively send remaining entries */
if (raft_get_entry_from_idx(me_, raft_node_get_next_idx(node))) if (raft_get_entry_from_idx(me_, raft_node_get_next_idx(node)))
raft_send_appendentries(me_, node_idx); raft_send_appendentries(me_, node);
/* periodic applies committed entries lazily */ /* periodic applies committed entries lazily */
...@@ -249,13 +251,16 @@ int raft_recv_appendentries_response(raft_server_t* me_, ...@@ -249,13 +251,16 @@ int raft_recv_appendentries_response(raft_server_t* me_,
int raft_recv_appendentries( int raft_recv_appendentries(
raft_server_t* me_, raft_server_t* me_,
const int node, raft_node_t* node,
msg_appendentries_t* ae, msg_appendentries_t* ae,
msg_appendentries_response_t *r msg_appendentries_response_t *r
) )
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
assert(node);
assert(node != me->node);
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
if (0 < ae->n_entries) if (0 < ae->n_entries)
...@@ -271,7 +276,7 @@ int raft_recv_appendentries( ...@@ -271,7 +276,7 @@ int raft_recv_appendentries(
if (raft_is_candidate(me_) && me->current_term == ae->term) if (raft_is_candidate(me_) && me->current_term == ae->term)
{ {
me->voted_for = -1; me->voted_for = NULL;
raft_become_follower(me_); raft_become_follower(me_);
} }
else if (me->current_term < ae->term) else if (me->current_term < ae->term)
...@@ -383,7 +388,7 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr) ...@@ -383,7 +388,7 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
/* TODO: if voted for is candiate return 1 (if below checks pass) */ /* TODO: if voted for is candiate return 1 (if below checks pass) */
/* we've already voted */ /* we've already voted */
if (-1 != me->voted_for) if (me->voted_for)
return 0; return 0;
int current_idx = raft_get_current_idx((void*)me); int current_idx = raft_get_current_idx((void*)me);
...@@ -400,14 +405,17 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr) ...@@ -400,14 +405,17 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
return 0; return 0;
} }
int raft_recv_requestvote(raft_server_t* me_, int raft_recv_requestvote(raft_server_t* me_,
int node, raft_node_t* node,
msg_requestvote_t* vr, msg_requestvote_t* vr,
msg_requestvote_response_t *r) msg_requestvote_response_t *r)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
assert(node);
assert(node != me->node);
if (raft_get_current_term(me_) < vr->term) if (raft_get_current_term(me_) < vr->term)
{ {
raft_set_current_term(me_, vr->term); raft_set_current_term(me_, vr->term);
...@@ -424,7 +432,7 @@ int raft_recv_requestvote(raft_server_t* me_, ...@@ -424,7 +432,7 @@ int raft_recv_requestvote(raft_server_t* me_,
r->vote_granted = 1; r->vote_granted = 1;
/* there must be in an election. */ /* there must be in an election. */
me->current_leader = -1; me->current_leader = NULL;
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
} }
...@@ -447,19 +455,20 @@ int raft_votes_is_majority(const int num_nodes, const int nvotes) ...@@ -447,19 +455,20 @@ int raft_votes_is_majority(const int num_nodes, const int nvotes)
} }
int raft_recv_requestvote_response(raft_server_t* me_, int raft_recv_requestvote_response(raft_server_t* me_,
int node, raft_node_t* node,
msg_requestvote_response_t* r) msg_requestvote_response_t* r)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
assert(node);
assert(node != me->node);
__log(me_, "node responded to requestvote: %d status: %s", __log(me_, "node responded to requestvote: %d status: %s",
node, r->vote_granted == 1 ? "granted" : "not granted"); node, r->vote_granted == 1 ? "granted" : "not granted");
if (!raft_is_candidate(me_)) if (!raft_is_candidate(me_))
return 0; return 0;
assert(node < me->num_nodes);
if (raft_get_current_term(me_) < r->term) if (raft_get_current_term(me_) < r->term)
{ {
raft_set_current_term(me_, r->term); raft_set_current_term(me_, r->term);
...@@ -476,7 +485,7 @@ int raft_recv_requestvote_response(raft_server_t* me_, ...@@ -476,7 +485,7 @@ int raft_recv_requestvote_response(raft_server_t* me_,
if (1 == r->vote_granted) if (1 == r->vote_granted)
{ {
me->votes_for_me[node] = 1; raft_node_vote_for_me(node, 1);
int votes = raft_get_nvotes_for_me(me_); int votes = raft_get_nvotes_for_me(me_);
if (raft_votes_is_majority(me->num_nodes, votes)) if (raft_votes_is_majority(me->num_nodes, votes))
raft_become_leader(me_); raft_become_leader(me_);
...@@ -485,7 +494,7 @@ int raft_recv_requestvote_response(raft_server_t* me_, ...@@ -485,7 +494,7 @@ int raft_recv_requestvote_response(raft_server_t* me_,
return 0; return 0;
} }
int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e, int raft_recv_entry(raft_server_t* me_, raft_node_t* node, msg_entry_t* e,
msg_entry_response_t *r) msg_entry_response_t *r)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
...@@ -505,11 +514,11 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e, ...@@ -505,11 +514,11 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e,
/* Only send new entries. /* Only send new entries.
* Don't send the entry to peers who are behind, to prevent them from * Don't send the entry to peers who are behind, to prevent them from
* becomming congested. */ * becomming congested. */
if (me->nodeid != i) if (me->node != me->nodes[i])
{ {
int next_idx = raft_node_get_next_idx(raft_get_node(me_, i)); int next_idx = raft_node_get_next_idx(me->nodes[i]);
if (next_idx == raft_get_current_idx(me_)) if (next_idx == raft_get_current_idx(me_))
raft_send_appendentries(me_, i); raft_send_appendentries(me_, me->nodes[i]);
} }
/* if we're the only node, we can consider the entry committed */ /* if we're the only node, we can consider the entry committed */
...@@ -522,11 +531,14 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e, ...@@ -522,11 +531,14 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e,
return 0; return 0;
} }
int raft_send_requestvote(raft_server_t* me_, int node) int raft_send_requestvote(raft_server_t* me_, raft_node_t* node)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
msg_requestvote_t rv; msg_requestvote_t rv;
assert(node);
assert(node != me->node);
__log(me_, "sending requestvote to: %d", node); __log(me_, "sending requestvote to: %d", node);
rv.term = me->current_term; rv.term = me->current_term;
...@@ -564,14 +576,15 @@ int raft_apply_entry(raft_server_t* me_) ...@@ -564,14 +576,15 @@ int raft_apply_entry(raft_server_t* me_)
return 0; return 0;
} }
void raft_send_appendentries(raft_server_t* me_, int node_idx) int raft_send_appendentries(raft_server_t* me_, raft_node_t* node)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
if (!(me->cb.send_appendentries)) assert(node);
return; assert(node != me->node);
raft_node_t* node = raft_get_node(me_, node_idx); if (!(me->cb.send_appendentries))
return -1;
msg_appendentries_t ae; msg_appendentries_t ae;
ae.term = me->current_term; ae.term = me->current_term;
...@@ -607,13 +620,15 @@ void raft_send_appendentries(raft_server_t* me_, int node_idx) ...@@ -607,13 +620,15 @@ void raft_send_appendentries(raft_server_t* me_, int node_idx)
} }
__log(me_, "sending appendentries node: %d, %d %d %d %d", __log(me_, "sending appendentries node: %d, %d %d %d %d",
node_idx, node,
ae.term, ae.term,
ae.leader_commit, ae.leader_commit,
ae.prev_log_idx, ae.prev_log_idx,
ae.prev_log_term); ae.prev_log_term);
me->cb.send_appendentries(me_, me->udata, node_idx, &ae); me->cb.send_appendentries(me_, me->udata, node, &ae);
return 0;
} }
void raft_send_appendentries_all(raft_server_t* me_) void raft_send_appendentries_all(raft_server_t* me_)
...@@ -623,48 +638,27 @@ void raft_send_appendentries_all(raft_server_t* me_) ...@@ -623,48 +638,27 @@ void raft_send_appendentries_all(raft_server_t* me_)
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
if (me->nodeid != i) if (me->node != me->nodes[i])
raft_send_appendentries(me_, i); raft_send_appendentries(me_, me->nodes[i]);
} }
void raft_set_configuration(raft_server_t* me_, raft_node_t* raft_add_node(raft_server_t* me_, void* udata, int id, int is_self)
raft_node_configuration_t* nodes, int my_idx)
{
raft_server_private_t* me = (raft_server_private_t*)me_;
int num_nodes;
/* TODO: one memory allocation only please */
for (num_nodes = 0; nodes->udata_address; nodes++)
{
num_nodes++;
me->nodes =
(raft_node_t*)realloc(me->nodes, sizeof(raft_node_t*) * num_nodes);
me->num_nodes = num_nodes;
me->nodes[num_nodes - 1] = raft_node_new(nodes->udata_address);
}
me->votes_for_me = (int*)calloc(num_nodes, sizeof(int));
me->nodeid = my_idx;
}
int raft_add_node(raft_server_t* me_, void* udata, int is_self)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
/* TODO: does not yet support dynamic membership changes */ /* TODO: does not yet support dynamic membership changes */
if (me->current_term != 0 && me->timeout_elapsed != 0 && if (me->current_term != 0 && me->timeout_elapsed != 0 &&
me->election_timeout != 0) me->election_timeout != 0)
return -1; return NULL;
me->num_nodes++; me->num_nodes++;
me->nodes = me->nodes = (raft_node_t*)realloc(me->nodes, sizeof(raft_node_t*) * me->num_nodes);
(raft_node_t*)realloc(me->nodes, sizeof(raft_node_t*) * me->num_nodes); me->nodes[me->num_nodes - 1] = raft_node_new(udata, id);
me->nodes[me->num_nodes - 1] = raft_node_new(udata); assert(me->nodes[me->num_nodes - 1]);
me->votes_for_me =
(int*)realloc(me->votes_for_me, me->num_nodes * sizeof(int));
me->votes_for_me[me->num_nodes - 1] = 0;
if (is_self) if (is_self)
me->nodeid = me->num_nodes - 1; me->node = me->nodes[me->num_nodes - 1];
return 0;
return me->nodes[me->num_nodes - 1];
} }
int raft_get_nvotes_for_me(raft_server_t* me_) int raft_get_nvotes_for_me(raft_server_t* me_)
...@@ -673,22 +667,23 @@ int raft_get_nvotes_for_me(raft_server_t* me_) ...@@ -673,22 +667,23 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
int i, votes; int i, votes;
for (i = 0, votes = 0; i < me->num_nodes; i++) for (i = 0, votes = 0; i < me->num_nodes; i++)
if (me->nodeid != i) if (me->node != me->nodes[i])
if (1 == me->votes_for_me[i]) if (raft_node_has_vote_for_me(me->nodes[i]))
votes += 1; votes += 1;
if (me->voted_for == me->nodeid) if (me->voted_for == me->node)
votes += 1; votes += 1;
return votes; return votes;
} }
void raft_vote(raft_server_t* me_, const int node) void raft_vote(raft_server_t* me_, raft_node_t* node)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
me->voted_for = node; me->voted_for = node;
if (me->cb.persist_vote) if (me->cb.persist_vote)
me->cb.persist_vote(me_, me->udata, node); me->cb.persist_vote(me_, me->udata, raft_node_get_id(node));
} }
int raft_msg_entry_response_committed(raft_server_t* me_, int raft_msg_entry_response_committed(raft_server_t* me_,
......
...@@ -34,7 +34,7 @@ void raft_set_request_timeout(raft_server_t* me_, int millisec) ...@@ -34,7 +34,7 @@ void raft_set_request_timeout(raft_server_t* me_, int millisec)
int raft_get_nodeid(raft_server_t* me_) int raft_get_nodeid(raft_server_t* me_)
{ {
return ((raft_server_private_t*)me_)->nodeid; return raft_node_get_id(((raft_server_private_t*)me_)->node);
} }
int raft_get_election_timeout(raft_server_t* me_) int raft_get_election_timeout(raft_server_t* me_)
...@@ -65,7 +65,10 @@ int raft_get_log_count(raft_server_t* me_) ...@@ -65,7 +65,10 @@ int raft_get_log_count(raft_server_t* me_)
int raft_get_voted_for(raft_server_t* me_) int raft_get_voted_for(raft_server_t* me_)
{ {
return ((raft_server_private_t*)me_)->voted_for; raft_server_private_t* me = (raft_server_private_t*)me_;
if (me->voted_for)
return raft_node_get_id(me->voted_for);
return -1;
} }
void raft_set_current_term(raft_server_t* me_, const int term) void raft_set_current_term(raft_server_t* me_, const int term)
...@@ -74,7 +77,7 @@ void raft_set_current_term(raft_server_t* me_, const int term) ...@@ -74,7 +77,7 @@ void raft_set_current_term(raft_server_t* me_, const int term)
if (me->current_term < term) if (me->current_term < term)
{ {
me->current_term = term; me->current_term = term;
me->voted_for = -1; me->voted_for = NULL;
if (me->cb.persist_term) if (me->cb.persist_term)
me->cb.persist_term(me_, me->udata, term); me->cb.persist_term(me_, me->udata, term);
} }
...@@ -120,7 +123,7 @@ void raft_set_state(raft_server_t* me_, int state) ...@@ -120,7 +123,7 @@ void raft_set_state(raft_server_t* me_, int state)
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
/* if became the leader, then update the current leader entry */ /* if became the leader, then update the current leader entry */
if (state == RAFT_STATE_LEADER) if (state == RAFT_STATE_LEADER)
me->current_leader = me->nodeid; me->current_leader = me->node;
me->state = state; me->state = state;
} }
...@@ -132,16 +135,21 @@ int raft_get_state(raft_server_t* me_) ...@@ -132,16 +135,21 @@ int raft_get_state(raft_server_t* me_)
raft_node_t* raft_get_node(raft_server_t *me_, int nodeid) raft_node_t* raft_get_node(raft_server_t *me_, int nodeid)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
int i;
for (i=0; i<me->num_nodes; i++)
if (nodeid == raft_node_get_id(me->nodes[i]))
return me->nodes[i];
if (nodeid < 0 || me->num_nodes <= nodeid) return NULL;
return NULL;
return (raft_node_t*)me->nodes[nodeid];
} }
int raft_get_current_leader(raft_server_t* me_) int raft_get_current_leader(raft_server_t* me_)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
return me->current_leader; if (me->current_leader)
return raft_node_get_id(me->current_leader);
return -1;
} }
void* raft_get_udata(raft_server_t* me_) void* raft_get_udata(raft_server_t* me_)
......
...@@ -31,7 +31,7 @@ typedef struct ...@@ -31,7 +31,7 @@ typedef struct
/* what type of message is it? */ /* what type of message is it? */
int type; int type;
/* who sent this? */ /* who sent this? */
int sender; raft_node_t* sender;
} msg_t; } msg_t;
static sender_t** __senders = NULL; static sender_t** __senders = NULL;
...@@ -48,7 +48,7 @@ static int __append_msg( ...@@ -48,7 +48,7 @@ static int __append_msg(
void* data, void* data,
int type, int type,
int len, int len,
int peer, raft_node_t* node,
raft_server_t* raft raft_server_t* raft
) )
{ {
...@@ -56,53 +56,60 @@ static int __append_msg( ...@@ -56,53 +56,60 @@ static int __append_msg(
m->type = type; m->type = type;
m->len = len; m->len = len;
m->data = malloc(len); m->data = malloc(len);
m->sender = raft_get_nodeid(raft); m->sender = raft_get_node(raft, raft_get_nodeid(raft));
memcpy(m->data, data, len); memcpy(m->data, data, len);
llqueue_offer(me->outbox, m); llqueue_offer(me->outbox, m);
if (__nsenders > peer) /* give to peer */
llqueue_offer(__senders[peer]->inbox, m); sender_t* peer = raft_node_get_udata(node);
if (peer)
{
msg_t* m2 = malloc(sizeof(msg_t));
memcpy(m2, m, sizeof(msg_t));
m2->sender = raft_get_node(peer->raft, raft_get_nodeid(raft));
llqueue_offer(peer->inbox, m2);
}
return 1; return 1;
} }
int sender_requestvote(raft_server_t* raft, int sender_requestvote(raft_server_t* raft,
void* udata, int peer, msg_requestvote_t* msg) void* udata, raft_node_t* node, msg_requestvote_t* msg)
{ {
return __append_msg(udata, msg, RAFT_MSG_REQUESTVOTE, sizeof(*msg), peer, return __append_msg(udata, msg, RAFT_MSG_REQUESTVOTE, sizeof(*msg), node,
raft); raft);
} }
int sender_requestvote_response(raft_server_t* raft, int sender_requestvote_response(raft_server_t* raft,
void* udata, int peer, void* udata, raft_node_t* node,
msg_requestvote_response_t* msg) msg_requestvote_response_t* msg)
{ {
return __append_msg(udata, msg, RAFT_MSG_REQUESTVOTE_RESPONSE, sizeof(*msg), return __append_msg(udata, msg, RAFT_MSG_REQUESTVOTE_RESPONSE, sizeof(*msg),
peer, raft); node, raft);
} }
int sender_appendentries(raft_server_t* raft, int sender_appendentries(raft_server_t* raft,
void* udata, int peer, msg_appendentries_t* msg) void* udata, raft_node_t* node, msg_appendentries_t* msg)
{ {
msg_entry_t* entries = calloc(1, sizeof(msg_entry_t) * msg->n_entries); msg_entry_t* entries = calloc(1, sizeof(msg_entry_t) * msg->n_entries);
memcpy(entries, msg->entries, sizeof(msg_entry_t) * msg->n_entries); memcpy(entries, msg->entries, sizeof(msg_entry_t) * msg->n_entries);
msg->entries = entries; msg->entries = entries;
return __append_msg(udata, msg, RAFT_MSG_APPENDENTRIES, sizeof(*msg), peer, return __append_msg(udata, msg, RAFT_MSG_APPENDENTRIES, sizeof(*msg), node,
raft); raft);
} }
int sender_appendentries_response(raft_server_t* raft, int sender_appendentries_response(raft_server_t* raft,
void* udata, int peer, void* udata, raft_node_t* node,
msg_appendentries_response_t* msg) msg_appendentries_response_t* msg)
{ {
return __append_msg(udata, msg, RAFT_MSG_APPENDENTRIES_RESPONSE, return __append_msg(udata, msg, RAFT_MSG_APPENDENTRIES_RESPONSE,
sizeof(*msg), peer, raft); sizeof(*msg), node, raft);
} }
int sender_entries_response(raft_server_t* raft, int sender_entries_response(raft_server_t* raft,
void* udata, int peer, msg_entry_response_t* msg) void* udata, raft_node_t* node, msg_entry_response_t* msg)
{ {
return __append_msg(udata, msg, RAFT_MSG_ENTRY_RESPONSE, sizeof(*msg), peer, return __append_msg(udata, msg, RAFT_MSG_ENTRY_RESPONSE, sizeof(*msg), node,
raft); raft);
} }
......
...@@ -24,21 +24,21 @@ int sender_msgs_available(void* s); ...@@ -24,21 +24,21 @@ int sender_msgs_available(void* s);
void sender_set_raft(void* s, void* r); void sender_set_raft(void* s, void* r);
int sender_requestvote(raft_server_t* raft, int sender_requestvote(raft_server_t* raft,
void* udata, int peer, msg_requestvote_t* msg); void* udata, raft_node_t* node, msg_requestvote_t* msg);
int sender_requestvote_response(raft_server_t* raft, int sender_requestvote_response(raft_server_t* raft,
void* udata, int peer, msg_requestvote_response_t* msg); void* udata, raft_node_t* node, msg_requestvote_response_t* msg);
int sender_appendentries(raft_server_t* raft, int sender_appendentries(raft_server_t* raft,
void* udata, int peer, msg_appendentries_t* msg); void* udata, raft_node_t* node, msg_appendentries_t* msg);
int sender_appendentries_response(raft_server_t* raft, int sender_appendentries_response(raft_server_t* raft,
void* udata, int peer, msg_appendentries_response_t* msg); void* udata, raft_node_t* node, msg_appendentries_response_t* msg);
int sender_entries(raft_server_t* raft, int sender_entries(raft_server_t* raft,
void* udata, int peer, msg_entry_t* msg); void* udata, raft_node_t* node, msg_entry_t* msg);
int sender_entries_response(raft_server_t* raft, int sender_entries_response(raft_server_t* raft,
void* udata, int peer, msg_entry_response_t* msg); void* udata, raft_node_t* node, msg_entry_response_t* msg);
#endif /* MOCK_SEND_FUNCTIONS_H */ #endif /* MOCK_SEND_FUNCTIONS_H */
...@@ -14,8 +14,7 @@ void TestRaft_node_set_nextIdx(CuTest * tc) ...@@ -14,8 +14,7 @@ void TestRaft_node_set_nextIdx(CuTest * tc)
{ {
raft_node_t *p; raft_node_t *p;
p = raft_node_new((void*)1); p = raft_node_new((void*)1, 1);
raft_node_set_next_idx(p, 3); raft_node_set_next_idx(p, 3);
CuAssertTrue(tc, 3 == raft_node_get_next_idx(p)); CuAssertTrue(tc, 3 == raft_node_get_next_idx(p));
} }
...@@ -19,15 +19,17 @@ void TestRaft_scenario_leader_appears(CuTest * tc) ...@@ -19,15 +19,17 @@ void TestRaft_scenario_leader_appears(CuTest * tc)
senders_new(); senders_new();
for (j = 0; j < 3; j++)
sender[j] = sender_new((void*)j);
for (j = 0; j < 3; j++) for (j = 0; j < 3; j++)
{ {
r[j] = raft_new(); r[j] = raft_new();
sender[j] = sender_new((void*)j);
sender_set_raft(sender[j], r[j]); sender_set_raft(sender[j], r[j]);
raft_set_election_timeout(r[j], 500); raft_set_election_timeout(r[j], 500);
raft_add_node(r[j], (void*)1, j==0); raft_add_node(r[j], sender[0], 1, j==0);
raft_add_node(r[j], (void*)2, j==1); raft_add_node(r[j], sender[1], 2, j==1);
raft_add_node(r[j], (void*)3, j==2); raft_add_node(r[j], sender[2], 3, j==2);
raft_set_callbacks(r[j], raft_set_callbacks(r[j],
&((raft_cbs_t) { &((raft_cbs_t) {
.send_requestvote = sender_requestvote, .send_requestvote = sender_requestvote,
...@@ -62,4 +64,3 @@ one_more_time: ...@@ -62,4 +64,3 @@ one_more_time:
CuAssertTrue(tc, 0 != leaders); CuAssertTrue(tc, 0 != leaders);
CuAssertTrue(tc, 1 == leaders); CuAssertTrue(tc, 1 == leaders);
} }
...@@ -17,7 +17,8 @@ ...@@ -17,7 +17,8 @@
void TestRaft_server_voted_for_records_who_we_voted_for(CuTest * tc) void TestRaft_server_voted_for_records_who_we_voted_for(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_vote(r, 2); raft_add_node(r, NULL, 2, 0);
raft_vote(r, raft_get_node(r, 2));
CuAssertTrue(tc, 2 == raft_get_voted_for(r)); CuAssertTrue(tc, 2 == raft_get_voted_for(r));
} }
...@@ -51,9 +52,12 @@ void TestRaft_server_set_currentterm_sets_term(CuTest * tc) ...@@ -51,9 +52,12 @@ void TestRaft_server_set_currentterm_sets_term(CuTest * tc)
void TestRaft_server_voting_results_in_voting(CuTest * tc) void TestRaft_server_voting_results_in_voting(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_vote(r, 1); raft_add_node(r, NULL, 1, 0);
raft_add_node(r, NULL, 9, 0);
raft_vote(r, raft_get_node(r, 1));
CuAssertTrue(tc, 1 == raft_get_voted_for(r)); CuAssertTrue(tc, 1 == raft_get_voted_for(r));
raft_vote(r, 9); raft_vote(r, raft_get_node(r, 9));
CuAssertTrue(tc, 9 == raft_get_voted_for(r)); CuAssertTrue(tc, 9 == raft_get_voted_for(r));
} }
...@@ -242,9 +246,9 @@ void TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply(CuTest* tc) ...@@ -242,9 +246,9 @@ void TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply(CuTest* tc)
void TestRaft_server_wont_apply_entry_if_there_isnt_a_majority(CuTest* tc) void TestRaft_server_wont_apply_entry_if_there_isnt_a_majority(CuTest* tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
raft_set_commit_idx(r, 0); raft_set_commit_idx(r, 0);
raft_set_last_applied_idx(r, 0); raft_set_last_applied_idx(r, 0);
...@@ -326,7 +330,7 @@ void TestRaft_server_periodic_elapses_election_timeout(CuTest * tc) ...@@ -326,7 +330,7 @@ void TestRaft_server_periodic_elapses_election_timeout(CuTest * tc)
void TestRaft_server_election_timeout_promotes_us_to_leader_if_there_is_only_1_node(CuTest * tc) void TestRaft_server_election_timeout_promotes_us_to_leader_if_there_is_only_1_node(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
/* clock over (ie. 1000 + 1), causing new election */ /* clock over (ie. 1000 + 1), causing new election */
...@@ -338,7 +342,7 @@ void TestRaft_server_election_timeout_promotes_us_to_leader_if_there_is_only_1_n ...@@ -338,7 +342,7 @@ void TestRaft_server_election_timeout_promotes_us_to_leader_if_there_is_only_1_n
void TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node(CuTest * tc) void TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
raft_become_leader(r); raft_become_leader(r);
CuAssertTrue(tc, 0 == raft_get_commit_idx(r)); CuAssertTrue(tc, 0 == raft_get_commit_idx(r));
...@@ -351,7 +355,7 @@ void TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node(CuTest * tc ...@@ -351,7 +355,7 @@ void TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node(CuTest * tc
/* receive entry */ /* receive entry */
msg_entry_response_t cr; msg_entry_response_t cr;
raft_recv_entry(r, 1, &ety, &cr); raft_recv_entry(r, raft_get_node(r, 1), &ety, &cr);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
CuAssertTrue(tc, 1 == raft_get_commit_idx(r)); CuAssertTrue(tc, 1 == raft_get_commit_idx(r));
} }
...@@ -359,8 +363,8 @@ void TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node(CuTest * tc ...@@ -359,8 +363,8 @@ void TestRaft_server_recv_entry_auto_commits_if_we_are_the_only_node(CuTest * tc
void TestRaft_server_cfg_sets_num_nodes(CuTest * tc) void TestRaft_server_cfg_sets_num_nodes(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
CuAssertTrue(tc, 2 == raft_get_num_nodes(r)); CuAssertTrue(tc, 2 == raft_get_num_nodes(r));
} }
...@@ -368,12 +372,13 @@ void TestRaft_server_cfg_sets_num_nodes(CuTest * tc) ...@@ -368,12 +372,13 @@ void TestRaft_server_cfg_sets_num_nodes(CuTest * tc)
void TestRaft_server_cant_get_node_we_dont_have(CuTest * tc) void TestRaft_server_cant_get_node_we_dont_have(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
CuAssertTrue(tc, NULL != raft_get_node(r, 0)); CuAssertTrue(tc, NULL == raft_get_node(r, 0));
CuAssertTrue(tc, NULL != raft_get_node(r, 1)); CuAssertTrue(tc, NULL != raft_get_node(r, 1));
CuAssertTrue(tc, NULL == raft_get_node(r, 2)); CuAssertTrue(tc, NULL != raft_get_node(r, 2));
CuAssertTrue(tc, NULL == raft_get_node(r, 3));
} }
/* If term > currentTerm, set currentTerm to term (step down if candidate or /* If term > currentTerm, set currentTerm to term (step down if candidate or
...@@ -403,8 +408,8 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_n ...@@ -403,8 +408,8 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_n
) )
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
...@@ -412,7 +417,7 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_n ...@@ -412,7 +417,7 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_n
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1; rvr.term = 1;
rvr.vote_granted = 0; rvr.vote_granted = 0;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
} }
...@@ -421,8 +426,8 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_t ...@@ -421,8 +426,8 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_t
) )
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 3); raft_set_current_term(r, 3);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
...@@ -430,7 +435,7 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_t ...@@ -430,7 +435,7 @@ void TestRaft_server_recv_requestvote_response_dont_increase_votes_for_me_when_t
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 2; rvr.term = 2;
rvr.vote_granted = 1; rvr.vote_granted = 1;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
} }
...@@ -439,8 +444,8 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me( ...@@ -439,8 +444,8 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me(
) )
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
...@@ -450,7 +455,7 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me( ...@@ -450,7 +455,7 @@ void TestRaft_server_recv_requestvote_response_increase_votes_for_me(
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1; rvr.term = 1;
rvr.vote_granted = 1; rvr.vote_granted = 1;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 1 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 1 == raft_get_nvotes_for_me(r));
} }
...@@ -459,8 +464,8 @@ void TestRaft_server_recv_requestvote_response_must_be_candidate_to_receive( ...@@ -459,8 +464,8 @@ void TestRaft_server_recv_requestvote_response_must_be_candidate_to_receive(
) )
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
...@@ -470,7 +475,7 @@ void TestRaft_server_recv_requestvote_response_must_be_candidate_to_receive( ...@@ -470,7 +475,7 @@ void TestRaft_server_recv_requestvote_response_must_be_candidate_to_receive(
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1; rvr.term = 1;
rvr.vote_granted = 1; rvr.vote_granted = 1;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 0 == raft_get_nvotes_for_me(r));
} }
...@@ -482,15 +487,15 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term ...@@ -482,15 +487,15 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
/* term is less than current term */ /* term is less than current term */
msg_requestvote_t rv; msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 1; rv.term = 1;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertTrue(tc, 0 == rvr.vote_granted); CuAssertTrue(tc, 0 == rvr.vote_granted);
} }
...@@ -502,10 +507,10 @@ void TestRaft_leader_recv_requestvote_does_not_step_down( ...@@ -502,10 +507,10 @@ void TestRaft_leader_recv_requestvote_does_not_step_down(
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
raft_vote(r, 0); raft_vote(r, raft_get_node(r, 1));
raft_become_leader(r); raft_become_leader(r);
CuAssertIntEquals(tc, 1, raft_is_leader(r)); CuAssertIntEquals(tc, 1, raft_is_leader(r));
...@@ -513,8 +518,8 @@ void TestRaft_leader_recv_requestvote_does_not_step_down( ...@@ -513,8 +518,8 @@ void TestRaft_leader_recv_requestvote_does_not_step_down(
msg_requestvote_t rv; msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 1; rv.term = 1;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertIntEquals(tc, 0, raft_get_current_leader(r)); CuAssertIntEquals(tc, 1, raft_get_current_leader(r));
} }
/* Reply true if term >= currentTerm (5.1) */ /* Reply true if term >= currentTerm (5.1) */
...@@ -526,15 +531,15 @@ void TestRaft_server_recv_requestvote_reply_true_if_term_greater_than_or_equal_t ...@@ -526,15 +531,15 @@ void TestRaft_server_recv_requestvote_reply_true_if_term_greater_than_or_equal_t
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
/* term is less than current term */ /* term is less than current term */
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 2; rv.term = 2;
rv.last_log_idx = 1; rv.last_log_idx = 1;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertTrue(tc, 1 == rvr.vote_granted); CuAssertTrue(tc, 1 == rvr.vote_granted);
} }
...@@ -547,8 +552,8 @@ void TestRaft_server_recv_requestvote_reset_timeout( ...@@ -547,8 +552,8 @@ void TestRaft_server_recv_requestvote_reset_timeout(
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
...@@ -557,7 +562,7 @@ void TestRaft_server_recv_requestvote_reset_timeout( ...@@ -557,7 +562,7 @@ void TestRaft_server_recv_requestvote_reset_timeout(
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 2; rv.term = 2;
rv.last_log_idx = 1; rv.last_log_idx = 1;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertTrue(tc, 1 == rvr.vote_granted); CuAssertTrue(tc, 1 == rvr.vote_granted);
CuAssertIntEquals(tc, 0, raft_get_timeout_elapsed(r)); CuAssertIntEquals(tc, 0, raft_get_timeout_elapsed(r));
} }
...@@ -567,11 +572,11 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than ...@@ -567,11 +572,11 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than
) )
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_become_candidate(r); raft_become_candidate(r);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
CuAssertIntEquals(tc, 0, raft_get_voted_for(r)); CuAssertIntEquals(tc, 1, raft_get_voted_for(r));
/* current term is less than term */ /* current term is less than term */
msg_requestvote_t rv; msg_requestvote_t rv;
...@@ -579,10 +584,10 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than ...@@ -579,10 +584,10 @@ void TestRaft_server_recv_requestvote_candidate_step_down_if_term_is_higher_than
rv.term = 2; rv.term = 2;
rv.last_log_idx = 1; rv.last_log_idx = 1;
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertIntEquals(tc, 1, raft_is_follower(r)); CuAssertIntEquals(tc, 1, raft_is_follower(r));
CuAssertIntEquals(tc, 2, raft_get_current_term(r)); CuAssertIntEquals(tc, 2, raft_get_current_term(r));
CuAssertIntEquals(tc, 1, raft_get_voted_for(r)); CuAssertIntEquals(tc, 2, raft_get_voted_for(r));
} }
/* If votedFor is null or candidateId, and candidate's log is at /* If votedFor is null or candidateId, and candidate's log is at
...@@ -592,10 +597,10 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate( ...@@ -592,10 +597,10 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
) )
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
raft_vote(r, 0); raft_vote(r, raft_get_node(r, 1));
msg_requestvote_t rv; msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
...@@ -604,7 +609,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate( ...@@ -604,7 +609,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
rv.last_log_idx = 1; rv.last_log_idx = 1;
rv.last_log_term = 1; rv.last_log_term = 1;
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertTrue(tc, 0 == rvr.vote_granted); CuAssertTrue(tc, 0 == rvr.vote_granted);
} }
...@@ -618,10 +623,12 @@ void TestRaft_follower_becomes_follower_is_follower(CuTest * tc) ...@@ -618,10 +623,12 @@ void TestRaft_follower_becomes_follower_is_follower(CuTest * tc)
void TestRaft_follower_becomes_follower_does_not_clear_voted_for(CuTest * tc) void TestRaft_follower_becomes_follower_does_not_clear_voted_for(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_vote(r, 1); raft_add_node(r, NULL, 1, 1);
CuAssertTrue(tc, 1 == raft_get_voted_for(r));
raft_vote(r, raft_get_node(r, 1));
CuAssertIntEquals(tc, 1, raft_get_voted_for(r));
raft_become_follower(r); raft_become_follower(r);
CuAssertTrue(tc, 1 == raft_get_voted_for(r)); CuAssertIntEquals(tc, 1, raft_get_voted_for(r));
} }
/* 5.1 */ /* 5.1 */
...@@ -629,9 +636,8 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -629,9 +636,8 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* no leader known at this point */ /* no leader known at this point */
CuAssertTrue(tc, -1 == raft_get_current_leader(r)); CuAssertTrue(tc, -1 == raft_get_current_leader(r));
...@@ -643,7 +649,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -643,7 +649,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */ /* higher current term */
raft_set_current_term(r, 5); raft_set_current_term(r, 5);
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 0 == aer.success); CuAssertTrue(tc, 0 == aer.success);
/* rejected appendentries doesn't change the current leader. */ /* rejected appendentries doesn't change the current leader. */
...@@ -658,8 +664,8 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current ...@@ -658,8 +664,8 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* older currentterm */ /* older currentterm */
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
...@@ -672,12 +678,12 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current ...@@ -672,12 +678,12 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
ae.term = 2; ae.term = 2;
/* appendentry has newer term, so we change our currentterm */ /* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
/* term has been updated */ /* term has been updated */
CuAssertTrue(tc, 2 == raft_get_current_term(r)); CuAssertTrue(tc, 2 == raft_get_current_term(r));
/* and leader has been updated */ /* and leader has been updated */
CuAssertTrue(tc, 1 == raft_get_current_leader(r)); CuAssertIntEquals(tc, 2, raft_get_current_leader(r));
} }
void TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specified( void TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specified(
...@@ -687,8 +693,8 @@ void TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specifi ...@@ -687,8 +693,8 @@ void TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specifi
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_FOLLOWER); raft_set_state(r, RAFT_STATE_FOLLOWER);
...@@ -703,7 +709,7 @@ void TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specifi ...@@ -703,7 +709,7 @@ void TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specifi
ae.leader_commit = 5; ae.leader_commit = 5;
ae.n_entries = 0; ae.n_entries = 0;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
} }
...@@ -715,8 +721,8 @@ void TestRaft_follower_recv_appendentries_increases_log(CuTest * tc) ...@@ -715,8 +721,8 @@ void TestRaft_follower_recv_appendentries_increases_log(CuTest * tc)
char *str = "aaa"; char *str = "aaa";
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_FOLLOWER); raft_set_state(r, RAFT_STATE_FOLLOWER);
...@@ -740,7 +746,7 @@ void TestRaft_follower_recv_appendentries_increases_log(CuTest * tc) ...@@ -740,7 +746,7 @@ void TestRaft_follower_recv_appendentries_increases_log(CuTest * tc)
ae.entries = &ety; ae.entries = &ety;
ae.n_entries = 1; ae.n_entries = 1;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
raft_entry_t* log = raft_get_entry_from_idx(r, 1); raft_entry_t* log = raft_get_entry_from_idx(r, 1);
...@@ -758,8 +764,8 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev ...@@ -758,8 +764,8 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* term is different from appendentries */ /* term is different from appendentries */
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
...@@ -780,7 +786,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev ...@@ -780,7 +786,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
ae.n_entries = 1; ae.n_entries = 1;
/* trigger reply */ /* trigger reply */
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
/* reply is false */ /* reply is false */
CuAssertTrue(tc, 0 == aer.success); CuAssertTrue(tc, 0 == aer.success);
...@@ -836,8 +842,8 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en ...@@ -836,8 +842,8 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
...@@ -860,7 +866,7 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en ...@@ -860,7 +866,7 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
ae.entries = &mety; ae.entries = &mety;
ae.n_entries = 1; ae.n_entries = 1;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 2 == raft_get_log_count(r)); CuAssertTrue(tc, 2 == raft_get_log_count(r));
CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 1))); CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 1)));
...@@ -874,8 +880,8 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_ ...@@ -874,8 +880,8 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
...@@ -889,7 +895,7 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_ ...@@ -889,7 +895,7 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_
ae.entries = NULL; ae.entries = NULL;
ae.n_entries = 0; ae.n_entries = 0;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 1))); CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 1)));
...@@ -900,8 +906,8 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log( ...@@ -900,8 +906,8 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
msg_appendentries_t ae; msg_appendentries_t ae;
...@@ -918,7 +924,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log( ...@@ -918,7 +924,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
e[1].id = 2; e[1].id = 2;
ae.entries = e; ae.entries = e;
ae.n_entries = 2; ae.n_entries = 2;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 2 == raft_get_log_count(r)); CuAssertTrue(tc, 2 == raft_get_log_count(r));
...@@ -928,8 +934,8 @@ void TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_l ...@@ -928,8 +934,8 @@ void TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_l
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
msg_appendentries_t ae; msg_appendentries_t ae;
...@@ -946,9 +952,9 @@ void TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_l ...@@ -946,9 +952,9 @@ void TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_l
ae.entries = e; ae.entries = e;
ae.n_entries = 1; ae.n_entries = 1;
memset(&aer, 0, sizeof(aer)); memset(&aer, 0, sizeof(aer));
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
memset(&aer, 0, sizeof(aer)); memset(&aer, 0, sizeof(aer));
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
/* still successful even when no raft_append_entry() happened! */ /* still successful even when no raft_append_entry() happened! */
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertIntEquals(tc, 1, raft_get_log_count(r)); CuAssertIntEquals(tc, 1, raft_get_log_count(r));
...@@ -957,7 +963,7 @@ void TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_l ...@@ -957,7 +963,7 @@ void TestRaft_follower_recv_appendentries_does_not_add_dupe_entries_already_in_l
e[1].id = 2; e[1].id = 2;
ae.n_entries = 2; ae.n_entries = 2;
memset(&aer, 0, sizeof(aer)); memset(&aer, 0, sizeof(aer));
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertIntEquals(tc, 2, raft_get_log_count(r)); CuAssertIntEquals(tc, 2, raft_get_log_count(r));
} }
...@@ -968,8 +974,8 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx( ...@@ -968,8 +974,8 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
msg_appendentries_t ae; msg_appendentries_t ae;
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
...@@ -991,7 +997,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx( ...@@ -991,7 +997,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
e[3].id = 4; e[3].id = 4;
ae.entries = e; ae.entries = e;
ae.n_entries = 4; ae.n_entries = 4;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
/* receive an appendentry with commit */ /* receive an appendentry with commit */
memset(&ae, 0, sizeof(msg_appendentries_t)); memset(&ae, 0, sizeof(msg_appendentries_t));
...@@ -1000,7 +1006,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx( ...@@ -1000,7 +1006,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
ae.prev_log_idx = 4; ae.prev_log_idx = 4;
ae.leader_commit = 5; ae.leader_commit = 5;
/* receipt of appendentries changes commit idx */ /* receipt of appendentries changes commit idx */
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
/* set to 4 because commitIDX is lower */ /* set to 4 because commitIDX is lower */
...@@ -1011,8 +1017,8 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit( ...@@ -1011,8 +1017,8 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
msg_appendentries_t ae; msg_appendentries_t ae;
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
...@@ -1034,7 +1040,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit( ...@@ -1034,7 +1040,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
e[3].id = 4; e[3].id = 4;
ae.entries = e; ae.entries = e;
ae.n_entries = 4; ae.n_entries = 4;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
/* receive an appendentry with commit */ /* receive an appendentry with commit */
memset(&ae, 0, sizeof(msg_appendentries_t)); memset(&ae, 0, sizeof(msg_appendentries_t));
...@@ -1043,7 +1049,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit( ...@@ -1043,7 +1049,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
ae.prev_log_idx = 3; ae.prev_log_idx = 3;
ae.leader_commit = 3; ae.leader_commit = 3;
/* receipt of appendentries changes commit idx */ /* receipt of appendentries changes commit idx */
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
/* set to 3 because leaderCommit is lower */ /* set to 3 because leaderCommit is lower */
...@@ -1054,8 +1060,8 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx( ...@@ -1054,8 +1060,8 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx(
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
raft_entry_t ety; raft_entry_t ety;
...@@ -1074,7 +1080,7 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx( ...@@ -1074,7 +1080,7 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx(
ae.prev_log_idx = 0; ae.prev_log_idx = 0;
ae.leader_commit = 0; ae.leader_commit = 0;
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 0 == aer.success); CuAssertTrue(tc, 0 == aer.success);
CuAssertIntEquals(tc, 1, aer.current_idx); CuAssertIntEquals(tc, 1, aer.current_idx);
...@@ -1083,7 +1089,7 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx( ...@@ -1083,7 +1089,7 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx(
memset(&aer, 0, sizeof(aer)); memset(&aer, 0, sizeof(aer));
ety.id = 2; ety.id = 2;
raft_append_entry(r, &ety); raft_append_entry(r, &ety);
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 0 == aer.success); CuAssertTrue(tc, 0 == aer.success);
CuAssertIntEquals(tc, 2, aer.current_idx); CuAssertIntEquals(tc, 2, aer.current_idx);
} }
...@@ -1096,8 +1102,8 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs( ...@@ -1096,8 +1102,8 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(
/* 1 second election timeout */ /* 1 second election timeout */
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* 1.001 seconds have passed */ /* 1.001 seconds have passed */
raft_periodic(r, 1001); raft_periodic(r, 1001);
...@@ -1114,8 +1120,8 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log( ...@@ -1114,8 +1120,8 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* request vote */ /* request vote */
/* vote indicates candidate's log is not complete compared to follower */ /* vote indicates candidate's log is not complete compared to follower */
...@@ -1138,7 +1144,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log( ...@@ -1138,7 +1144,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
raft_append_entry(r, &ety); raft_append_entry(r, &ety);
/* vote not granted */ /* vote not granted */
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertTrue(tc, 0 == rvr.vote_granted); CuAssertTrue(tc, 0 == rvr.vote_granted);
/* approve vote, because last_log_term is higher */ /* approve vote, because last_log_term is higher */
...@@ -1148,7 +1154,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log( ...@@ -1148,7 +1154,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
rv.candidate_id = 1; rv.candidate_id = 1;
rv.last_log_idx = 1; rv.last_log_idx = 1;
rv.last_log_term = 2; rv.last_log_term = 2;
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
CuAssertTrue(tc, 1 == rvr.vote_granted); CuAssertTrue(tc, 1 == rvr.vote_granted);
} }
...@@ -1172,6 +1178,7 @@ void TestRaft_follower_becoming_candidate_increments_current_term(CuTest * tc) ...@@ -1172,6 +1178,7 @@ void TestRaft_follower_becoming_candidate_increments_current_term(CuTest * tc)
void TestRaft_follower_becoming_candidate_votes_for_self(CuTest * tc) void TestRaft_follower_becoming_candidate_votes_for_self(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, NULL, 1, 1);
CuAssertTrue(tc, -1 == raft_get_voted_for(r)); CuAssertTrue(tc, -1 == raft_get_voted_for(r));
raft_become_candidate(r); raft_become_candidate(r);
CuAssertTrue(tc, raft_get_nodeid(r) == raft_get_voted_for(r)); CuAssertTrue(tc, raft_get_nodeid(r) == raft_get_voted_for(r));
...@@ -1198,6 +1205,8 @@ void TestRaft_follower_recv_appendentries_resets_election_timeout( ...@@ -1198,6 +1205,8 @@ void TestRaft_follower_recv_appendentries_resets_election_timeout(
{ {
void *r = raft_new(); void *r = raft_new();
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
raft_add_node(r, NULL, 1, 1);
raft_add_node(r, NULL, 2, 1);
raft_periodic(r, 900); raft_periodic(r, 900);
...@@ -1206,7 +1215,7 @@ void TestRaft_follower_recv_appendentries_resets_election_timeout( ...@@ -1206,7 +1215,7 @@ void TestRaft_follower_recv_appendentries_resets_election_timeout(
memset(&ae, 0, sizeof(msg_appendentries_t)); memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 1; ae.term = 1;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 1), &ae, &aer);
CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r));
} }
...@@ -1222,9 +1231,9 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers( ...@@ -1222,9 +1231,9 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
/* set term so we can check it gets included in the outbound message */ /* set term so we can check it gets included in the outbound message */
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
...@@ -1253,8 +1262,8 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election( ...@@ -1253,8 +1262,8 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(
vr.vote_granted = 1; vr.vote_granted = 1;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
/* server wants to be leader, so becomes candidate */ /* server wants to be leader, so becomes candidate */
...@@ -1276,11 +1285,11 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc) ...@@ -1276,11 +1285,11 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
msg_requestvote_response_t vr; msg_requestvote_response_t vr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
raft_add_node(r, (void*)4, 0); raft_add_node(r, NULL, 4, 0);
raft_add_node(r, (void*)5, 0); raft_add_node(r, NULL, 5, 0);
CuAssertTrue(tc, 5 == raft_get_num_nodes(r)); CuAssertTrue(tc, 5 == raft_get_num_nodes(r));
/* vote for self */ /* vote for self */
...@@ -1293,13 +1302,13 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc) ...@@ -1293,13 +1302,13 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
vr.term = 1; vr.term = 1;
vr.vote_granted = 1; vr.vote_granted = 1;
/* get one vote */ /* get one vote */
raft_recv_requestvote_response(r, 1, &vr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &vr);
CuAssertTrue(tc, 2 == raft_get_nvotes_for_me(r)); CuAssertTrue(tc, 2 == raft_get_nvotes_for_me(r));
CuAssertTrue(tc, 0 == raft_is_leader(r)); CuAssertTrue(tc, 0 == raft_is_leader(r));
/* get another vote /* get another vote
* now has majority (ie. 3/5 votes) */ * now has majority (ie. 3/5 votes) */
raft_recv_requestvote_response(r, 2, &vr); raft_recv_requestvote_response(r, raft_get_node(r, 3), &vr);
CuAssertTrue(tc, 1 == raft_is_leader(r)); CuAssertTrue(tc, 1 == raft_is_leader(r));
} }
...@@ -1311,13 +1320,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted( ...@@ -1311,13 +1320,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
msg_requestvote_response_t rvr; msg_requestvote_response_t rvr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_vote(r, 0); raft_vote(r, raft_get_node(r, 1));
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
raft_recv_requestvote(r, 1, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 2), &rv, &rvr);
/* we've vote already, so won't respond with a vote granted... */ /* we've vote already, so won't respond with a vote granted... */
CuAssertTrue(tc, 0 == rvr.vote_granted); CuAssertTrue(tc, 0 == rvr.vote_granted);
...@@ -1333,8 +1342,8 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc) ...@@ -1333,8 +1342,8 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc)
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 0); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 1); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_CANDIDATE); raft_set_state(r, RAFT_STATE_CANDIDATE);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
...@@ -1351,7 +1360,7 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc) ...@@ -1351,7 +1360,7 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc)
ety.id = 102; ety.id = 102;
ety.term = 3; ety.term = 3;
raft_append_entry(r, &ety); raft_append_entry(r, &ety);
raft_send_requestvote(r, 1); raft_send_requestvote(r, raft_get_node(r, 2));
msg_requestvote_t* rv = sender_poll_msg_data(sender); msg_requestvote_t* rv = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != rv); CuAssertTrue(tc, NULL != rv);
...@@ -1365,8 +1374,8 @@ void TestRaft_candidate_recv_requestvote_response_becomes_follower_if_current_te ...@@ -1365,8 +1374,8 @@ void TestRaft_candidate_recv_requestvote_response_becomes_follower_if_current_te
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
raft_set_state(r, RAFT_STATE_CANDIDATE); raft_set_state(r, RAFT_STATE_CANDIDATE);
...@@ -1379,7 +1388,7 @@ void TestRaft_candidate_recv_requestvote_response_becomes_follower_if_current_te ...@@ -1379,7 +1388,7 @@ void TestRaft_candidate_recv_requestvote_response_becomes_follower_if_current_te
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 2; rvr.term = 2;
rvr.vote_granted = 0; rvr.vote_granted = 0;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
CuAssertTrue(tc, 2 == raft_get_current_term(r)); CuAssertTrue(tc, 2 == raft_get_current_term(r));
CuAssertTrue(tc, -1 == raft_get_voted_for(r)); CuAssertTrue(tc, -1 == raft_get_voted_for(r));
...@@ -1390,8 +1399,8 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower( ...@@ -1390,8 +1399,8 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_CANDIDATE); raft_set_state(r, RAFT_STATE_CANDIDATE);
raft_vote(r, 0); raft_vote(r, 0);
...@@ -1405,10 +1414,10 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower( ...@@ -1405,10 +1414,10 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
memset(&ae, 0, sizeof(msg_appendentries_t)); memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 1; ae.term = 1;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
/* after accepting a leader, it's available as the last known leader */ /* after accepting a leader, it's available as the last known leader */
CuAssertTrue(tc, 1 == raft_get_current_leader(r)); CuAssertTrue(tc, 2 == raft_get_current_leader(r));
CuAssertTrue(tc, 1 == raft_get_current_term(r)); CuAssertTrue(tc, 1 == raft_get_current_term(r));
CuAssertTrue(tc, -1 == raft_get_voted_for(r)); CuAssertTrue(tc, -1 == raft_get_voted_for(r));
} }
...@@ -1421,8 +1430,8 @@ void TestRaft_candidate_recv_appendentries_from_same_term_results_in_step_down( ...@@ -1421,8 +1430,8 @@ void TestRaft_candidate_recv_appendentries_from_same_term_results_in_step_down(
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
...@@ -1434,8 +1443,7 @@ void TestRaft_candidate_recv_appendentries_from_same_term_results_in_step_down( ...@@ -1434,8 +1443,7 @@ void TestRaft_candidate_recv_appendentries_from_same_term_results_in_step_down(
ae.prev_log_idx = 1; ae.prev_log_idx = 1;
ae.prev_log_term = 1; ae.prev_log_term = 1;
/* appendentry from invalid leader doesn't make candidate become follower */ raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
raft_recv_appendentries(r, 1, &ae, &aer);
CuAssertTrue(tc, 0 == raft_is_candidate(r)); CuAssertTrue(tc, 0 == raft_is_candidate(r));
} }
...@@ -1449,7 +1457,8 @@ void TestRaft_leader_becomes_leader_is_leader(CuTest * tc) ...@@ -1449,7 +1457,8 @@ void TestRaft_leader_becomes_leader_is_leader(CuTest * tc)
void TestRaft_leader_becomes_leader_does_not_clear_voted_for(CuTest * tc) void TestRaft_leader_becomes_leader_does_not_clear_voted_for(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_vote(r, 1); raft_add_node(r, NULL, 1, 1);
raft_vote(r, raft_get_node(r, 1));
CuAssertTrue(tc, 1 == raft_get_voted_for(r)); CuAssertTrue(tc, 1 == raft_get_voted_for(r));
raft_become_leader(r); raft_become_leader(r);
CuAssertTrue(tc, 1 == raft_get_voted_for(r)); CuAssertTrue(tc, 1 == raft_get_voted_for(r));
...@@ -1459,19 +1468,17 @@ void TestRaft_leader_when_becomes_leader_all_nodes_have_nextidx_equal_to_lastlog ...@@ -1459,19 +1468,17 @@ void TestRaft_leader_when_becomes_leader_all_nodes_have_nextidx_equal_to_lastlog
CuTest * tc) CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
/* candidate to leader */ /* candidate to leader */
raft_set_state(r, RAFT_STATE_CANDIDATE); raft_set_state(r, RAFT_STATE_CANDIDATE);
raft_become_leader(r); raft_become_leader(r);
int i; int i;
for (i = 0; i < raft_get_num_nodes(r); i++) for (i = 2; i <= 3; i++)
{ {
if (i == 0)
continue;
raft_node_t* p = raft_get_node(r, i); raft_node_t* p = raft_get_node(r, i);
CuAssertTrue(tc, raft_get_current_idx(r) + 1 == CuAssertTrue(tc, raft_get_current_idx(r) + 1 ==
raft_node_get_next_idx(p)); raft_node_get_next_idx(p));
...@@ -1490,9 +1497,9 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries( ...@@ -1490,9 +1497,9 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
/* candidate to leader */ /* candidate to leader */
raft_set_state(r, RAFT_STATE_CANDIDATE); raft_set_state(r, RAFT_STATE_CANDIDATE);
...@@ -1512,8 +1519,8 @@ void TestRaft_leader_responds_to_entry_msg_when_entry_is_committed(CuTest * tc) ...@@ -1512,8 +1519,8 @@ void TestRaft_leader_responds_to_entry_msg_when_entry_is_committed(CuTest * tc)
msg_entry_response_t cr; msg_entry_response_t cr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* I am the leader */ /* I am the leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
...@@ -1526,7 +1533,7 @@ void TestRaft_leader_responds_to_entry_msg_when_entry_is_committed(CuTest * tc) ...@@ -1526,7 +1533,7 @@ void TestRaft_leader_responds_to_entry_msg_when_entry_is_committed(CuTest * tc)
ety.data.len = strlen("entry"); ety.data.len = strlen("entry");
/* receive entry */ /* receive entry */
raft_recv_entry(r, 1, &ety, &cr); raft_recv_entry(r, raft_get_node(r, 2), &ety, &cr);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
/* trigger response through commit */ /* trigger response through commit */
...@@ -1538,8 +1545,8 @@ void TestRaft_non_leader_recv_entry_msg_fails(CuTest * tc) ...@@ -1538,8 +1545,8 @@ void TestRaft_non_leader_recv_entry_msg_fails(CuTest * tc)
msg_entry_response_t cr; msg_entry_response_t cr;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_FOLLOWER); raft_set_state(r, RAFT_STATE_FOLLOWER);
...@@ -1550,7 +1557,7 @@ void TestRaft_non_leader_recv_entry_msg_fails(CuTest * tc) ...@@ -1550,7 +1557,7 @@ void TestRaft_non_leader_recv_entry_msg_fails(CuTest * tc)
ety.data.len = strlen("entry"); ety.data.len = strlen("entry");
/* receive entry */ /* receive entry */
int e = raft_recv_entry(r, 1, &ety, &cr); int e = raft_recv_entry(r, raft_get_node(r, 2), &ety, &cr);
CuAssertTrue(tc, -1 == e); CuAssertTrue(tc, -1 == e);
} }
...@@ -1566,18 +1573,17 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx( ...@@ -1566,18 +1573,17 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* i'm leader */ /* i'm leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
void* p; raft_node_t* p = raft_get_node(r, 2);
p = raft_get_node(r, 0);
raft_node_set_next_idx(p, 4); raft_node_set_next_idx(p, 4);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r, 0); raft_send_appendentries(r, p);
msg_appendentries_t* ae = sender_poll_msg_data(sender); msg_appendentries_t* ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
} }
...@@ -1593,8 +1599,8 @@ void TestRaft_leader_sends_appendentries_with_leader_commit( ...@@ -1593,8 +1599,8 @@ void TestRaft_leader_sends_appendentries_with_leader_commit(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* i'm leader */ /* i'm leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
...@@ -1614,7 +1620,7 @@ void TestRaft_leader_sends_appendentries_with_leader_commit( ...@@ -1614,7 +1620,7 @@ void TestRaft_leader_sends_appendentries_with_leader_commit(
raft_set_commit_idx(r, 10); raft_set_commit_idx(r, 10);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r, 0); raft_send_appendentries(r, raft_get_node(r, 2));
msg_appendentries_t* ae = sender_poll_msg_data(sender); msg_appendentries_t* ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
CuAssertTrue(tc, ae->leader_commit == 10); CuAssertTrue(tc, ae->leader_commit == 10);
...@@ -1631,19 +1637,19 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx( ...@@ -1631,19 +1637,19 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); /* me */ raft_add_node(r, NULL, 1, 1); /* me */
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* i'm leader */ /* i'm leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
msg_appendentries_t* ae = sender_poll_msg_data(sender); msg_appendentries_t* ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
CuAssertTrue(tc, ae->prev_log_idx == 0); CuAssertTrue(tc, ae->prev_log_idx == 0);
raft_node_t* n = raft_get_node(r, 1); raft_node_t* n = raft_get_node(r, 2);
/* add 1 entry */ /* add 1 entry */
/* receive appendentries messages */ /* receive appendentries messages */
...@@ -1654,7 +1660,7 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx( ...@@ -1654,7 +1660,7 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
ety.data.buf = (unsigned char*)"aaa"; ety.data.buf = (unsigned char*)"aaa";
raft_append_entry(r, &ety); raft_append_entry(r, &ety);
raft_node_set_next_idx(n, 1); raft_node_set_next_idx(n, 1);
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
ae = sender_poll_msg_data(sender); ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
CuAssertTrue(tc, ae->prev_log_idx == 0); CuAssertTrue(tc, ae->prev_log_idx == 0);
...@@ -1665,7 +1671,7 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx( ...@@ -1665,7 +1671,7 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
/* set next_idx */ /* set next_idx */
/* receive appendentries messages */ /* receive appendentries messages */
raft_node_set_next_idx(n, 2); raft_node_set_next_idx(n, 2);
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
ae = sender_poll_msg_data(sender); ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
CuAssertTrue(tc, ae->prev_log_idx == 1); CuAssertTrue(tc, ae->prev_log_idx == 1);
...@@ -1682,19 +1688,19 @@ void TestRaft_leader_sends_appendentries_when_node_has_next_idx_of_0( ...@@ -1682,19 +1688,19 @@ void TestRaft_leader_sends_appendentries_when_node_has_next_idx_of_0(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* i'm leader */ /* i'm leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r, 0); raft_send_appendentries(r, raft_get_node(r, 2));
msg_appendentries_t* ae = sender_poll_msg_data(sender); msg_appendentries_t* ae = sender_poll_msg_data(sender);
/* add an entry */ /* add an entry */
/* receive appendentries messages */ /* receive appendentries messages */
raft_node_t* n = raft_get_node(r, 0); raft_node_t* n = raft_get_node(r, 2);
raft_node_set_next_idx(n, 1); raft_node_set_next_idx(n, 1);
raft_entry_t ety; raft_entry_t ety;
ety.term = 1; ety.term = 1;
...@@ -1702,7 +1708,7 @@ void TestRaft_leader_sends_appendentries_when_node_has_next_idx_of_0( ...@@ -1702,7 +1708,7 @@ void TestRaft_leader_sends_appendentries_when_node_has_next_idx_of_0(
ety.data.len = 4; ety.data.len = 4;
ety.data.buf = (unsigned char*)"aaa"; ety.data.buf = (unsigned char*)"aaa";
raft_append_entry(r, &ety); raft_append_entry(r, &ety);
raft_send_appendentries(r, 0); raft_send_appendentries(r, n);
ae = sender_poll_msg_data(sender); ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
CuAssertTrue(tc, ae->prev_log_idx == 0); CuAssertTrue(tc, ae->prev_log_idx == 0);
...@@ -1720,14 +1726,14 @@ void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsis ...@@ -1720,14 +1726,14 @@ void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsis
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
/* i'm leader */ /* i'm leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r, 0); raft_send_appendentries(r, raft_get_node(r, 2));
msg_appendentries_t* ae = sender_poll_msg_data(sender); msg_appendentries_t* ae = sender_poll_msg_data(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
} }
...@@ -1746,12 +1752,12 @@ void TestRaft_leader_append_entry_to_log_increases_idxno(CuTest * tc) ...@@ -1746,12 +1752,12 @@ void TestRaft_leader_append_entry_to_log_increases_idxno(CuTest * tc)
ety.data.len = strlen("entry"); ety.data.len = strlen("entry");
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_entry(r, 1, &ety, &cr); raft_recv_entry(r, raft_get_node(r, 2), &ety, &cr);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
} }
...@@ -1798,11 +1804,11 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori ...@@ -1798,11 +1804,11 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
raft_add_node(r, (void*)4, 0); raft_add_node(r, NULL, 4, 0);
raft_add_node(r, (void*)5, 0); raft_add_node(r, NULL, 5, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
/* I'm the leader */ /* I'm the leader */
...@@ -1829,16 +1835,16 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori ...@@ -1829,16 +1835,16 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori
/* FIRST entry log application */ /* FIRST entry log application */
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
raft_send_appendentries(r, 2); raft_send_appendentries(r, raft_get_node(r, 3));
/* receive mock success responses */ /* receive mock success responses */
aer.term = 1; aer.term = 1;
aer.success = 1; aer.success = 1;
aer.current_idx = 1; aer.current_idx = 1;
aer.first_idx = 1; aer.first_idx = 1;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 0, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 0, raft_get_commit_idx(r));
raft_recv_appendentries_response(r, 2, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
/* leader will now have majority followers who have appended this log */ /* leader will now have majority followers who have appended this log */
CuAssertIntEquals(tc, 1, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 1, raft_get_commit_idx(r));
raft_periodic(r, 1); raft_periodic(r, 1);
...@@ -1847,16 +1853,16 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori ...@@ -1847,16 +1853,16 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori
/* SECOND entry log application */ /* SECOND entry log application */
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
raft_send_appendentries(r, 2); raft_send_appendentries(r, raft_get_node(r, 3));
/* receive mock success responses */ /* receive mock success responses */
aer.term = 1; aer.term = 1;
aer.success = 1; aer.success = 1;
aer.current_idx = 2; aer.current_idx = 2;
aer.first_idx = 2; aer.first_idx = 2;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 1, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 1, raft_get_commit_idx(r));
raft_recv_appendentries_response(r, 2, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
/* leader will now have majority followers who have appended this log */ /* leader will now have majority followers who have appended this log */
CuAssertIntEquals(tc, 2, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 2, raft_get_commit_idx(r));
raft_periodic(r, 1); raft_periodic(r, 1);
...@@ -1874,11 +1880,12 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca ...@@ -1874,11 +1880,12 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)4, 0); raft_add_node(r, NULL, 3, 0);
raft_add_node(r, (void*)5, 0); raft_add_node(r, NULL, 4, 0);
raft_add_node(r, NULL, 5, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
...@@ -1904,16 +1911,16 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca ...@@ -1904,16 +1911,16 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca
/* FIRST entry log application */ /* FIRST entry log application */
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
raft_send_appendentries(r, 2); raft_send_appendentries(r, raft_get_node(r, 3));
/* receive mock success responses */ /* receive mock success responses */
aer.term = 1; aer.term = 1;
aer.success = 1; aer.success = 1;
aer.current_idx = 1; aer.current_idx = 1;
aer.first_idx = 1; aer.first_idx = 1;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 0, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 0, raft_get_commit_idx(r));
raft_recv_appendentries_response(r, 2, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
CuAssertIntEquals(tc, 0, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 0, raft_get_commit_idx(r));
raft_periodic(r, 1); raft_periodic(r, 1);
CuAssertIntEquals(tc, 0, raft_get_last_applied_idx(r)); CuAssertIntEquals(tc, 0, raft_get_last_applied_idx(r));
...@@ -1921,32 +1928,32 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca ...@@ -1921,32 +1928,32 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca
/* SECOND entry log application */ /* SECOND entry log application */
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
raft_send_appendentries(r, 2); raft_send_appendentries(r, raft_get_node(r, 3));
/* receive mock success responses */ /* receive mock success responses */
aer.term = 1; aer.term = 1;
aer.success = 1; aer.success = 1;
aer.current_idx = 2; aer.current_idx = 2;
aer.first_idx = 2; aer.first_idx = 2;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 0, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 0, raft_get_commit_idx(r));
raft_recv_appendentries_response(r, 2, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
CuAssertIntEquals(tc, 0, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 0, raft_get_commit_idx(r));
raft_periodic(r, 1); raft_periodic(r, 1);
CuAssertIntEquals(tc, 0, raft_get_last_applied_idx(r)); CuAssertIntEquals(tc, 0, raft_get_last_applied_idx(r));
/* THIRD entry log application */ /* THIRD entry log application */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
raft_send_appendentries(r, 2); raft_send_appendentries(r, raft_get_node(r, 3));
/* receive mock success responses /* receive mock success responses
* let's say that the nodes have majority within leader's current term */ * let's say that the nodes have majority within leader's current term */
aer.term = 2; aer.term = 2;
aer.success = 1; aer.success = 1;
aer.current_idx = 3; aer.current_idx = 3;
aer.first_idx = 3; aer.first_idx = 3;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 0, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 0, raft_get_commit_idx(r));
raft_recv_appendentries_response(r, 2, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
CuAssertIntEquals(tc, 3, raft_get_commit_idx(r)); CuAssertIntEquals(tc, 3, raft_get_commit_idx(r));
raft_periodic(r, 1); raft_periodic(r, 1);
CuAssertIntEquals(tc, 1, raft_get_last_applied_idx(r)); CuAssertIntEquals(tc, 1, raft_get_last_applied_idx(r));
...@@ -1967,8 +1974,8 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx( ...@@ -1967,8 +1974,8 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
...@@ -1995,14 +2002,14 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx( ...@@ -1995,14 +2002,14 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx(
/* become leader sets next_idx to current_idx */ /* become leader sets next_idx to current_idx */
raft_become_leader(r); raft_become_leader(r);
raft_node_t* node = raft_get_node(r, 1); raft_node_t* node = raft_get_node(r, 2);
CuAssertIntEquals(tc, 5, raft_node_get_next_idx(node)); CuAssertIntEquals(tc, 5, raft_node_get_next_idx(node));
CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender))); CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender)));
/* FIRST entry log application */ /* FIRST entry log application */
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender))); CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender)));
CuAssertIntEquals(tc, 4, ae->prev_log_term); CuAssertIntEquals(tc, 4, ae->prev_log_term);
CuAssertIntEquals(tc, 4, ae->prev_log_idx); CuAssertIntEquals(tc, 4, ae->prev_log_idx);
...@@ -2012,7 +2019,7 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx( ...@@ -2012,7 +2019,7 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx(
aer.term = 2; aer.term = 2;
aer.success = 0; aer.success = 0;
aer.current_idx = 1; aer.current_idx = 1;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 2, raft_node_get_next_idx(node)); CuAssertIntEquals(tc, 2, raft_node_get_next_idx(node));
/* see if new appendentries have appropriate values */ /* see if new appendentries have appropriate values */
...@@ -2034,8 +2041,8 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx( ...@@ -2034,8 +2041,8 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
...@@ -2062,14 +2069,14 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx( ...@@ -2062,14 +2069,14 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
/* become leader sets next_idx to current_idx */ /* become leader sets next_idx to current_idx */
raft_become_leader(r); raft_become_leader(r);
raft_node_t* node = raft_get_node(r, 1); raft_node_t* node = raft_get_node(r, 2);
CuAssertIntEquals(tc, 5, raft_node_get_next_idx(node)); CuAssertIntEquals(tc, 5, raft_node_get_next_idx(node));
CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender))); CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender)));
/* FIRST entry log application */ /* FIRST entry log application */
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 2));
CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender))); CuAssertTrue(tc, NULL != (ae = sender_poll_msg_data(sender)));
CuAssertIntEquals(tc, 4, ae->prev_log_term); CuAssertIntEquals(tc, 4, ae->prev_log_term);
CuAssertIntEquals(tc, 4, ae->prev_log_idx); CuAssertIntEquals(tc, 4, ae->prev_log_idx);
...@@ -2079,7 +2086,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx( ...@@ -2079,7 +2086,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
aer.term = 2; aer.term = 2;
aer.success = 0; aer.success = 0;
aer.current_idx = 4; aer.current_idx = 4;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 4, raft_node_get_next_idx(node)); CuAssertIntEquals(tc, 4, raft_node_get_next_idx(node));
/* see if new appendentries have appropriate values */ /* see if new appendentries have appropriate values */
...@@ -2092,7 +2099,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx( ...@@ -2092,7 +2099,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
aer.term = 2; aer.term = 2;
aer.success = 0; aer.success = 0;
aer.current_idx = 4; aer.current_idx = 4;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 3, raft_node_get_next_idx(node)); CuAssertIntEquals(tc, 3, raft_node_get_next_idx(node));
/* see if new appendentries have appropriate values */ /* see if new appendentries have appropriate values */
...@@ -2111,8 +2118,9 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t ...@@ -2111,8 +2118,9 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, NULL, 3, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
/* I'm the leader */ /* I'm the leader */
...@@ -2130,8 +2138,8 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t ...@@ -2130,8 +2138,8 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t
ety.data.len = 4; ety.data.len = 4;
raft_append_entry(r, &ety); raft_append_entry(r, &ety);
raft_send_appendentries(r, 0); raft_send_appendentries(r, raft_get_node(r, 2));
raft_send_appendentries(r, 1); raft_send_appendentries(r, raft_get_node(r, 3));
CuAssertTrue(tc, NULL != sender_poll_msg_data(sender)); CuAssertTrue(tc, NULL != sender_poll_msg_data(sender));
CuAssertTrue(tc, NULL != sender_poll_msg_data(sender)); CuAssertTrue(tc, NULL != sender_poll_msg_data(sender));
...@@ -2145,7 +2153,7 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t ...@@ -2145,7 +2153,7 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t
aer.success = 1; aer.success = 1;
aer.current_idx = 1; aer.current_idx = 1;
aer.first_idx = 1; aer.first_idx = 1;
CuAssertTrue(tc, -1 == raft_recv_appendentries_response(r, 1, &aer)); CuAssertTrue(tc, -1 == raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer));
CuAssertTrue(tc, NULL == sender_poll_msg_data(sender)); CuAssertTrue(tc, NULL == sender_poll_msg_data(sender));
} }
...@@ -2166,15 +2174,15 @@ void TestRaft_leader_recv_entry_resets_election_timeout( ...@@ -2166,15 +2174,15 @@ void TestRaft_leader_recv_entry_resets_election_timeout(
/* receive entry */ /* receive entry */
msg_entry_response_t cr; msg_entry_response_t cr;
raft_recv_entry(r, 1, &mety, &cr); raft_recv_entry(r, NULL, &mety, &cr);
CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r));
} }
void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest * tc) void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
...@@ -2188,7 +2196,7 @@ void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest * ...@@ -2188,7 +2196,7 @@ void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest *
/* receive entry */ /* receive entry */
msg_entry_response_t cr; msg_entry_response_t cr;
raft_recv_entry(r, 1, &mety, &cr); raft_recv_entry(r, raft_get_node(r, 2), &mety, &cr);
CuAssertTrue(tc, 0 == raft_msg_entry_response_committed(r, &cr)); CuAssertTrue(tc, 0 == raft_msg_entry_response_committed(r, &cr));
raft_set_commit_idx(r, 1); raft_set_commit_idx(r, 1);
...@@ -2198,8 +2206,8 @@ void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest * ...@@ -2198,8 +2206,8 @@ void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest *
void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest * tc) void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
...@@ -2213,7 +2221,7 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest ...@@ -2213,7 +2221,7 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest
/* receive entry */ /* receive entry */
msg_entry_response_t cr; msg_entry_response_t cr;
raft_recv_entry(r, 1, &mety, &cr); raft_recv_entry(r, raft_get_node(r, 2), &mety, &cr);
CuAssertTrue(tc, 0 == raft_msg_entry_response_committed(r, &cr)); CuAssertTrue(tc, 0 == raft_msg_entry_response_committed(r, &cr));
CuAssertTrue(tc, cr.term == 1); CuAssertTrue(tc, cr.term == 1);
CuAssertTrue(tc, cr.idx == 1); CuAssertTrue(tc, cr.idx == 1);
...@@ -2236,7 +2244,7 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest ...@@ -2236,7 +2244,7 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest
e[0].data.len = 3; e[0].data.len = 3;
ae.entries = e; ae.entries = e;
ae.n_entries = 1; ae.n_entries = 1;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success); CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 1 == raft_get_current_idx(r)); CuAssertTrue(tc, 1 == raft_get_current_idx(r));
CuAssertTrue(tc, 1 == raft_get_commit_idx(r)); CuAssertTrue(tc, 1 == raft_get_commit_idx(r));
...@@ -2246,8 +2254,8 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest ...@@ -2246,8 +2254,8 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest
void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(CuTest * tc) void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_cbs_t funcs = { raft_cbs_t funcs = {
.send_appendentries = sender_appendentries, .send_appendentries = sender_appendentries,
...@@ -2261,7 +2269,7 @@ void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(Cu ...@@ -2261,7 +2269,7 @@ void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(Cu
raft_set_commit_idx(r, 0); raft_set_commit_idx(r, 0);
/* make the node slow */ /* make the node slow */
raft_node_set_next_idx(raft_get_node(r, 1), 1); raft_node_set_next_idx(raft_get_node(r, 2), 1);
/* append entries */ /* append entries */
raft_entry_t ety; raft_entry_t ety;
...@@ -2279,7 +2287,7 @@ void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(Cu ...@@ -2279,7 +2287,7 @@ void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(Cu
/* receive entry */ /* receive entry */
msg_entry_response_t cr; msg_entry_response_t cr;
raft_recv_entry(r, 1, &mety, &cr); raft_recv_entry(r, NULL, &mety, &cr);
/* check if the slow node got sent this appendentries */ /* check if the slow node got sent this appendentries */
msg_appendentries_t* ae; msg_appendentries_t* ae;
...@@ -2297,8 +2305,8 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti ...@@ -2297,8 +2305,8 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
/* I'm the leader */ /* I'm the leader */
...@@ -2316,7 +2324,7 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti ...@@ -2316,7 +2324,7 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti
/* send appendentries - /* send appendentries -
* server will be waiting for response */ * server will be waiting for response */
raft_send_appendentries(r, 0); raft_send_appendentries(r, raft_get_node(r, 2));
/* receive mock success response */ /* receive mock success response */
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
...@@ -2325,10 +2333,10 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti ...@@ -2325,10 +2333,10 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti
aer.success = 0; aer.success = 0;
aer.current_idx = 0; aer.current_idx = 0;
aer.first_idx = 0; aer.first_idx = 0;
raft_node_t* p = raft_get_node(r, 0); raft_node_t* p = raft_get_node(r, 2);
raft_recv_appendentries_response(r, 0, &aer); raft_recv_appendentries_response(r, p, &aer);
CuAssertTrue(tc, 1 == raft_node_get_next_idx(p)); CuAssertTrue(tc, 1 == raft_node_get_next_idx(p));
raft_recv_appendentries_response(r, 0, &aer); raft_recv_appendentries_response(r, p, &aer);
CuAssertTrue(tc, 1 == raft_node_get_next_idx(p)); CuAssertTrue(tc, 1 == raft_node_get_next_idx(p));
} }
...@@ -2342,16 +2350,16 @@ void TestRaft_leader_recv_appendentries_response_increment_idx_of_node( ...@@ -2342,16 +2350,16 @@ void TestRaft_leader_recv_appendentries_response_increment_idx_of_node(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
/* I'm the leader */ /* I'm the leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
raft_set_current_term(r, 1); raft_set_current_term(r, 1);
raft_node_t* p = raft_get_node(r, 1); raft_node_t* p = raft_get_node(r, 2);
CuAssertIntEquals(tc, 1, raft_node_get_next_idx(p)); CuAssertTrue(tc, 1 == raft_node_get_next_idx(p));
/* receive mock success responses */ /* receive mock success responses */
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
...@@ -2359,7 +2367,7 @@ void TestRaft_leader_recv_appendentries_response_increment_idx_of_node( ...@@ -2359,7 +2367,7 @@ void TestRaft_leader_recv_appendentries_response_increment_idx_of_node(
aer.success = 1; aer.success = 1;
aer.current_idx = 0; aer.current_idx = 0;
aer.first_idx = 0; aer.first_idx = 0;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 1, raft_node_get_next_idx(p)); CuAssertIntEquals(tc, 1, raft_node_get_next_idx(p));
} }
...@@ -2373,15 +2381,15 @@ void TestRaft_leader_recv_appendentries_response_drop_message_if_term_is_old( ...@@ -2373,15 +2381,15 @@ void TestRaft_leader_recv_appendentries_response_drop_message_if_term_is_old(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
/* I'm the leader */ /* I'm the leader */
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
raft_set_current_term(r, 2); raft_set_current_term(r, 2);
raft_node_t* p = raft_get_node(r, 1); raft_node_t* p = raft_get_node(r, 2);
CuAssertTrue(tc, 1 == raft_node_get_next_idx(p)); CuAssertTrue(tc, 1 == raft_node_get_next_idx(p));
/* receive OLD mock success responses */ /* receive OLD mock success responses */
...@@ -2390,7 +2398,7 @@ void TestRaft_leader_recv_appendentries_response_drop_message_if_term_is_old( ...@@ -2390,7 +2398,7 @@ void TestRaft_leader_recv_appendentries_response_drop_message_if_term_is_old(
aer.success = 1; aer.success = 1;
aer.current_idx = 1; aer.current_idx = 1;
aer.first_idx = 1; aer.first_idx = 1;
raft_recv_appendentries_response(r, 1, &aer); raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertTrue(tc, 1 == raft_node_get_next_idx(p)); CuAssertTrue(tc, 1 == raft_node_get_next_idx(p));
} }
...@@ -2401,25 +2409,25 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer( ...@@ -2401,25 +2409,25 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
raft_set_current_term(r, 5); raft_set_current_term(r, 5);
/* check that node 0 considers itself the leader */ /* check that node 0 considers itself the leader */
CuAssertTrue(tc, 1 == raft_is_leader(r)); CuAssertTrue(tc, 1 == raft_is_leader(r));
CuAssertTrue(tc, 0 == raft_get_current_leader(r)); CuAssertTrue(tc, 1 == raft_get_current_leader(r));
memset(&ae, 0, sizeof(msg_appendentries_t)); memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 6; ae.term = 6;
ae.prev_log_idx = 6; ae.prev_log_idx = 6;
ae.prev_log_term = 5; ae.prev_log_term = 5;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
/* after more recent appendentries from node 1, node 0 should /* after more recent appendentries from node 1, node 0 should
* consider node 1 the leader. */ * consider node 1 the leader. */
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
CuAssertTrue(tc, 0 == raft_get_current_leader(r)); CuAssertTrue(tc, 1 == raft_get_current_leader(r));
} }
void TestRaft_leader_recv_appendentries_steps_down_if_newer_term( void TestRaft_leader_recv_appendentries_steps_down_if_newer_term(
...@@ -2429,8 +2437,8 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer_term( ...@@ -2429,8 +2437,8 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer_term(
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
void *r = raft_new(); void *r = raft_new();
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
raft_set_current_term(r, 5); raft_set_current_term(r, 5);
...@@ -2439,7 +2447,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer_term( ...@@ -2439,7 +2447,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer_term(
ae.term = 6; ae.term = 6;
ae.prev_log_idx = 5; ae.prev_log_idx = 5;
ae.prev_log_term = 5; ae.prev_log_term = 5;
raft_recv_appendentries(r, 1, &ae, &aer); raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
} }
...@@ -2455,9 +2463,9 @@ void TestRaft_leader_sends_empty_appendentries_every_request_timeout( ...@@ -2455,9 +2463,9 @@ void TestRaft_leader_sends_empty_appendentries_every_request_timeout(
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
raft_set_request_timeout(r, 500); raft_set_request_timeout(r, 500);
CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r));
...@@ -2496,9 +2504,9 @@ void TestRaft_leader_recv_requestvote_responds_without_granting(CuTest * tc) ...@@ -2496,9 +2504,9 @@ void TestRaft_leader_recv_requestvote_responds_without_granting(CuTest * tc)
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
raft_set_request_timeout(r, 500); raft_set_request_timeout(r, 500);
CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r));
...@@ -2509,14 +2517,14 @@ void TestRaft_leader_recv_requestvote_responds_without_granting(CuTest * tc) ...@@ -2509,14 +2517,14 @@ void TestRaft_leader_recv_requestvote_responds_without_granting(CuTest * tc)
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1; rvr.term = 1;
rvr.vote_granted = 1; rvr.vote_granted = 1;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 1 == raft_is_leader(r)); CuAssertTrue(tc, 1 == raft_is_leader(r));
/* receive request vote from node 3 */ /* receive request vote from node 3 */
msg_requestvote_t rv; msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 1; rv.term = 1;
raft_recv_requestvote(r, 2, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 3), &rv, &rvr);
CuAssertTrue(tc, 0 == rvr.vote_granted); CuAssertTrue(tc, 0 == rvr.vote_granted);
} }
...@@ -2529,9 +2537,9 @@ void TestRaft_leader_recv_requestvote_responds_with_granting_if_term_is_higher(C ...@@ -2529,9 +2537,9 @@ void TestRaft_leader_recv_requestvote_responds_with_granting_if_term_is_higher(C
void *sender = sender_new(NULL); void *sender = sender_new(NULL);
void *r = raft_new(); void *r = raft_new();
raft_set_callbacks(r, &funcs, sender); raft_set_callbacks(r, &funcs, sender);
raft_add_node(r, (void*)1, 1); raft_add_node(r, NULL, 1, 1);
raft_add_node(r, (void*)2, 0); raft_add_node(r, NULL, 2, 0);
raft_add_node(r, (void*)3, 0); raft_add_node(r, NULL, 3, 0);
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
raft_set_request_timeout(r, 500); raft_set_request_timeout(r, 500);
CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r));
...@@ -2542,13 +2550,13 @@ void TestRaft_leader_recv_requestvote_responds_with_granting_if_term_is_higher(C ...@@ -2542,13 +2550,13 @@ void TestRaft_leader_recv_requestvote_responds_with_granting_if_term_is_higher(C
memset(&rvr, 0, sizeof(msg_requestvote_response_t)); memset(&rvr, 0, sizeof(msg_requestvote_response_t));
rvr.term = 1; rvr.term = 1;
rvr.vote_granted = 1; rvr.vote_granted = 1;
raft_recv_requestvote_response(r, 1, &rvr); raft_recv_requestvote_response(r, raft_get_node(r, 2), &rvr);
CuAssertTrue(tc, 1 == raft_is_leader(r)); CuAssertTrue(tc, 1 == raft_is_leader(r));
/* receive request vote from node 3 */ /* receive request vote from node 3 */
msg_requestvote_t rv; msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t)); memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 2; rv.term = 2;
raft_recv_requestvote(r, 2, &rv, &rvr); raft_recv_requestvote(r, raft_get_node(r, 3), &rv, &rvr);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
} }
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