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
Willemt Raft
Commits
396f7b75
Commit
396f7b75
authored
Jan 08, 2018
by
Willem Thiart
Browse files
Fix: handle prevLogIdx < commit index
parent
c2175858
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/raft_server.c
View file @
396f7b75
...
@@ -404,7 +404,8 @@ int raft_recv_appendentries(
...
@@ -404,7 +404,8 @@ int raft_recv_appendentries(
__log
(
me_
,
node
,
"AE term doesn't match prev_term (ie. %d vs %d) ci:%d pli:%d"
,
__log
(
me_
,
node
,
"AE term doesn't match prev_term (ie. %d vs %d) ci:%d pli:%d"
,
ety
->
term
,
ae
->
prev_log_term
,
raft_get_current_idx
(
me_
),
ae
->
prev_log_idx
);
ety
->
term
,
ae
->
prev_log_term
,
raft_get_current_idx
(
me_
),
ae
->
prev_log_idx
);
/* Delete all the following log entries because they don't match */
/* Delete all the following log entries because they don't match */
e
=
raft_delete_entry_from_idx
(
me_
,
ae
->
prev_log_idx
);
e
=
raft_delete_entry_from_idx
(
me_
,
max
(
ae
->
prev_log_idx
,
ae
->
leader_commit
+
1
));
goto
out
;
goto
out
;
}
}
}
}
...
...
tests/test_server.c
View file @
396f7b75
...
@@ -3343,6 +3343,61 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest
...
@@ -3343,6 +3343,61 @@ void TestRaft_leader_recv_entry_is_committed_returns_neg_1_if_invalidated(CuTest
CuAssertTrue
(
tc
,
-
1
==
raft_msg_entry_response_committed
(
r
,
&
cr
));
CuAssertTrue
(
tc
,
-
1
==
raft_msg_entry_response_committed
(
r
,
&
cr
));
}
}
void
TestRaft_leader_recv_entry_fails_if_prevlogidx_less_than_commit
(
CuTest
*
tc
)
{
raft_cbs_t
funcs
=
{
.
persist_term
=
__raft_persist_term
,
.
send_appendentries
=
__raft_send_appendentries
,
};
void
*
r
=
raft_new
();
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
raft_add_node
(
r
,
NULL
,
1
,
1
);
raft_add_node
(
r
,
NULL
,
2
,
0
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_current_term
(
r
,
2
);
raft_set_commit_idx
(
r
,
0
);
/* entry message */
msg_entry_t
mety
=
{};
mety
.
id
=
1
;
mety
.
data
.
buf
=
"entry"
;
mety
.
data
.
len
=
strlen
(
"entry"
);
/* receive entry */
msg_entry_response_t
cr
;
raft_recv_entry
(
r
,
&
mety
,
&
cr
);
CuAssertTrue
(
tc
,
0
==
raft_msg_entry_response_committed
(
r
,
&
cr
));
CuAssertTrue
(
tc
,
cr
.
term
==
2
);
CuAssertTrue
(
tc
,
cr
.
idx
==
1
);
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_commit_idx
(
r
));
raft_set_commit_idx
(
r
,
1
);
/* append entry that invalidates entry message */
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
leader_commit
=
1
;
ae
.
term
=
2
;
ae
.
prev_log_idx
=
1
;
ae
.
prev_log_term
=
1
;
msg_appendentries_response_t
aer
;
msg_entry_t
e
[
1
];
memset
(
&
e
,
0
,
sizeof
(
msg_entry_t
)
*
1
);
e
[
0
].
term
=
2
;
e
[
0
].
id
=
999
;
e
[
0
].
data
.
buf
=
"aaa"
;
e
[
0
].
data
.
len
=
3
;
ae
.
entries
=
e
;
ae
.
n_entries
=
1
;
raft_recv_appendentries
(
r
,
raft_get_node
(
r
,
2
),
&
ae
,
&
aer
);
CuAssertIntEquals
(
tc
,
0
,
aer
.
success
);
}
void
TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes
(
CuTest
*
tc
)
void
TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes
(
CuTest
*
tc
)
{
{
void
*
r
=
raft_new
();
void
*
r
=
raft_new
();
...
...
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