Commit 3fc7f32b authored by Willem Thiart's avatar Willem Thiart
Browse files

Fix entries not having their term checked

Thanks to @ar104 for the fix!
parent 30e4688b
......@@ -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++)
{
......
......@@ -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 *str3 = "333";
mety.data.buf = str3;
char *str4 = "444";
mety.data.buf = str4;
mety.data.len = 3;
mety.id = 3;
mety.id = 4;
ae.entries = &mety;
ae.n_entries = 1;
......
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