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