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
RedisLabs Raft
Commits
1ce89f2e
Commit
1ce89f2e
authored
Nov 18, 2015
by
Willem Thiart
Browse files
Add improved vote granting logic
parent
9f7fa0a0
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/raft_server.c
View file @
1ce89f2e
...
@@ -364,18 +364,29 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
...
@@ -364,18 +364,29 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
if
(
vr
->
term
<
raft_get_current_term
((
void
*
)
me
))
if
(
vr
->
term
<
raft_get_current_term
((
void
*
)
me
))
return
0
;
return
0
;
/* 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
(
-
1
!=
me
->
voted_for
)
return
0
;
return
0
;
/* we have a more up-to-date log */
int
current_idx
=
raft_get_current_idx
((
void
*
)
me
);
if
(
vr
->
last_log_idx
<
raft_get_current_idx
((
void
*
)
me
))
return
0
;
if
(
0
==
current_idx
)
return
1
;
raft_entry_t
*
e
=
raft_get_entry_from_idx
((
void
*
)
me
,
current_idx
);
if
(
e
->
term
<
vr
->
last_log_term
)
return
1
;
return
1
;
if
(
vr
->
last_log_term
==
e
->
term
&&
current_idx
<=
vr
->
last_log_idx
)
return
1
;
return
0
;
}
}
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
)
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_
;
...
...
tests/test_server.c
View file @
1ce89f2e
...
@@ -1085,8 +1085,9 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
...
@@ -1085,8 +1085,9 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
rv
.
last_log_idx
=
1
;
rv
.
last_log_idx
=
1
;
rv
.
last_log_term
=
1
;
rv
.
last_log_term
=
1
;
/* server's term and idx are more up-to-date */
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
/* server's idx are more up-to-date */
raft_entry_t
ety
;
raft_entry_t
ety
;
ety
.
term
=
1
;
ety
.
term
=
1
;
ety
.
id
=
100
;
ety
.
id
=
100
;
...
@@ -1099,6 +1100,16 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
...
@@ -1099,6 +1100,16 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
/* vote not granted */
/* vote not granted */
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
/* approve vote, because last_log_term is higher */
raft_set_current_term
(
r
,
2
);
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_t
));
rv
.
term
=
2
;
rv
.
candidate_id
=
1
;
rv
.
last_log_idx
=
1
;
rv
.
last_log_term
=
2
;
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
CuAssertTrue
(
tc
,
1
==
rvr
.
vote_granted
);
}
}
void
TestRaft_candidate_becomes_candidate_is_candidate
(
CuTest
*
tc
)
void
TestRaft_candidate_becomes_candidate_is_candidate
(
CuTest
*
tc
)
...
...
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