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
3fc7f32b
Commit
3fc7f32b
authored
Nov 06, 2015
by
Willem Thiart
Browse files
Fix entries not having their term checked
Thanks to @ar104 for the fix!
parent
30e4688b
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/raft_server.c
View file @
3fc7f32b
...
...
@@ -283,9 +283,19 @@ int raft_recv_appendentries(
/* 3. If an existing entry conflicts with a new one (same index
but different terms), delete the existing entry and all that
follow it (§5.3) */
raft_entry_t
*
e2
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
+
1
);
if
(
e2
)
log_delete
(
me
->
log
,
ae
->
prev_log_idx
+
1
);
int
has_mismatch
=
0
,
i
;
for
(
i
=
0
;
i
<
ae
->
n_entries
;
i
++
)
{
msg_entry_t
*
cmd
=
&
ae
->
entries
[
i
];
int
index
=
ae
->
prev_log_idx
+
1
+
i
;
raft_entry_t
*
e2
=
raft_get_entry_from_idx
(
me_
,
index
);
if
(
!
e2
)
break
;
/* reached end of log */
if
(
e2
&&
e2
->
term
!=
cmd
->
term
)
has_mismatch
=
1
;
if
(
has_mismatch
)
log_delete
(
me
->
log
,
index
);
}
/* 4. If leaderCommit > commitIndex, set commitIndex =
min(leaderCommit, index of most recent entry) */
...
...
@@ -304,8 +314,6 @@ int raft_recv_appendentries(
/* update current leader because we accepted appendentries from it */
me
->
current_leader
=
node
;
int
i
;
/* append all entries to log */
for
(
i
=
0
;
i
<
ae
->
n_entries
;
i
++
)
{
...
...
tests/test_server.c
View file @
3fc7f32b
...
...
@@ -711,8 +711,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_
}
/* 5.3 */
void
TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
(
void
TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
(
CuTest
*
tc
)
{
msg_appendentries_t
ae
;
...
...
@@ -747,6 +746,17 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
.
buf
,
str2
,
3
));
/* this log will be overwritten by the appendentries below */
char
*
str3
=
"333"
;
ety
.
data
.
buf
=
str3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
3
;
ety
.
term
=
1
;
raft_append_entry
(
r
,
&
ety
);
CuAssertTrue
(
tc
,
3
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
3
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
.
buf
,
str3
,
3
));
/* pass a appendentry that is newer */
msg_entry_t
mety
;
...
...
@@ -756,10 +766,10 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
ae
.
prev_log_term
=
1
;
/* include one entry */
memset
(
&
mety
,
0
,
sizeof
(
msg_entry_t
));
char
*
str
3
=
"
333
"
;
mety
.
data
.
buf
=
str
3
;
char
*
str
4
=
"
444
"
;
mety
.
data
.
buf
=
str
4
;
mety
.
data
.
len
=
3
;
mety
.
id
=
3
;
mety
.
id
=
4
;
ae
.
entries
=
&
mety
;
ae
.
n_entries
=
1
;
...
...
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