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
72f03664
Commit
72f03664
authored
Feb 14, 2014
by
willem
Browse files
Multiple send functions
parent
1d8c95e1
Changes
6
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
72f03664
...
...
@@ -105,23 +105,100 @@ typedef enum {
RAFT_MSG_ENTRY_RESPONSE
,
}
raft_message_type_e
;
typedef
int
(
*
func_send_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
raft_message_type_e
msg_type
,
const
unsigned
char
*
send_data
,
const
int
len
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @param msg_type ID of the message type
* @param send_data Data to be sent
* @param len Length in bytes of data to be sent
* @return 0 on error */
typedef
int
(
*
func_send_f
*
func_send_
requestvote_
f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
raft_message_type_e
msg_type
,
const
unsigned
char
*
send_data
,
const
int
len
msg_requestvote_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @return 0 on error */
typedef
int
(
*
func_send_requestvote_response_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
msg_requestvote_response_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @return 0 on error */
typedef
int
(
*
func_send_appendentries_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
msg_appendentries_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @return 0 on error */
typedef
int
(
*
func_send_appendentries_response_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
msg_appendentries_response_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @return 0 on error */
typedef
int
(
*
func_send_entries_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
msg_entry_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @return 0 on error */
typedef
int
(
*
func_send_entries_response_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
msg_entry_response_t
*
msg
);
#ifndef HAVE_FUNC_LOG
...
...
@@ -153,12 +230,16 @@ typedef int (
);
typedef
struct
{
func_send_f
send
;
func_send_requestvote_f
send_requestvote
;
func_send_requestvote_response_f
send_requestvote_response
;
func_send_appendentries_f
send_appendentries
;
func_send_appendentries_response_f
send_appendentries_response
;
func_send_entries_f
send_entries
;
func_send_entries_response_f
send_entries_response
;
func_log_f
log
;
func_applylog_f
applylog
;
}
raft_cbs_t
;
typedef
struct
{
/* entry's term */
unsigned
int
term
;
...
...
raft_server.c
View file @
72f03664
...
...
@@ -343,9 +343,8 @@ int raft_recv_appendentries(
r
.
first_idx
=
ae
->
prev_log_idx
+
1
;
done:
if
(
me
->
cb
.
send
)
me
->
cb
.
send
(
me_
,
me
->
udata
,
node
,
RAFT_MSG_APPENDENTRIES_RESPONSE
,
(
void
*
)
&
r
,
sizeof
(
msg_appendentries_response_t
));
if
(
me
->
cb
.
send_appendentries_response
)
me
->
cb
.
send_appendentries_response
(
me_
,
me
->
udata
,
node
,
&
r
);
return
1
;
}
...
...
@@ -377,9 +376,8 @@ int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr)
node
,
r
.
vote_granted
==
1
?
"granted"
:
"not granted"
);
r
.
term
=
raft_get_current_term
(
me_
);
if
(
me
->
cb
.
send
)
me
->
cb
.
send
(
me_
,
me
->
udata
,
node
,
RAFT_MSG_REQUESTVOTE_RESPONSE
,
(
void
*
)
&
r
,
sizeof
(
msg_requestvote_response_t
));
if
(
me
->
cb
.
send_requestvote_response
)
me
->
cb
.
send_requestvote_response
(
me_
,
me
->
udata
,
node
,
&
r
);
return
0
;
}
...
...
@@ -433,9 +431,8 @@ int raft_send_entry_response(raft_server_t* me_,
res
.
id
=
etyid
;
res
.
was_committed
=
was_committed
;
if
(
me
->
cb
.
send
)
me
->
cb
.
send
(
me_
,
me
->
udata
,
node
,
RAFT_MSG_ENTRY_RESPONSE
,
(
void
*
)
&
res
,
sizeof
(
msg_entry_response_t
));
if
(
me
->
cb
.
send_entries_response
)
me
->
cb
.
send_entries_response
(
me_
,
me
->
udata
,
node
,
&
res
);
return
0
;
}
...
...
@@ -470,9 +467,8 @@ int raft_send_requestvote(raft_server_t* me_, int node)
rv
.
term
=
me
->
current_term
;
rv
.
last_log_idx
=
raft_get_current_idx
(
me_
);
if
(
me
->
cb
.
send
)
me
->
cb
.
send
(
me_
,
me
->
udata
,
node
,
RAFT_MSG_REQUESTVOTE
,
(
void
*
)
&
rv
,
sizeof
(
msg_requestvote_t
));
if
(
me
->
cb
.
send_requestvote
)
me
->
cb
.
send_requestvote
(
me_
,
me
->
udata
,
node
,
&
rv
);
return
1
;
}
...
...
@@ -512,7 +508,7 @@ void raft_send_appendentries(raft_server_t* me_, int node)
__log
(
me_
,
NULL
,
"sending appendentries to: %d"
,
node
);
if
(
!
(
me
->
cb
.
send
))
if
(
!
(
me
->
cb
.
send
_appendentries
))
return
;
msg_appendentries_t
ae
;
...
...
@@ -524,8 +520,8 @@ void raft_send_appendentries(raft_server_t* me_, int node)
// TODO:
ae
.
prev_log_idx
=
0
;
ae
.
n_entries
=
0
;
me
->
cb
.
send
(
me_
,
me
->
udata
,
node
,
RAFT_MSG_APPENDENTRIES
,
(
void
*
)
&
ae
,
sizeof
(
msg_appendentries_t
)
);
if
(
me
->
cb
.
send
_appendentries
)
me
->
cb
.
send_appendentries
(
me_
,
me
->
udata
,
node
,
&
ae
);
}
void
raft_send_appendentries_all
(
raft_server_t
*
me_
)
...
...
tests/mock_send_functions.c
View file @
72f03664
...
...
@@ -40,6 +40,8 @@ void senders_new()
__nsenders
=
0
;
}
#if 0
int sender_send(raft_server_t* raft,
void* udata,
int peer,
...
...
@@ -65,6 +67,69 @@ int sender_send(raft_server_t* raft,
return 0;
}
#endif
int
__append_msg
(
sender_t
*
me
,
void
*
data
,
int
type
,
int
len
,
int
peer
,
raft_server_t
*
raft
)
{
msg_t
*
m
;
m
=
malloc
(
sizeof
(
msg_t
));
m
->
type
=
type
;
m
->
len
=
len
;
m
->
data
=
malloc
(
len
);
m
->
sender
=
raft_get_nodeid
(
raft
);
memcpy
(
m
->
data
,
data
,
len
);
llqueue_offer
(
me
->
outbox
,
m
);
if
(
__nsenders
>
peer
)
{
llqueue_offer
(
__senders
[
peer
]
->
inbox
,
m
);
}
return
1
;
}
int
sender_requestvote
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_requestvote_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_REQUESTVOTE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_requestvote_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_requestvote_response_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_REQUESTVOTE_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_appendentries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_appendentries_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_response_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_entries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_entry_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_ENTRY
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_entries_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_entry_response_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_ENTRY_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
void
*
sender_new
(
void
*
address
)
{
...
...
tests/mock_send_functions.h
View file @
72f03664
int
sender_send
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
raft_message_type_e
type
,
const
unsigned
char
*
data
,
const
int
len
);
void
*
sender_new
(
void
*
address
);
void
*
sender_poll_msg_data
(
void
*
s
);
int
sender_msgs_available
(
void
*
s
);
int
sender_requestvote
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_requestvote_t
*
msg
);
int
sender_requestvote_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_requestvote_response_t
*
msg
);
int
sender_appendentries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_t
*
msg
);
int
sender_appendentries_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_response_t
*
msg
);
int
sender_entries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_entry_t
*
msg
);
int
sender_entries_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_entry_response_t
*
msg
);
tests/test_scenario.c
View file @
72f03664
...
...
@@ -33,7 +33,12 @@ void TestRaft_scenario_leader_appears(CuTest * tc)
raft_set_election_timeout
(
r
[
j
],
500
);
raft_set_configuration
(
r
[
j
],
cfg
,
j
);
raft_set_callbacks
(
r
[
j
],
&
((
raft_cbs_t
)
{
.
send
=
sender_send
,
.
send_requestvote
=
sender_requestvote
,
.
send_requestvote_response
=
sender_requestvote_response
,
.
send_appendentries
=
sender_appendentries
,
.
send_appendentries_response
=
sender_appendentries_response
,
.
send_entries
=
sender_entries
,
.
send_entries_response
=
sender_entries_response
,
.
log
=
NULL
}),
sender
[
j
]);
}
...
...
tests/test_server.c
View file @
72f03664
...
...
@@ -423,7 +423,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
};
msg_requestvote_t
rv
;
...
...
@@ -461,7 +461,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
void
*
sender
;
void
*
msg
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
};
msg_requestvote_t
rv
;
...
...
@@ -520,7 +520,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
msg_appendentries_t
ae
;
...
...
@@ -561,7 +561,7 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
msg_appendentries_response_t
*
aer
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -636,7 +636,7 @@ void TestRaft_follower_increases_log_after_appendentry(CuTest * tc)
char
*
str
=
"aaa"
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -687,7 +687,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
msg_entry_t
ety
;
char
*
str
=
"aaa"
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -743,7 +743,7 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
raft_entry_t
*
ety_appended
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -812,7 +812,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -857,7 +857,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(CuTest * t
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -910,7 +910,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(CuTest *
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -988,7 +988,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTe
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
};
...
...
@@ -1100,7 +1100,7 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(CuTe
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_requestvote
=
sender_requestvote
,
.
log
=
NULL
};
raft_node_configuration_t
cfg
[]
=
{
...
...
@@ -1139,7 +1139,6 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
...
...
@@ -1181,7 +1180,6 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
...
...
@@ -1230,7 +1228,7 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
void
*
sender
;
void
*
msg
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
};
...
...
@@ -1264,7 +1262,7 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc)
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_requestvote
=
sender_requestvote
,
.
log
=
NULL
};
msg_requestvote_t
*
rv
;
...
...
@@ -1298,7 +1296,6 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
void
*
sender
;
void
*
msg
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
...
...
@@ -1331,7 +1328,6 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
...
...
@@ -1393,7 +1389,6 @@ void TestRaft_leader_when_becomes_leader_all_nodes_have_nextidx_equal_to_lastlog
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
...
...
@@ -1431,7 +1426,7 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries
=
sender_appendentries
,
.
log
=
NULL
};
...
...
@@ -1466,7 +1461,7 @@ void TestRaft_leader_responds_to_entry_msg_when_entry_is_committed(CuTest * tc)
void
*
r
,
*
sender
;
msg_entry_response_t
*
cr
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_entries_response
=
sender_entries_response
,
.
log
=
NULL
};
...
...
@@ -1509,7 +1504,7 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries
=
sender_appendentries
,
.
log
=
NULL
};
...
...
@@ -1519,7 +1514,6 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
*
ae
;
sender
=
sender_new
(
NULL
);
...
...
@@ -1546,7 +1540,7 @@ void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsis
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send
_appendentries
=
sender_appendentries
,
.
log
=
NULL
};
...
...
@@ -1556,7 +1550,6 @@ void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsis
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
*
ae
;
sender
=
sender_new
(
NULL
);
...
...
@@ -1587,7 +1580,6 @@ void TestRaft_leader_append_entry_to_log_increases_idxno(CuTest * tc)
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_entry_t
ety
;
ety
.
id
=
1
;
ety
.
data
=
"entry"
;
...
...
@@ -1638,7 +1630,8 @@ void TestRaft_leader_increase_commit_idx_when_majority_have_entry_and_atleast_on
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
send_appendentries
=
sender_appendentries
,
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
msg_appendentries_response_t
aer
;
...
...
@@ -1712,7 +1705,6 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
...
...
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