Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
RedisLabs Raft
Commits
0990cf7b
Commit
0990cf7b
authored
Apr 16, 2020
by
Yossi Gottlieb
Browse files
Add state change callbacks.
parent
02fda63f
Changes
2
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
0990cf7b
...
...
@@ -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
;
...
...
src/raft_server.c
View file @
0990cf7b
...
...
@@ -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;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment