Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Willemt Raft
Commits
164beb15
Commit
164beb15
authored
Feb 02, 2015
by
Willem Thiart
Browse files
Made receive VoteRequest easier
parent
1b2a7e22
Changes
5
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
164beb15
...
...
@@ -127,20 +127,6 @@ typedef int (
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
...
...
@@ -214,7 +200,6 @@ typedef int (
typedef
struct
{
func_send_requestvote_f
send_requestvote
;
func_send_requestvote_response_f
send_requestvote_response
;
func_send_appendentries_f
send_appendentries
;
func_send_entries_f
send_entries
;
func_send_entries_response_f
send_entries_response
;
...
...
@@ -285,6 +270,7 @@ int raft_periodic(raft_server_t* me, int msec_elapsed);
/**
* Receive an appendentries message
* This function should block if it needs to append the message.
* @param node Index of the node who sent us this message
* @param ae The appendentries message
* @param[out] r The resulting response
...
...
@@ -304,9 +290,11 @@ int raft_recv_appendentries_response(raft_server_t* me_,
* Receive a requestvote message
* @param node Index of the node who sent us this message
* @param vr The requestvote message
* @param[out] r The resulting response
* @return 0 on error */
int
raft_recv_requestvote
(
raft_server_t
*
me
,
int
node
,
msg_requestvote_t
*
vr
);
msg_requestvote_t
*
vr
,
msg_requestvote_response_t
*
r
);
/**
* Receive a response from a requestvote message we sent
...
...
@@ -320,6 +308,7 @@ int raft_recv_requestvote_response(raft_server_t* me, int node,
* Receive an entry message from client.
* Append the entry to the log
* Send appendentries to followers
* This function should block if it needs to append the message.
* @param node Index of the node who sent us this message
* @param e The entry message */
int
raft_recv_entry
(
raft_server_t
*
me
,
int
node
,
msg_entry_t
*
e
);
...
...
src/raft_server.c
View file @
164beb15
...
...
@@ -337,10 +337,10 @@ int raft_recv_appendentries(
return
1
;
}
int
raft_recv_requestvote
(
raft_server_t
*
me_
,
int
node
,
msg_requestvote_t
*
vr
)
int
raft_recv_requestvote
(
raft_server_t
*
me_
,
int
node
,
msg_requestvote_t
*
vr
,
msg_requestvote_response_t
*
r
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
msg_requestvote_response_t
r
;
if
(
raft_get_current_term
(
me_
)
<
vr
->
term
)
me
->
voted_for
=
-
1
;
...
...
@@ -350,20 +350,17 @@ int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr)
-
1
!=
me
->
voted_for
||
/* we have a more up-to-date log */
vr
->
last_log_idx
<
me
->
current_idx
)
r
.
vote_granted
=
0
;
r
->
vote_granted
=
0
;
else
{
raft_vote
(
me_
,
node
);
r
.
vote_granted
=
1
;
r
->
vote_granted
=
1
;
}
__log
(
me_
,
"node requested vote: %d replying: %s"
,
node
,
r
.
vote_granted
==
1
?
"granted"
:
"not granted"
);
r
.
term
=
raft_get_current_term
(
me_
);
if
(
me
->
cb
.
send_requestvote_response
)
me
->
cb
.
send_requestvote_response
(
me_
,
me
->
udata
,
node
,
&
r
);
node
,
r
->
vote_granted
==
1
?
"granted"
:
"not granted"
);
r
->
term
=
raft_get_current_term
(
me_
);
return
0
;
}
...
...
tests/mock_send_functions.c
View file @
164beb15
...
...
@@ -160,8 +160,13 @@ void sender_poll_msgs(void* s)
raft_recv_appendentries_response
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_REQUESTVOTE
:
raft_recv_requestvote
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
{
msg_requestvote_response_t
response
;
raft_recv_requestvote
(
me
->
raft
,
m
->
sender
,
m
->
data
,
&
response
);
__append_msg
(
me
,
&
response
,
RAFT_MSG_REQUESTVOTE_RESPONSE
,
sizeof
(
response
),
m
->
sender
,
me
->
raft
);
}
break
;
case
RAFT_MSG_REQUESTVOTE_RESPONSE
:
raft_recv_requestvote_response
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
...
...
tests/test_scenario.c
View file @
164beb15
...
...
@@ -35,10 +35,7 @@ void TestRaft_scenario_leader_appears(CuTest * tc)
raft_set_callbacks
(
r
[
j
],
&
((
raft_cbs_t
)
{
.
send_requestvote
=
sender_requestvote
,
.
send_requestvote_response
=
sender_requestvote_response
,
.
send_appendentries
=
sender_appendentries
,
.
send_appendentries
=
sender_appendentries
,
.
send_entries
=
sender_entries
,
.
send_entries_response
=
sender_entries_response
,
...
...
tests/test_server.c
View file @
164beb15
...
...
@@ -431,11 +431,10 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
.
log
=
NULL
};
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
msg_requestvote_response_t
rvr
;
/* 2 nodes */
raft_node_configuration_t
cfg
[]
=
{
...
...
@@ -453,11 +452,9 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
/* term is less than current term */
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_t
));
rv
.
term
=
1
;
raft_recv_requestvote
(
r
,
1
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
rvr
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
}
/* If votedFor is null or candidateId, and candidate's log is at
...
...
@@ -469,11 +466,10 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
.
log
=
NULL
};
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
msg_requestvote_response_t
rvr
;
/* 2 nodes */
raft_node_configuration_t
cfg
[]
=
{
...
...
@@ -495,11 +491,8 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
rv
.
candidate_id
=
1
;
rv
.
last_log_idx
=
0
;
rv
.
last_log_term
=
1
;
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
}
void
TestRaft_follower_becomes_follower_is_follower
(
CuTest
*
tc
)
...
...
@@ -531,7 +524,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
...
...
@@ -572,7 +565,7 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
msg_appendentries_response_t
aer
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -648,7 +641,7 @@ void TestRaft_follower_increases_log_after_appendentry(CuTest * tc)
char
*
str
=
"aaa"
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -698,7 +691,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_
msg_entry_t
ety
;
char
*
str
=
"aaa"
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
raft_node_configuration_t
cfg
[]
=
{
...
...
@@ -754,7 +747,7 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
raft_entry_t
*
ety_appended
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -822,7 +815,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -867,7 +860,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -920,7 +913,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -1000,8 +993,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -1013,7 +1005,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
msg_requestvote_response_t
rvr
;
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
...
...
@@ -1033,10 +1025,8 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
raft_set_current_idx
(
r
,
2
);
/* vote not granted */
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
}
void
TestRaft_candidate_becomes_candidate_is_candidate
(
CuTest
*
tc
)
...
...
@@ -1249,8 +1239,7 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_requestvote_response
=
sender_requestvote_response
,
.
log
=
NULL
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -1260,8 +1249,8 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
{
(
-
1
),
NULL
}
};
msg_requestvote_response_t
*
rvr
;
msg_requestvote_t
rv
;
msg_requestvote_response_t
rvr
;
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
...
...
@@ -1271,11 +1260,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
raft_vote
(
r
,
0
);
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_t
));
raft_recv_requestvote
(
r
,
1
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
/* we've vote already, so won't respond with a vote granted... */
rvr
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
}
/* Candidate 5.2 */
...
...
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