Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
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 (
...
@@ -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
;
...
...
src/raft_server.c
View file @
0990cf7b
...
@@ -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
;
...
...
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