Commit d4792de9 authored by Willem Thiart's avatar Willem Thiart
Browse files

Fixed current index counter

parent 6a46f305
......@@ -27,6 +27,7 @@ raft_node_t* raft_node_new(void* udata)
raft_node_private_t* me;
me = (raft_node_private_t*)calloc(1, sizeof(raft_node_private_t));
me->udata = udata;
me->next_idx = 1;
return (raft_node_t*)me;
}
......
......@@ -41,7 +41,7 @@ raft_server_t* raft_new()
return NULL;
me->current_term = 0;
me->voted_for = -1;
me->current_idx = 1;
me->current_idx = 0;
me->timeout_elapsed = 0;
me->request_timeout = 200;
me->election_timeout = 1000;
......@@ -224,7 +224,13 @@ int raft_recv_appendentries(
me->timeout_elapsed = 0;
if (0 < ae->n_entries)
__log(me_, "received appendentries from: %d", node);
__log(me_, "recvd appendentries from: %d, %d %d %d %d #%d",
node,
ae->term,
ae->leader_commit,
ae->prev_log_idx,
ae->prev_log_term,
ae->n_entries);
r->term = me->current_term;
......@@ -252,7 +258,7 @@ int raft_recv_appendentries(
/* Not the first appendentries we've received */
/* NOTE: the log starts at 1 */
if (1 < ae->prev_log_idx)
if (0 < ae->prev_log_idx)
{
raft_entry_t* e = raft_get_entry_from_idx(me_, ae->prev_log_idx);
......@@ -267,7 +273,8 @@ int raft_recv_appendentries(
whose term matches prevLogTerm (§5.3) */
if (e->term != ae->prev_log_term)
{
__log(me_, "AE term doesn't match prev_idx");
__log(me_, "AE term doesn't match prev_idx (ie. %d vs %d)",
e->term, ae->prev_log_term);
r->success = 0;
return 0;
}
......@@ -275,9 +282,7 @@ 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;
e2 = raft_get_entry_from_idx(me_, ae->prev_log_idx + 1);
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);
......@@ -509,22 +514,16 @@ void raft_send_appendentries(raft_server_t* me_, int node)
msg_entry_t mety;
if (0 < next_idx)
raft_entry_t* ety = raft_get_entry_from_idx(me_, next_idx);
if (ety)
{
raft_entry_t* ety = raft_get_entry_from_idx(me_, next_idx);
if (ety)
{
if (me->commit_idx < next_idx)
{
mety.term = ety->term;
mety.id = ety->id;
mety.data.len = ety->len;
mety.data.buf = ety->data;
ae.entries = &mety;
// TODO: we want to send more than 1 at a time
ae.n_entries = 1;
}
}
mety.term = ety->term;
mety.id = ety->id;
mety.data.len = ety->len;
mety.data.buf = ety->data;
ae.entries = &mety;
// TODO: we want to send more than 1 at a time
ae.n_entries = 1;
}
/* previous log is the log just before the new logs */
......
......@@ -25,9 +25,15 @@ void TestRaft_server_voted_for_records_who_we_voted_for(CuTest * tc)
void TestRaft_server_idx_starts_at_1(CuTest * tc)
{
void *r;
void *r = raft_new();
CuAssertTrue(tc, 0 == raft_get_current_idx(r));
r = raft_new();
raft_entry_t ety;
ety.data = "aaa";
ety.len = 3;
ety.id = 1;
ety.term = 1;
raft_append_entry(r, &ety);
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
}
......@@ -114,14 +120,13 @@ void TestRaft_server_entry_append_cant_append_if_id_is_zero(CuTest* tc)
ety.term = 1;
r = raft_new();
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
CuAssertTrue(tc, 0 == raft_get_current_idx(r));
raft_append_entry(r, &ety);
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
CuAssertTrue(tc, 0 == raft_get_current_idx(r));
}
void TestRaft_server_entry_append_increases_logidx(CuTest* tc)
{
void *r;
raft_entry_t ety;
char *str = "aaa";
......@@ -130,15 +135,14 @@ void TestRaft_server_entry_append_increases_logidx(CuTest* tc)
ety.id = 1;
ety.term = 1;
r = raft_new();
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
void *r = raft_new();
CuAssertTrue(tc, 0 == raft_get_current_idx(r));
raft_append_entry(r, &ety);
CuAssertTrue(tc, 2 == raft_get_current_idx(r));
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
}
void TestRaft_server_append_entry_means_entry_gets_current_term(CuTest* tc)
{
void *r;
raft_entry_t ety;
char *str = "aaa";
......@@ -147,10 +151,10 @@ void TestRaft_server_append_entry_means_entry_gets_current_term(CuTest* tc)
ety.id = 1;
ety.term = 1;
r = raft_new();
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
void *r = raft_new();
CuAssertTrue(tc, 0 == raft_get_current_idx(r));
raft_append_entry(r, &ety);
CuAssertTrue(tc, 2 == raft_get_current_idx(r));
CuAssertTrue(tc, 1 == raft_get_current_idx(r));
}
#if 0
......@@ -478,27 +482,19 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest * tc
)
{
void *r;
void *sender;
raft_cbs_t funcs = {
.log = NULL
};
msg_requestvote_t rv;
msg_requestvote_response_t rvr;
sender = sender_new(NULL);
r = raft_new();
void *r = raft_new();
raft_add_peer(r, (void*)1, 1);
raft_add_peer(r, (void*)2, 0);
raft_set_callbacks(r, &funcs, sender);
raft_set_current_term(r, 1);
raft_vote(r, 0);
msg_requestvote_t rv;
memset(&rv, 0, sizeof(msg_requestvote_t));
rv.term = 1;
rv.candidate_id = 1;
rv.last_log_idx = 0;
rv.last_log_idx = 1;
rv.last_log_term = 1;
msg_requestvote_response_t rvr;
raft_recv_requestvote(r, 1, &rv, &rvr);
CuAssertTrue(tc, 0 == rvr.vote_granted);
}
......@@ -1814,7 +1810,7 @@ void TestRaft_leader_recv_appendentries_response_increment_idx_of_peer(
raft_set_current_term(r, 1);
raft_node_t* p = raft_get_node(r, 1);
CuAssertTrue(tc, 1 != raft_node_get_next_idx(p));
CuAssertTrue(tc, 1 == raft_node_get_next_idx(p));
/* receive mock success responses */
msg_appendentries_response_t aer;
......
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