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
RedisLabs Raft
Commits
85d154b7
Unverified
Commit
85d154b7
authored
Sep 15, 2021
by
Ozan Tezcan
Committed by
GitHub
Sep 15, 2021
Browse files
Fix: Handle concurrent failures of appendentries (#58)
parent
a50fa08e
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
85d154b7
...
@@ -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
;
...
...
src/raft_server.c
View file @
85d154b7
...
@@ -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
)
...
...
tests/test_server.c
View file @
85d154b7
...
@@ -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
));
...
...
tests/test_snapshotting.c
View file @
85d154b7
...
@@ -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
);
...
...
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