Unverified Commit 391120db authored by Ozan Tezcan's avatar Ozan Tezcan Committed by GitHub
Browse files

Refactor (#99)

Refactor
parent fc503058
...@@ -195,7 +195,7 @@ int raft_node_is_voting_committed(raft_node_t* me) ...@@ -195,7 +195,7 @@ int raft_node_is_voting_committed(raft_node_t* me)
raft_node_id_t raft_node_get_id(raft_node_t* me) raft_node_id_t raft_node_get_id(raft_node_t* me)
{ {
return me != NULL ? me->id : -1; return me != NULL ? me->id : RAFT_NODE_ID_NONE;
} }
void raft_node_set_addition_committed(raft_node_t* me, int committed) void raft_node_set_addition_committed(raft_node_t* me, int committed)
......
...@@ -106,16 +106,16 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg) ...@@ -106,16 +106,16 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
return NULL; return NULL;
me->current_term = 0; me->current_term = 0;
me->voted_for = -1; me->voted_for = RAFT_NODE_ID_NONE;
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
me->request_timeout = 200; me->request_timeout = 200;
me->election_timeout = 1000; me->election_timeout = 1000;
me->node_transferring_leader_to = RAFT_NODE_ID_NONE; me->node_transferring_leader_to = RAFT_NODE_ID_NONE;
me->auto_flush = 1; me->auto_flush = 1;
raft_update_quorum_meta((raft_server_t*)me, me->msg_id); raft_update_quorum_meta(me, me->msg_id);
raft_randomize_election_timeout((raft_server_t*)me); raft_randomize_election_timeout(me);
me->log_impl = log_impl; me->log_impl = log_impl;
me->log = me->log_impl->init(me, log_arg); me->log = me->log_impl->init(me, log_arg);
if (!me->log) { if (!me->log) {
...@@ -124,13 +124,13 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg) ...@@ -124,13 +124,13 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
} }
me->voting_cfg_change_log_idx = -1; me->voting_cfg_change_log_idx = -1;
raft_set_state((raft_server_t*)me, RAFT_STATE_FOLLOWER); raft_set_state(me, RAFT_STATE_FOLLOWER);
me->leader_id = RAFT_NODE_ID_NONE; me->leader_id = RAFT_NODE_ID_NONE;
me->snapshot_in_progress = 0; me->snapshot_in_progress = 0;
raft_set_snapshot_metadata((raft_server_t*)me, 0, 0); raft_set_snapshot_metadata(me, 0, 0);
return (raft_server_t*)me; return me;
} }
raft_server_t* raft_new(void) raft_server_t* raft_new(void)
...@@ -140,7 +140,7 @@ raft_server_t* raft_new(void) ...@@ -140,7 +140,7 @@ raft_server_t* raft_new(void)
void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* udata) void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* udata)
{ {
memcpy(&me->cb, funcs, sizeof(raft_cbs_t)); me->cb = *funcs;
me->udata = udata; me->udata = udata;
} }
...@@ -153,11 +153,11 @@ void raft_destroy(raft_server_t* me) ...@@ -153,11 +153,11 @@ void raft_destroy(raft_server_t* me)
void raft_clear(raft_server_t* me) void raft_clear(raft_server_t* me)
{ {
me->current_term = 0; me->current_term = 0;
me->voted_for = -1; me->voted_for = RAFT_NODE_ID_NONE;
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
raft_randomize_election_timeout(me); raft_randomize_election_timeout(me);
me->voting_cfg_change_log_idx = -1; me->voting_cfg_change_log_idx = -1;
raft_set_state((raft_server_t*)me, RAFT_STATE_FOLLOWER); raft_set_state(me, RAFT_STATE_FOLLOWER);
me->leader_id = RAFT_NODE_ID_NONE; me->leader_id = RAFT_NODE_ID_NONE;
me->commit_idx = 0; me->commit_idx = 0;
me->last_applied_idx = 0; me->last_applied_idx = 0;
...@@ -618,12 +618,9 @@ int raft_periodic(raft_server_t* me, int msec_since_last_period) ...@@ -618,12 +618,9 @@ int raft_periodic(raft_server_t* me, int msec_since_last_period)
return e; return e;
} }
if (me->last_applied_idx < raft_get_commit_idx(me) && int e = raft_apply_all(me);
raft_is_apply_allowed(me)) if (e != 0) {
{ return e;
int e = raft_apply_all(me);
if (0 != e)
return e;
} }
raft_process_read_queue(me); raft_process_read_queue(me);
...@@ -957,9 +954,12 @@ int raft_recv_requestvote(raft_server_t* me, ...@@ -957,9 +954,12 @@ int raft_recv_requestvote(raft_server_t* me,
goto done; goto done;
} }
if (me->current_term == vr->term && if (me->current_term == vr->term) {
(me->voted_for != -1 && me->voted_for != vr->candidate_id)) { /* If already voted for some other node for this term, return failure */
goto done; if (me->voted_for != RAFT_NODE_ID_NONE &&
me->voted_for != vr->candidate_id) {
goto done;
}
} }
/* Below we check if log is more up-to-date... */ /* Below we check if log is more up-to-date... */
...@@ -1189,11 +1189,7 @@ int raft_apply_entry(raft_server_t* me) ...@@ -1189,11 +1189,7 @@ int raft_apply_entry(raft_server_t* me)
} }
} }
/* voting cfg change is now complete. if (log_idx == me->voting_cfg_change_log_idx)
* TODO: there seem to be a possible off-by-one bug hidden here, requiring
* checking log_idx >= voting_cfg_change_log_idx rather than plain ==.
*/
if (log_idx >= me->voting_cfg_change_log_idx)
me->voting_cfg_change_log_idx = -1; me->voting_cfg_change_log_idx = -1;
if (!raft_entry_is_cfg_change(ety)) if (!raft_entry_is_cfg_change(ety))
...@@ -1550,7 +1546,7 @@ int raft_get_nvotes_for_me(raft_server_t* me) ...@@ -1550,7 +1546,7 @@ int raft_get_nvotes_for_me(raft_server_t* me)
int raft_vote(raft_server_t* me, raft_node_t* node) int raft_vote(raft_server_t* me, raft_node_t* node)
{ {
return raft_vote_for_nodeid(me, node ? raft_node_get_id(node) : -1); return raft_vote_for_nodeid(me, raft_node_get_id(node));
} }
int raft_vote_for_nodeid(raft_server_t* me, const raft_node_id_t nodeid) int raft_vote_for_nodeid(raft_server_t* me, const raft_node_id_t nodeid)
...@@ -1584,7 +1580,7 @@ int raft_apply_all(raft_server_t* me) ...@@ -1584,7 +1580,7 @@ int raft_apply_all(raft_server_t* me)
if (!raft_is_apply_allowed(me)) if (!raft_is_apply_allowed(me))
return 0; return 0;
while (raft_get_last_applied_idx(me) < raft_get_commit_idx(me)) while (me->commit_idx > me->last_applied_idx)
{ {
int e = raft_apply_entry(me); int e = raft_apply_entry(me);
if (0 != e) if (0 != e)
...@@ -1754,7 +1750,7 @@ int raft_begin_load_snapshot( ...@@ -1754,7 +1750,7 @@ int raft_begin_load_snapshot(
me->current_term = last_included_term; me->current_term = last_included_term;
} }
raft_set_state((raft_server_t*)me, RAFT_STATE_FOLLOWER); raft_set_state(me, RAFT_STATE_FOLLOWER);
me->leader_id = RAFT_NODE_ID_NONE; me->leader_id = RAFT_NODE_ID_NONE;
me->log_impl->reset(me->log, last_included_index + 1, last_included_term); me->log_impl->reset(me->log, last_included_index + 1, last_included_term);
...@@ -2132,11 +2128,9 @@ int raft_flush(raft_server_t* me, raft_index_t sync_index) ...@@ -2132,11 +2128,9 @@ int raft_flush(raft_server_t* me, raft_index_t sync_index)
raft_send_appendentries(me, me->nodes[i]); raft_send_appendentries(me, me->nodes[i]);
} }
if (me->last_applied_idx < raft_get_commit_idx(me)) { e = raft_apply_all(me);
e = raft_apply_all(me); if (e != 0) {
if (e != 0) { return e;
return e;
}
} }
out: out:
......
...@@ -33,8 +33,6 @@ void raft_set_log_enabled(raft_server_t* me, int enable) ...@@ -33,8 +33,6 @@ void raft_set_log_enabled(raft_server_t* me, int enable)
raft_node_id_t raft_get_nodeid(raft_server_t* me) raft_node_id_t raft_get_nodeid(raft_server_t* me)
{ {
if (!me->node)
return -1;
return raft_node_get_id(me->node); return raft_node_get_id(me->node);
} }
...@@ -81,15 +79,14 @@ int raft_set_current_term(raft_server_t* me, const raft_term_t term) ...@@ -81,15 +79,14 @@ int raft_set_current_term(raft_server_t* me, const raft_term_t term)
{ {
if (me->current_term < term) if (me->current_term < term)
{ {
int voted_for = -1;
if (me->cb.persist_term) if (me->cb.persist_term)
{ {
int e = me->cb.persist_term(me, me->udata, term, voted_for); int e = me->cb.persist_term(me, me->udata, term, RAFT_NODE_ID_NONE);
if (0 != e) if (0 != e)
return e; return e;
} }
me->current_term = term; me->current_term = term;
me->voted_for = voted_for; me->voted_for = RAFT_NODE_ID_NONE;
} }
return 0; return 0;
} }
......
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