Unverified Commit 85d154b7 authored by Ozan Tezcan's avatar Ozan Tezcan Committed by GitHub
Browse files

Fix: Handle concurrent failures of appendentries (#58)

parent a50fa08e
......@@ -220,9 +220,6 @@ typedef struct
/** If success, this is the highest log IDX we've received and appended to
* our log; otherwise, this is the our currentIndex */
raft_index_t current_idx;
/** what the leader thouught was the index of the log just before the newest_entry */
raft_index_t prev_log_idx;
} msg_appendentries_response_t;
typedef void* raft_server_t;
......
......@@ -661,17 +661,14 @@ int raft_recv_appendentries_response(raft_server_t* me_,
if (0 == r->success)
{
/* If AppendEntries fails because of log inconsistency:
decrement nextIndex and retry (§5.3) */
raft_index_t next_idx = r->prev_log_idx + 1;
assert(0 < next_idx);
/* Stale response -- ignore */
if (r->current_idx < match_idx)
return 0;
if (r->current_idx < next_idx - 1)
raft_node_set_next_idx(node, min(r->current_idx + 1, raft_get_current_idx(me_)));
else
raft_node_set_next_idx(node, next_idx - 1);
raft_index_t next = min(r->current_idx + 1, raft_get_current_idx(me_));
assert(0 < next);
raft_node_set_next_idx(node, next);
/* retry */
raft_send_appendentries(me_, node);
......@@ -758,7 +755,6 @@ int raft_recv_appendentries(
r->msg_id = ae->msg_id;
r->prev_log_idx = ae->prev_log_idx;
r->success = 0;
if (raft_is_candidate(me_) && me->current_term == ae->term)
......
......@@ -3079,7 +3079,6 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx(
aer.term = 2;
aer.success = 0;
aer.current_idx = 1;
aer.prev_log_idx = ae->prev_log_idx;
raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 2, raft_node_get_next_idx(node));
......@@ -3133,8 +3132,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
memset(&aer, 0, sizeof(msg_appendentries_response_t));
aer.term = 2;
aer.success = 0;
aer.current_idx = 4;
aer.prev_log_idx = ae->prev_log_idx;
aer.current_idx = 3;
raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 4, raft_node_get_next_idx(node));
......@@ -3147,8 +3145,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
memset(&aer, 0, sizeof(msg_appendentries_response_t));
aer.term = 2;
aer.success = 0;
aer.current_idx = 4;
aer.prev_log_idx = ae->prev_log_idx;
aer.current_idx = 2;
raft_recv_appendentries_response(r, raft_get_node(r, 2), &aer);
CuAssertIntEquals(tc, 3, raft_node_get_next_idx(node));
......
......@@ -777,7 +777,6 @@ void TestRaft_leader_sends_snapshot_if_log_was_compacted(CuTest* tc)
aer.term = 1;
aer.success = 0;
aer.current_idx = 1;
aer.prev_log_idx = raft_node_get_next_idx(node) - 1;
raft_recv_appendentries_response(r, node, &aer);
CuAssertIntEquals(tc, 1, send_snapshot_count);
......
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