Commit 271f0809 authored by Willem Thiart's avatar Willem Thiart
Browse files

Candidate steps down if appendentries has same term

parent 1ce89f2e
...@@ -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;
} }
......
...@@ -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_from_same_term_results_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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment