Commit 0990cf7b authored by Yossi Gottlieb's avatar Yossi Gottlieb
Browse files

Add state change callbacks.

parent 02fda63f
......@@ -376,6 +376,22 @@ typedef void (
raft_membership_e type
);
/** Callback for being notified of state changes.
*
* Implementing this callback is optional.
*
* @param[in] raft The Raft server making this callback
* @param[in] user_data User data that is passed from Raft server
* @param[in] state The new cluster state. */
typedef void (
*func_state_event_f
) (
raft_server_t* raft,
void *user_data,
raft_state_e state
);
typedef struct
{
/** Callback for sending request vote messages */
......@@ -412,6 +428,9 @@ typedef struct
/** Callback for being notified of membership changes (optional). */
func_membership_event_f notify_membership_event;
/** Callback for being notified of state changes (optional). */
func_state_event_f notify_state_event;
/** Callback for catching debugging log messages
* This callback is optional */
func_log_f log;
......
......@@ -166,6 +166,8 @@ int raft_become_leader(raft_server_t* me_)
int i;
__log(me_, NULL, "becoming leader term:%d", raft_get_current_term(me_));
if (me->cb.notify_state_event)
me->cb.notify_state_event(me_, raft_get_udata(me_), RAFT_STATE_LEADER);
raft_index_t next_idx = raft_get_current_idx(me_) + 1;
......@@ -202,6 +204,8 @@ int raft_become_candidate(raft_server_t* me_)
int i;
__log(me_, NULL, "becoming candidate");
if (me->cb.notify_state_event)
me->cb.notify_state_event(me_, raft_get_udata(me_), RAFT_STATE_CANDIDATE);
int e = raft_set_current_term(me_, raft_get_current_term(me_) + 1);
if (0 != e)
......@@ -234,6 +238,9 @@ void raft_become_follower(raft_server_t* me_)
raft_server_private_t* me = (raft_server_private_t*)me_;
__log(me_, NULL, "becoming follower");
if (me->cb.notify_state_event)
me->cb.notify_state_event(me_, raft_get_udata(me_), RAFT_STATE_FOLLOWER);
raft_set_state(me_, RAFT_STATE_FOLLOWER);
raft_randomize_election_timeout(me_);
me->timeout_elapsed = 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