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( ...@@ -283,9 +283,19 @@ int raft_recv_appendentries(
/* 3. If an existing entry conflicts with a new one (same index /* 3. If an existing entry conflicts with a new one (same index
but different terms), delete the existing entry and all that but different terms), delete the existing entry and all that
follow it (§5.3) */ follow it (§5.3) */
raft_entry_t* e2 = raft_get_entry_from_idx(me_, ae->prev_log_idx + 1); int has_mismatch = 0, i;
if (e2) for (i = 0; i < ae->n_entries; i++)
log_delete(me->log, ae->prev_log_idx + 1); {
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 = /* 4. If leaderCommit > commitIndex, set commitIndex =
min(leaderCommit, index of most recent entry) */ min(leaderCommit, index of most recent entry) */
...@@ -304,8 +314,6 @@ int raft_recv_appendentries( ...@@ -304,8 +314,6 @@ int raft_recv_appendentries(
/* update current leader because we accepted appendentries from it */ /* update current leader because we accepted appendentries from it */
me->current_leader = node; me->current_leader = node;
int i;
/* append all entries to log */ /* append all entries to log */
for (i = 0; i < ae->n_entries; i++) 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_ ...@@ -711,8 +711,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_
} }
/* 5.3 */ /* 5.3 */
void void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries(
TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries(
CuTest * tc) CuTest * tc)
{ {
msg_appendentries_t ae; msg_appendentries_t ae;
...@@ -747,6 +746,17 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries ...@@ -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, NULL != (ety_appended = raft_get_entry_from_idx(r, 2)));
CuAssertTrue(tc, !strncmp(ety_appended->data.buf, str2, 3)); 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 */ /* pass a appendentry that is newer */
msg_entry_t mety; msg_entry_t mety;
...@@ -756,10 +766,10 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries ...@@ -756,10 +766,10 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
ae.prev_log_term = 1; ae.prev_log_term = 1;
/* include one entry */ /* include one entry */
memset(&mety, 0, sizeof(msg_entry_t)); memset(&mety, 0, sizeof(msg_entry_t));
char *str3 = "333"; char *str4 = "444";
mety.data.buf = str3; mety.data.buf = str4;
mety.data.len = 3; mety.data.len = 3;
mety.id = 3; mety.id = 4;
ae.entries = &mety; ae.entries = &mety;
ae.n_entries = 1; 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