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
218ca951
Commit
218ca951
authored
May 20, 2016
by
Willem Thiart
Browse files
Fix: log_delete into raft_delete_entry_from_idx
Prevent membership change errors caused by popping log entries.
parent
66a1f846
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/raft_server.c
View file @
218ca951
...
@@ -94,6 +94,16 @@ void raft_clear(raft_server_t* me_)
...
@@ -94,6 +94,16 @@ void raft_clear(raft_server_t* me_)
log_clear
(
me
->
log
);
log_clear
(
me
->
log
);
}
}
void
raft_delete_entry_from_idx
(
raft_server_t
*
me_
,
int
idx
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
idx
<=
me
->
voting_cfg_change_log_idx
)
me
->
voting_cfg_change_log_idx
=
-
1
;
log_delete
(
me
->
log
,
idx
);
}
void
raft_election_start
(
raft_server_t
*
me_
)
void
raft_election_start
(
raft_server_t
*
me_
)
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
...
@@ -364,7 +374,7 @@ int raft_recv_appendentries(
...
@@ -364,7 +374,7 @@ int raft_recv_appendentries(
e
->
term
,
ae
->
prev_log_term
,
raft_get_current_idx
(
me_
),
ae
->
prev_log_idx
);
e
->
term
,
ae
->
prev_log_term
,
raft_get_current_idx
(
me_
),
ae
->
prev_log_idx
);
assert
(
me
->
commit_idx
<
ae
->
prev_log_idx
);
assert
(
me
->
commit_idx
<
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 */
log
_delete
(
me
->
log
,
ae
->
prev_log_idx
);
raft
_delete
_entry_from_idx
(
me_
,
ae
->
prev_log_idx
);
r
->
current_idx
=
ae
->
prev_log_idx
-
1
;
r
->
current_idx
=
ae
->
prev_log_idx
-
1
;
goto
fail
;
goto
fail
;
}
}
...
@@ -376,7 +386,7 @@ int raft_recv_appendentries(
...
@@ -376,7 +386,7 @@ int raft_recv_appendentries(
if
(
ae
->
n_entries
==
0
&&
0
<
ae
->
prev_log_idx
&&
ae
->
prev_log_idx
+
1
<
raft_get_current_idx
(
me_
))
if
(
ae
->
n_entries
==
0
&&
0
<
ae
->
prev_log_idx
&&
ae
->
prev_log_idx
+
1
<
raft_get_current_idx
(
me_
))
{
{
assert
(
me
->
commit_idx
<
ae
->
prev_log_idx
+
1
);
assert
(
me
->
commit_idx
<
ae
->
prev_log_idx
+
1
);
log
_delete
(
me
->
log
,
ae
->
prev_log_idx
+
1
);
raft
_delete
_entry_from_idx
(
me_
,
ae
->
prev_log_idx
+
1
);
}
}
r
->
current_idx
=
ae
->
prev_log_idx
;
r
->
current_idx
=
ae
->
prev_log_idx
;
...
@@ -384,14 +394,14 @@ int raft_recv_appendentries(
...
@@ -384,14 +394,14 @@ int raft_recv_appendentries(
int
i
;
int
i
;
for
(
i
=
0
;
i
<
ae
->
n_entries
;
i
++
)
for
(
i
=
0
;
i
<
ae
->
n_entries
;
i
++
)
{
{
msg
_entry_t
*
ety
=
&
ae
->
entries
[
i
];
raft
_entry_t
*
ety
=
&
ae
->
entries
[
i
];
int
ety_index
=
ae
->
prev_log_idx
+
1
+
i
;
int
ety_index
=
ae
->
prev_log_idx
+
1
+
i
;
raft_entry_t
*
existing_ety
=
raft_get_entry_from_idx
(
me_
,
ety_index
);
raft_entry_t
*
existing_ety
=
raft_get_entry_from_idx
(
me_
,
ety_index
);
r
->
current_idx
=
ety_index
;
r
->
current_idx
=
ety_index
;
if
(
existing_ety
&&
existing_ety
->
term
!=
ety
->
term
)
if
(
existing_ety
&&
existing_ety
->
term
!=
ety
->
term
)
{
{
assert
(
me
->
commit_idx
<
ety_index
);
assert
(
me
->
commit_idx
<
ety_index
);
log
_delete
(
me
->
log
,
ety_index
);
raft
_delete
_entry_from_idx
(
me_
,
ety_index
);
break
;
break
;
}
}
else
if
(
!
existing_ety
)
else
if
(
!
existing_ety
)
...
...
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