Commit 218ca951 authored by Willem Thiart's avatar Willem Thiart
Browse files

Fix: log_delete into raft_delete_entry_from_idx

Prevent membership change errors caused by popping log entries.
parent 66a1f846
...@@ -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)
......
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