Commit 7859e615 authored by Willem Thiart's avatar Willem Thiart
Browse files

Reset timeout on client recv entry

Change random timeout to be influenced by election_timeout

Thanks to @ar104 for help with this fix!
parent 612ff870
...@@ -115,7 +115,7 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -115,7 +115,7 @@ void raft_become_candidate(raft_server_t* me_)
raft_set_state(me_, RAFT_STATE_CANDIDATE); raft_set_state(me_, RAFT_STATE_CANDIDATE);
/* we need a random factor here to prevent simultaneous candidates */ /* we need a random factor here to prevent simultaneous candidates */
me->timeout_elapsed = rand() % 500; me->timeout_elapsed = rand() % me->election_timeout;
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
if (me->nodeid != i) if (me->nodeid != i)
...@@ -138,10 +138,7 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period) ...@@ -138,10 +138,7 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
if (me->state == RAFT_STATE_LEADER) if (me->state == RAFT_STATE_LEADER)
{ {
if (me->request_timeout <= me->timeout_elapsed) if (me->request_timeout <= me->timeout_elapsed)
{
raft_send_appendentries_all(me_); raft_send_appendentries_all(me_);
me->timeout_elapsed = 0;
}
} }
else if (me->election_timeout <= me->timeout_elapsed) else if (me->election_timeout <= me->timeout_elapsed)
{ {
...@@ -535,6 +532,7 @@ void raft_send_appendentries_all(raft_server_t* me_) ...@@ -535,6 +532,7 @@ void raft_send_appendentries_all(raft_server_t* me_)
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
int i; int i;
me->timeout_elapsed = 0;
for (i = 0; i < me->num_nodes; i++) for (i = 0; i < me->num_nodes; i++)
if (me->nodeid != i) if (me->nodeid != i)
raft_send_appendentries(me_, i); raft_send_appendentries(me_, i);
......
...@@ -1698,6 +1698,27 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t ...@@ -1698,6 +1698,27 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t
CuAssertTrue(tc, NULL == sender_poll_msg_data(sender)); CuAssertTrue(tc, NULL == sender_poll_msg_data(sender));
} }
void TestRaft_leader_recv_entry_resets_election_timeout(
CuTest * tc)
{
void *r = raft_new();
raft_set_election_timeout(r, 1000);
raft_set_state(r, RAFT_STATE_LEADER);
raft_periodic(r, 900);
/* entry message */
msg_entry_t mety;
mety.id = 1;
mety.data.buf = "entry";
mety.data.len = strlen("entry");
/* receive entry */
msg_entry_response_t cr;
raft_recv_entry(r, 1, &mety, &cr);
CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r));
}
void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest * tc) void TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed(CuTest * tc)
{ {
void *r = raft_new(); void *r = raft_new();
......
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