Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Willemt Raft
Commits
b07b44b0
Commit
b07b44b0
authored
Sep 26, 2015
by
Willem Thiart
Browse files
Replaced node idx with node pointer
parent
7690b4b7
Changes
10
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
b07b44b0
...
@@ -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_
);
...
...
include/raft_private.h
View file @
b07b44b0
...
@@ -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
node
id
;
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_ */
src/raft_node.c
View file @
b07b44b0
...
@@ -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
;
}
src/raft_server.c
View file @
b07b44b0
...
@@ -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
->
node
id
!=
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
->
node
id
);
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
->
node
id
!=
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
->
node
id
==
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
->
vote
s
_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
->
node
id
!=
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
->
node
id
!=
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
->
node
id
!=
i
)
if
(
me
->
node
!=
me
->
nodes
[
i
]
)
if
(
1
==
me
->
vote
s
_for_me
[
i
])
if
(
raft_node_has_
vote_for_me
(
me
->
nodes
[
i
])
)
votes
+=
1
;
votes
+=
1
;
if
(
me
->
voted_for
==
me
->
node
id
)
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_
,
...
...
src/raft_server_properties.c
View file @
b07b44b0
...
@@ -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_
)
->
node
id
;
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
->
node
id
;
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_
)
...
...
tests/mock_send_functions.c
View file @
b07b44b0
...
@@ -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
);
}
}
...
...
tests/mock_send_functions.h
View file @
b07b44b0
...
@@ -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 */
tests/test_node.c
View file @
b07b44b0
...
@@ -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
));
}
}
tests/test_scenario.c
View file @
b07b44b0
...
@@ -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
);
}
}
tests/test_server.c
View file @
b07b44b0
...
@@ -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
);
CuAssert
True
(
tc
,
1
==
raft_get_voted_for
(
r
));
CuAssert
IntEquals
(
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 */
CuAssert
True
(
tc
,
1
==
raft_get_current_leader
(
r
));
CuAssert
IntEquals
(
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
);
CuAssert
IntEquals
(
tc
,
1
,
raft_node_get_next_idx
(
p
));
CuAssert
True
(
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
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment