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

Refactor debug logging (#127)

Refactor debug logging and change log callback

e.g:
19 --> 13, sent snapshot_resp id:27712, t:24, s:1, o:4096, lc:0
14 --> 17, sent requestvote_req pv:1, t:25, ci:14, lli:6848, llt:23
14 <-- 17, recv requestvote_resp pv:1, t:25, rt:24, vg:0

Breaking changes: 

raft_log_f() callback will not pass node_id_t anymore.
Sender and receiver will be part of the log line as you can see above.
parent c0270e61
...@@ -441,15 +441,12 @@ typedef int ( ...@@ -441,15 +441,12 @@ typedef int (
/** Callback for providing debug logging information. /** Callback for providing debug logging information.
* This callback is optional * This callback is optional
* @param[in] raft The Raft server making this callback * @param[in] raft The Raft server making this callback
* @param[in] node_id The node id that is the subject of this log. If log is not
* related to a node, this could be 'RAFT_NODE_ID_NONE'.
* @param[in] user_data User data that is passed from Raft server * @param[in] user_data User data that is passed from Raft server
* @param[in] buf The buffer that was logged */ * @param[in] buf The buffer that was logged */
typedef void ( typedef void (
*raft_log_f *raft_log_f
) ( ) (
raft_server_t* raft, raft_server_t* raft,
raft_node_id_t node_id,
void *user_data, void *user_data,
const char *buf const char *buf
); );
...@@ -991,10 +988,10 @@ int raft_periodic(raft_server_t *me); ...@@ -991,10 +988,10 @@ int raft_periodic(raft_server_t *me);
* @return * @return
* 0 on success * 0 on success
* */ * */
int raft_recv_appendentries(raft_server_t* me, int raft_recv_appendentries(raft_server_t *me,
raft_node_t* node, raft_node_t *node,
raft_appendentries_req_t* req, raft_appendentries_req_t *req,
raft_appendentries_resp_t* resp); raft_appendentries_resp_t *resp);
/** Receive a response from an appendentries message we sent. /** Receive a response from an appendentries message we sent.
* @param[in] node The node who sent us this message * @param[in] node The node who sent us this message
...@@ -1003,9 +1000,9 @@ int raft_recv_appendentries(raft_server_t* me, ...@@ -1003,9 +1000,9 @@ int raft_recv_appendentries(raft_server_t* me,
* 0 on success; * 0 on success;
* -1 on error; * -1 on error;
* RAFT_ERR_NOT_LEADER server is not the leader */ * RAFT_ERR_NOT_LEADER server is not the leader */
int raft_recv_appendentries_response(raft_server_t* me, int raft_recv_appendentries_response(raft_server_t *me,
raft_node_t* node, raft_node_t *node,
raft_appendentries_resp_t* resp); raft_appendentries_resp_t *resp);
/** Receive a snapshot message. /** Receive a snapshot message.
* @param[in] node The node who sent us this message * @param[in] node The node who sent us this message
...@@ -1025,8 +1022,8 @@ int raft_recv_snapshot(raft_server_t* me, ...@@ -1025,8 +1022,8 @@ int raft_recv_snapshot(raft_server_t* me,
* 0 on success; * 0 on success;
* -1 on error; * -1 on error;
* RAFT_ERR_NOT_LEADER server is not the leader */ * RAFT_ERR_NOT_LEADER server is not the leader */
int raft_recv_snapshot_response(raft_server_t* me, int raft_recv_snapshot_response(raft_server_t *me,
raft_node_t* node, raft_node_t *node,
raft_snapshot_resp_t *resp); raft_snapshot_resp_t *resp);
/** Receive a requestvote message. /** Receive a requestvote message.
...@@ -1034,20 +1031,20 @@ int raft_recv_snapshot_response(raft_server_t* me, ...@@ -1034,20 +1031,20 @@ int raft_recv_snapshot_response(raft_server_t* me,
* @param[in] req The requestvote message * @param[in] req The requestvote message
* @param[out] resp The resulting response * @param[out] resp The resulting response
* @return 0 on success */ * @return 0 on success */
int raft_recv_requestvote(raft_server_t* me, int raft_recv_requestvote(raft_server_t *me,
raft_node_t* node, raft_node_t *node,
raft_requestvote_req_t* req, raft_requestvote_req_t *req,
raft_requestvote_resp_t* resp); raft_requestvote_resp_t *resp);
/** Receive a response from a requestvote message we sent. /** Receive a response from a requestvote message we sent.
* @param[in] node The node this response was sent by * @param[in] node The node this response was sent by
* @param[in] req The requestvote response message * @param[in] resp The requestvote response message
* @return * @return
* 0 on success; * 0 on success;
* RAFT_ERR_SHUTDOWN server MUST shutdown; */ * RAFT_ERR_SHUTDOWN server MUST shutdown; */
int raft_recv_requestvote_response(raft_server_t* me, int raft_recv_requestvote_response(raft_server_t *me,
raft_node_t* node, raft_node_t *node,
raft_requestvote_resp_t* req); raft_requestvote_resp_t *resp);
/** Receive an entry message from the client. /** Receive an entry message from the client.
* *
...@@ -1073,7 +1070,7 @@ int raft_recv_requestvote_response(raft_server_t* me, ...@@ -1073,7 +1070,7 @@ int raft_recv_requestvote_response(raft_server_t* me,
* RAFT_ERR_ONE_VOTING_CHANGE_ONLY there is a non-voting change inflight; * RAFT_ERR_ONE_VOTING_CHANGE_ONLY there is a non-voting change inflight;
* RAFT_ERR_NOMEM memory allocation failure * RAFT_ERR_NOMEM memory allocation failure
*/ */
int raft_recv_entry(raft_server_t* me, int raft_recv_entry(raft_server_t *me,
raft_entry_req_t *req, raft_entry_req_t *req,
raft_entry_resp_t *resp); raft_entry_resp_t *resp);
...@@ -1284,11 +1281,11 @@ int raft_apply_all(raft_server_t* me); ...@@ -1284,11 +1281,11 @@ int raft_apply_all(raft_server_t* me);
/** Become leader /** Become leader
* WARNING: this is a dangerous function call. It could lead to your cluster * WARNING: this is a dangerous function call. It could lead to your cluster
* losing it's consensus guarantees. */ * losing it's consensus guarantees. */
int raft_become_leader(raft_server_t* me); int raft_become_leader(raft_server_t *me);
/** Become follower. This may be used to give up leadership. It does not change /** Become follower. This may be used to give up leadership. It does not change
* currentTerm. */ * currentTerm. */
void raft_become_follower(raft_server_t* me); void raft_become_follower(raft_server_t *me);
/** Determine if entry is voting configuration change. /** Determine if entry is voting configuration change.
* @param[in] ety The entry to query. * @param[in] ety The entry to query.
......
...@@ -133,13 +133,13 @@ struct raft_server { ...@@ -133,13 +133,13 @@ struct raft_server {
int disable_apply; /* Do not apply entries, useful for testing */ int disable_apply; /* Do not apply entries, useful for testing */
}; };
int raft_election_start(raft_server_t* me, int skip_precandidate); int raft_election_start(raft_server_t *me, int skip_precandidate);
int raft_become_candidate(raft_server_t* me); int raft_become_candidate(raft_server_t *me);
int raft_become_precandidate(raft_server_t* me); int raft_become_precandidate(raft_server_t *me);
void raft_randomize_election_timeout(raft_server_t* me); void raft_randomize_election_timeout(raft_server_t *me);
void raft_update_quorum_meta(raft_server_t* me, raft_msg_id_t id); void raft_update_quorum_meta(raft_server_t* me, raft_msg_id_t id);
......
This diff is collapsed.
...@@ -4064,7 +4064,7 @@ void TestRaft_quorum_msg_id_correctness(CuTest * tc) ...@@ -4064,7 +4064,7 @@ void TestRaft_quorum_msg_id_correctness(CuTest * tc)
int timeoutnow_sent = 0; int timeoutnow_sent = 0;
int __fake_timeoutnow(raft_server_t* raft, void *udata, raft_node_t* node) int cb_timeoutnow(raft_server_t* raft, void *udata, raft_node_t* node)
{ {
timeoutnow_sent = 1; timeoutnow_sent = 1;
...@@ -4076,7 +4076,7 @@ void TestRaft_callback_timeoutnow_at_set_if_up_to_date(CuTest *tc) ...@@ -4076,7 +4076,7 @@ void TestRaft_callback_timeoutnow_at_set_if_up_to_date(CuTest *tc)
timeoutnow_sent = 0; timeoutnow_sent = 0;
raft_cbs_t funcs = { raft_cbs_t funcs = {
.send_timeoutnow = __fake_timeoutnow, .send_timeoutnow = cb_timeoutnow,
}; };
raft_server_t *r = raft_new(); raft_server_t *r = raft_new();
...@@ -4111,7 +4111,7 @@ void TestRaft_callback_timeoutnow_at_send_appendentries_response_if_up_to_date(C ...@@ -4111,7 +4111,7 @@ void TestRaft_callback_timeoutnow_at_send_appendentries_response_if_up_to_date(C
timeoutnow_sent = 0; timeoutnow_sent = 0;
raft_cbs_t funcs = { raft_cbs_t funcs = {
.send_timeoutnow = __fake_timeoutnow, .send_timeoutnow = cb_timeoutnow,
}; };
raft_server_t *r = raft_new(); raft_server_t *r = raft_new();
...@@ -4439,6 +4439,7 @@ void Test_reset_transfer_leader(CuTest *tc) ...@@ -4439,6 +4439,7 @@ void Test_reset_transfer_leader(CuTest *tc)
raft_leader_transfer_e state; raft_leader_transfer_e state;
raft_cbs_t funcs = { raft_cbs_t funcs = {
.notify_transfer_event = cb_notify_transfer_event, .notify_transfer_event = cb_notify_transfer_event,
.send_timeoutnow = cb_timeoutnow,
}; };
raft_server_t *r = raft_new(); raft_server_t *r = raft_new();
raft_set_state(r, RAFT_STATE_LEADER); raft_set_state(r, RAFT_STATE_LEADER);
...@@ -4471,6 +4472,7 @@ void Test_transfer_leader_success(CuTest *tc) ...@@ -4471,6 +4472,7 @@ void Test_transfer_leader_success(CuTest *tc)
raft_leader_transfer_e state = RAFT_LEADER_TRANSFER_TIMEOUT; raft_leader_transfer_e state = RAFT_LEADER_TRANSFER_TIMEOUT;
raft_cbs_t funcs = { raft_cbs_t funcs = {
.notify_transfer_event = cb_notify_transfer_event, .notify_transfer_event = cb_notify_transfer_event,
.send_timeoutnow = cb_timeoutnow
}; };
raft_server_t *r = raft_new(); raft_server_t *r = raft_new();
raft_set_callbacks(r, &funcs, &state); raft_set_callbacks(r, &funcs, &state);
...@@ -4496,6 +4498,7 @@ void Test_transfer_leader_unexpected(CuTest *tc) ...@@ -4496,6 +4498,7 @@ void Test_transfer_leader_unexpected(CuTest *tc)
raft_leader_transfer_e state = RAFT_LEADER_TRANSFER_TIMEOUT; raft_leader_transfer_e state = RAFT_LEADER_TRANSFER_TIMEOUT;
raft_cbs_t funcs = { raft_cbs_t funcs = {
.notify_transfer_event = cb_notify_transfer_event, .notify_transfer_event = cb_notify_transfer_event,
.send_timeoutnow = cb_timeoutnow
}; };
raft_server_t *r = raft_new(); raft_server_t *r = raft_new();
raft_set_callbacks(r, &funcs, &state); raft_set_callbacks(r, &funcs, &state);
......
...@@ -331,13 +331,12 @@ def handle_read_queue(arg, can_read): ...@@ -331,13 +331,12 @@ def handle_read_queue(arg, can_read):
logger.debug(f"ignoring read_request {val}") logger.debug(f"ignoring read_request {val}")
def raft_log(raft, node, udata, buf): def raft_log(raft, udata, buf):
server = ffi.from_handle(lib.raft_get_udata(raft)) server = ffi.from_handle(lib.raft_get_udata(raft))
# if server.id in [1] or (node and node.id in [1]): # if server.id in [1] or (node and node.id in [1]):
logger.info('{0}> {1}:{2}: {3}'.format( logger.info('{0}> {1}: {2}'.format(
server.network.iteration, server.network.iteration,
server.id, server.id,
node,
ffi.string(buf).decode('utf8'), ffi.string(buf).decode('utf8'),
)) ))
...@@ -956,7 +955,7 @@ class RaftServer(object): ...@@ -956,7 +955,7 @@ class RaftServer(object):
self.raft_get_node_id = ffi.callback("int(raft_server_t*, void*, raft_entry_t*, raft_index_t)", raft_get_node_id) self.raft_get_node_id = ffi.callback("int(raft_server_t*, void*, raft_entry_t*, raft_index_t)", raft_get_node_id)
self.raft_node_has_sufficient_logs = ffi.callback("int(raft_server_t* raft, void *user_data, raft_node_t* node)", raft_node_has_sufficient_logs) self.raft_node_has_sufficient_logs = ffi.callback("int(raft_server_t* raft, void *user_data, raft_node_t* node)", raft_node_has_sufficient_logs)
self.raft_notify_membership_event = ffi.callback("void(raft_server_t* raft, void *user_data, raft_node_t* node, raft_entry_t* ety, raft_membership_e)", raft_notify_membership_event) self.raft_notify_membership_event = ffi.callback("void(raft_server_t* raft, void *user_data, raft_node_t* node, raft_entry_t* ety, raft_membership_e)", raft_notify_membership_event)
self.raft_log = ffi.callback("void(raft_server_t*, raft_node_id_t, void*, const char* buf)", raft_log) self.raft_log = ffi.callback("void(raft_server_t*, void*, const char* buf)", raft_log)
self.handle_read_queue = ffi.callback("void(void *arg, int can_read)", handle_read_queue) self.handle_read_queue = ffi.callback("void(void *arg, int can_read)", handle_read_queue)
def recv_entry(self, ety): def recv_entry(self, ety):
......
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