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
271f0809
Commit
271f0809
authored
Nov 18, 2015
by
Willem Thiart
Browse files
Candidate steps down if appendentries has same term
parent
1ce89f2e
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/raft_server.c
View file @
271f0809
...
@@ -256,15 +256,19 @@ int raft_recv_appendentries(
...
@@ -256,15 +256,19 @@ int raft_recv_appendentries(
r
->
term
=
me
->
current_term
;
r
->
term
=
me
->
current_term
;
if
(
me
->
current_term
<
ae
->
term
)
if
(
raft_is_candidate
(
me_
)
&&
me
->
current_term
==
ae
->
term
)
{
me
->
voted_for
=
-
1
;
raft_become_follower
(
me_
);
}
else
if
(
me
->
current_term
<
ae
->
term
)
{
{
raft_set_current_term
(
me_
,
ae
->
term
);
raft_set_current_term
(
me_
,
ae
->
term
);
raft_become_follower
(
me_
);
raft_become_follower
(
me_
);
}
}
else
if
(
ae
->
term
<
me
->
current_term
)
/* 1. Reply false if term < currentTerm (§5.1) */
if
(
ae
->
term
<
me
->
current_term
)
{
{
/* 1. Reply false if term < currentTerm (§5.1) */
__log
(
me_
,
"AE term is less than current term"
);
__log
(
me_
,
"AE term is less than current term"
);
goto
fail_with_current_idx
;
goto
fail_with_current_idx
;
}
}
...
...
tests/test_server.c
View file @
271f0809
...
@@ -1374,7 +1374,7 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
...
@@ -1374,7 +1374,7 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
}
}
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_recv_appendentries_frm_
invalid_leader_doesnt
_result_in_
follower
(
void
TestRaft_candidate_recv_appendentries_fr
o
m_
same_term
_result
s
_in_
step_down
(
CuTest
*
tc
)
CuTest
*
tc
)
{
{
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
...
@@ -1384,25 +1384,19 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
...
@@ -1384,25 +1384,19 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
raft_add_node
(
r
,
(
void
*
)
1
,
1
);
raft_add_node
(
r
,
(
void
*
)
1
,
1
);
raft_add_node
(
r
,
(
void
*
)
2
,
0
);
raft_add_node
(
r
,
(
void
*
)
2
,
0
);
/* server's log is newer */
raft_set_current_term
(
r
,
2
);
raft_set_current_term
(
r
,
1
);
/* is a candidate */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
/* invalid leader determined by "leaders" old log */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
ae
.
term
=
2
;
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 */
/* appendentry from invalid leader doesn't make candidate become follower */
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
raft_is_candidate
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_candidate
(
r
));
/* should not have changed leader after rejecting appendentry */
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
}
}
void
TestRaft_leader_becomes_leader_is_leader
(
CuTest
*
tc
)
void
TestRaft_leader_becomes_leader_is_leader
(
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