Commit 760b29fe authored by Willem Thiart's avatar Willem Thiart
Browse files

Force step down in appendentries for all state

A leader should not receive appendentries from another leader of the
same term. This is because of Raft's election safety invariant.
parent 05608a3b
......@@ -247,9 +247,11 @@ int raft_recv_appendentries(
r->term = me->current_term;
/* Step down - we've found a leader who is legitimate */
if (raft_is_leader(me_) && me->current_term <= ae->term)
if (me->current_term < ae->term)
{
raft_set_current_term(me_, ae->term);
raft_become_follower(me_);
}
/* 1. Reply false if term < currentTerm (§5.1) */
if (ae->term < me->current_term)
......@@ -314,11 +316,6 @@ int raft_recv_appendentries(
raft_set_commit_idx(me_, min(last_log_idx, ae->leader_commit));
}
if (raft_is_candidate(me_))
raft_become_follower(me_);
raft_set_current_term(me_, ae->term);
/* update current leader because we accepted appendentries from it */
me->current_leader = node;
......
......@@ -2087,7 +2087,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
CuAssertTrue(tc, 0 == raft_get_current_leader(r));
memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 5;
ae.term = 6;
ae.prev_log_idx = 6;
ae.prev_log_term = 5;
raft_recv_appendentries(r, 1, &ae, &aer);
......
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