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

Add state change callbacks.

parent 02fda63f
...@@ -376,6 +376,22 @@ typedef void ( ...@@ -376,6 +376,22 @@ typedef void (
raft_membership_e type 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 typedef struct
{ {
/** Callback for sending request vote messages */ /** Callback for sending request vote messages */
...@@ -412,6 +428,9 @@ typedef struct ...@@ -412,6 +428,9 @@ typedef struct
/** Callback for being notified of membership changes (optional). */ /** Callback for being notified of membership changes (optional). */
func_membership_event_f notify_membership_event; 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 /** Callback for catching debugging log messages
* This callback is optional */ * This callback is optional */
func_log_f log; func_log_f log;
......
...@@ -166,6 +166,8 @@ int raft_become_leader(raft_server_t* me_) ...@@ -166,6 +166,8 @@ int raft_become_leader(raft_server_t* me_)
int i; int i;
__log(me_, NULL, "becoming leader term:%d", raft_get_current_term(me_)); __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; raft_index_t next_idx = raft_get_current_idx(me_) + 1;
...@@ -202,6 +204,8 @@ int raft_become_candidate(raft_server_t* me_) ...@@ -202,6 +204,8 @@ int raft_become_candidate(raft_server_t* me_)
int i; int i;
__log(me_, NULL, "becoming candidate"); __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); int e = raft_set_current_term(me_, raft_get_current_term(me_) + 1);
if (0 != e) if (0 != e)
...@@ -234,6 +238,9 @@ void raft_become_follower(raft_server_t* me_) ...@@ -234,6 +238,9 @@ void raft_become_follower(raft_server_t* me_)
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
__log(me_, NULL, "becoming follower"); __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_set_state(me_, RAFT_STATE_FOLLOWER);
raft_randomize_election_timeout(me_); raft_randomize_election_timeout(me_);
me->timeout_elapsed = 0; 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