void TestRaft_server_periodic_elapses_election_timeout(CuTest * tc) { void *r = raft_new(); /* we don't want to set the timeout to zero */ raft_set_election_timeout(r, 1000); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); raft_periodic(r, 0); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); raft_periodic(r, 100); CuAssertTrue(tc, 100 == raft_get_timeout_elapsed(r)); }
/* If commitidx > lastApplied: increment lastApplied, apply log[lastApplied] * to state machine (§5.3) */ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx( CuTest* tc) { raft_entry_t ety; void *r = raft_new(); /* must be follower */ raft_set_state(r, RAFT_STATE_FOLLOWER); raft_set_current_term(r, 1); raft_set_commit_idx(r, 1); raft_set_last_applied_idx(r, 0); /* need at least one entry */ ety.term = 1; ety.id = 1; ety.data.buf = "aaa"; ety.data.len = 3; raft_append_entry(r, &ety); /* let time lapse */ raft_periodic(r, 1); CuAssertTrue(tc, 0 != raft_get_last_applied_idx(r)); CuAssertTrue(tc, 1 == raft_get_last_applied_idx(r)); }
void TestRaft_server_election_timeout_sets_to_zero_when_elapsed_time_greater_than_timeout( CuTest * tc) { void *r = raft_new(); raft_set_election_timeout(r, 1000); /* greater than 1000 */ raft_periodic(r, 2000); /* less than 1000 as the timeout would be randomised */ CuAssertTrue(tc, raft_get_timeout_elapsed(r) < 1000); }
/* Candidate 5.2 */ void TestRaft_follower_becoming_candidate_resets_election_timeout(CuTest * tc) { void *r = raft_new(); raft_set_election_timeout(r, 1000); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); raft_periodic(r, 900); CuAssertTrue(tc, 900 == raft_get_timeout_elapsed(r)); raft_become_candidate(r); /* time is selected randomly */ CuAssertTrue(tc, raft_get_timeout_elapsed(r) < 900); }
void TestRaft_follower_recv_appendentries_resets_election_timeout( CuTest * tc) { void *r = raft_new(); raft_set_election_timeout(r, 1000); raft_periodic(r, 900); msg_appendentries_t ae; msg_appendentries_response_t aer; memset(&ae, 0, sizeof(msg_appendentries_t)); ae.term = 1; raft_recv_appendentries(r, 1, &ae, &aer); CuAssertTrue(tc, 0 == raft_get_timeout_elapsed(r)); }
void TestRaft_follower_becomes_candidate_when_election_timeout_occurs( CuTest * tc) { void *r = raft_new(); /* 1 second election timeout */ raft_set_election_timeout(r, 1000); raft_add_node(r, (void*)1, 1); raft_add_node(r, (void*)2, 0); /* 1.001 seconds have passed */ raft_periodic(r, 1001); /* is a candidate now */ CuAssertTrue(tc, 1 == raft_is_candidate(r)); }
void RaftConsensus::callPeriodicTimer() { OSS::mutex_lock lock(_raftMutex); raft_periodic(_raft, _opt.periodic_timer_ms); }