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
49176fc7
Commit
49176fc7
authored
Sep 19, 2013
by
willem
Browse files
Changed peer interface
parent
0feb3d14
Changes
10
Hide whitespace changes
Inline
Side-by-side
mock_send_functions.c
View file @
49176fc7
...
...
@@ -20,7 +20,7 @@ typedef struct {
void
*
inbox
;
}
sender_t
;
int
sender_send
(
void
*
caller
,
void
*
udata
,
int
peer
,
const
unsigned
char
*
data
,
int
len
)
int
sender_send
(
void
*
caller
,
void
*
udata
,
void
*
peer
,
const
unsigned
char
*
data
,
int
len
)
{
sender_t
*
me
=
udata
;
void
*
n
;
...
...
mock_send_functions.h
View file @
49176fc7
int
sender_send
(
void
*
caller
,
void
*
udata
,
const
int
peer
,
int
sender_send
(
void
*
caller
,
void
*
udata
,
void
*
peer
,
const
unsigned
char
*
data
,
const
int
len
);
void
*
sender_new
();
...
...
raft.h
View file @
49176fc7
...
...
@@ -65,7 +65,7 @@ typedef int (
)
(
void
*
caller
,
void
*
udata
,
const
int
peer
,
void
*
peer
,
const
unsigned
char
*
send_data
,
const
int
len
);
...
...
@@ -146,23 +146,23 @@ int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae);
int
raft_periodic
(
void
*
me_
);
int
raft_recv_appendentries
(
void
*
me_
,
int
peer
,
msg_appendentries_t
*
ae
);
int
raft_recv_appendentries
(
void
*
me_
,
void
*
peer
,
msg_appendentries_t
*
ae
);
int
raft_recv_requestvote
(
void
*
me_
,
int
peer
,
msg_requestvote_t
*
vr
);
int
raft_recv_requestvote
(
void
*
me_
,
void
*
peer
,
msg_requestvote_t
*
vr
);
void
raft_execute_command
(
void
*
me_
);
void
raft_set_election_timeout
(
void
*
me_
,
int
millisec
);
int
raft_vote
(
void
*
me_
,
int
peer
);
int
raft_vote
(
void
*
me_
,
void
*
peer
);
int
raft_add_peer
(
void
*
me_
,
void
*
peer_udata
);
void
*
raft_add_peer
(
void
*
me_
,
void
*
peer_udata
);
int
raft_remove_peer
(
void
*
me_
,
int
peer
);
int
raft_remove_peer
(
void
*
me_
,
void
*
peer
);
int
raft_get_num_peers
(
void
*
me_
);
int
raft_recv_command
(
void
*
me_
,
int
peer
,
msg_command_t
*
cmd
);
int
raft_recv_command
(
void
*
me_
,
void
*
peer
,
msg_command_t
*
cmd
);
int
raft_get_log_size
(
void
*
me_
);
...
...
@@ -182,4 +182,4 @@ int raft_is_leader(void* me_);
int
raft_is_candidate
(
void
*
me_
);
int
raft_send_requestvote
(
void
*
me_
,
int
peer
);
int
raft_send_requestvote
(
void
*
me_
,
void
*
peer
);
raft_server.c
View file @
49176fc7
...
...
@@ -116,22 +116,22 @@ int raft_periodic(void* me_)
/**
* Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */
int
raft_recv_appendentries
(
void
*
me_
,
int
peer
,
msg_appendentries_t
*
ae
)
int
raft_recv_appendentries
(
void
*
me_
,
void
*
peer
,
msg_appendentries_t
*
ae
)
{
return
0
;
}
int
raft_recv_appendentries_response
(
void
*
me_
,
int
peer
,
msg_appendentries_response_t
*
ae
)
int
raft_recv_appendentries_response
(
void
*
me_
,
void
*
peer
,
msg_appendentries_response_t
*
ae
)
{
return
0
;
}
int
raft_recv_requestvote
(
void
*
me_
,
int
peer
,
msg_requestvote_t
*
vr
)
int
raft_recv_requestvote
(
void
*
me_
,
void
*
peer
,
msg_requestvote_t
*
vr
)
{
return
0
;
}
int
raft_recv_requestvote_response
(
void
*
me_
,
int
peer
,
msg_requestvote_response_t
*
r
)
int
raft_recv_requestvote_response
(
void
*
me_
,
void
*
peer
,
msg_requestvote_response_t
*
r
)
{
return
0
;
}
...
...
@@ -144,7 +144,7 @@ void raft_set_election_timeout(void* me_, int millisec)
{
}
int
raft_vote
(
void
*
me_
,
int
peer
)
int
raft_vote
(
void
*
me_
,
void
*
peer
)
{
return
0
;
}
...
...
@@ -156,12 +156,12 @@ void raft_set_configuration(raft_server_t* me)
}
#endif
int
raft_add_peer
(
void
*
me_
,
void
*
peer_udata
)
void
*
raft_add_peer
(
void
*
me_
,
void
*
peer_udata
)
{
return
0
;
return
NULL
;
}
int
raft_remove_peer
(
void
*
me_
,
int
peer
)
int
raft_remove_peer
(
void
*
me_
,
void
*
peer
)
{
return
0
;
}
...
...
@@ -172,7 +172,7 @@ int raft_get_num_peers(void* me_)
return
0
;
}
int
raft_recv_command
(
void
*
me_
,
int
peer
,
msg_command_t
*
cmd
)
int
raft_recv_command
(
void
*
me_
,
void
*
peer
,
msg_command_t
*
cmd
)
{
return
0
;
}
...
...
@@ -220,7 +220,7 @@ int raft_is_candidate(void* me_)
return
0
;
}
int
raft_send_requestvote
(
void
*
me_
,
int
peer
)
int
raft_send_requestvote
(
void
*
me_
,
void
*
peer
)
{
return
0
;
...
...
test_candidate.c
View file @
49176fc7
...
...
@@ -143,7 +143,7 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
/* Candidate 5.2 */
void
TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -161,7 +161,7 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
r
=
raft_new
();
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
...
...
@@ -170,7 +170,7 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_periodic
(
r
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
...
...
@@ -211,7 +211,7 @@ void TestRaft_candidate_will_reject_requestvote_if_its_log_is_more_complete(CuTe
/* Candidate 5.2 */
void
TestRaft_candidate_requestvote_includes_loginfo
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -223,13 +223,14 @@ void TestRaft_candidate_requestvote_includes_loginfo(CuTest * tc)
r
=
raft_new
();
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
3
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_send_requestvote
(
r
,
1
);
raft_send_requestvote
(
r
,
peer
);
msg
=
sender_poll_msg
(
sender
);
// CuAssertTrue(tc, msg_is_requestvote(msg));
...
...
@@ -240,7 +241,7 @@ void TestRaft_candidate_requestvote_includes_loginfo(CuTest * tc)
/* Candidate 5.2 */
void
TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -254,16 +255,18 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
sender
=
sender_new
();
r
=
raft_new
();
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_periodic
(
r
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
...
...
test_follower.c
View file @
49176fc7
...
...
@@ -11,41 +11,44 @@
void
TestRaft_follower_increases_log_after_appendentry
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
r
=
raft_new
();
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_FOLLOWER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_size
(
r
));
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_size
(
r
));
}
void
TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
r
=
raft_new
();
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_FOLLOWER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_size
(
r
));
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_size
(
r
));
}
...
...
test_leader.c
View file @
49176fc7
...
...
@@ -64,7 +64,7 @@ set commitIndex = N (
void
TestRaft_leader_append_command_to_log_increases_idxno
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
msg_command_t
cmd
;
cmd
.
id
=
1
;
...
...
@@ -72,16 +72,17 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
cmd
.
len
=
strlen
(
"command"
);
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_size
(
r
));
raft_recv_command
(
r
,
1
,
&
cmd
);
raft_recv_command
(
r
,
peer
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_size
(
r
));
}
void
TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
msg_command_t
cmd
;
cmd
.
id
=
1
;
...
...
@@ -89,19 +90,47 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
cmd
.
len
=
strlen
(
"command"
);
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_size
(
r
));
raft_recv_command
(
r
,
1
,
&
cmd
);
raft_recv_command
(
r
,
peer
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_size
(
r
));
raft_recv_command
(
r
,
1
,
&
cmd
);
raft_recv_command
(
r
,
peer
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_size
(
r
));
}
void
TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry
(
CuTest
*
tc
)
{
}
void
TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself
(
CuTest
*
tc
)
{
void
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
5
;
ae
.
prevLogIndex
=
6
;
ae
.
prevLogTerm
=
5
;
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
test_server.c
View file @
49176fc7
...
...
@@ -50,7 +50,7 @@ void TestRaft_add_peer(CuTest * tc)
void
TestRaft_remove_peer
(
CuTest
*
tc
)
{
void
*
r
;
int
peer
;
void
*
peer
;
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
...
...
test_server_appendentries.c
View file @
49176fc7
...
...
@@ -12,7 +12,7 @@
/* 5.1 */
void
TestRaft_server_recv_appendentries_reply_false_when_term_less_than_currentterm
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -26,11 +26,12 @@ void TestRaft_server_recv_appendentries_reply_false_when_term_less_than_currentt
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
/* higher current term */
raft_set_current_term
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
/* response is false */
aer
=
sender_poll_msg
(
sender
);
...
...
@@ -44,7 +45,7 @@ void TestRaft_server_recv_appendentries_reply_false_when_term_less_than_currentt
/* 5.3 */
void
TestRaft_server_recv_appendentries_reply_false_if_log_does_not_contain_entry_at_prevLogIndex
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -61,9 +62,10 @@ void TestRaft_server_recv_appendentries_reply_false_if_log_does_not_contain_entr
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_current_term
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
aer
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
0
==
aer
->
success
);
...
...
@@ -72,20 +74,22 @@ void TestRaft_server_recv_appendentries_reply_false_if_log_does_not_contain_entr
/* 5.3 */
void
TestRaft_server_recv_appendentries_delete_entries_if_conflict_with_new_entries
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_current_term
(
r
,
1
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
}
void
TestRaft_server_recv_appendentries_add_new_entries_not_already_in_log
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -99,9 +103,11 @@ void TestRaft_server_recv_appendentries_add_new_entries_not_already_in_log(CuTes
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
// msg = sender_poll_msg(sender);
// CuAssertTrue(tc, aer);
...
...
@@ -113,7 +119,7 @@ void TestRaft_server_recv_appendentries_add_new_entries_not_already_in_log(CuTes
//min(leaderCommit, last log index)
void
TestRaft_server_recv_appendentries_set_commitindex
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -127,9 +133,10 @@ void TestRaft_server_recv_appendentries_set_commitindex(CuTest * tc)
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
// msg = sender_poll_msg(sender);
// CuAssertTrue(tc, aer);
...
...
test_server_request_vote.c
View file @
49176fc7
...
...
@@ -18,7 +18,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -33,9 +33,11 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
voteGranted
);
...
...
@@ -47,7 +49,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
,
*
peer
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -63,10 +65,12 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_vote
(
r
,
2
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
raft_vote
(
r
,
peer
);
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
voteGranted
);
...
...
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