Commit 3ff2682d authored by Willem Thiart's avatar Willem Thiart
Browse files

Add notify_membership_event callback

This is an optional callback.

This is useful for the user to know when a node has been added/removed,
so that something like raft_node_set_udata can be set properly.
parent 9235fc73
...@@ -19,6 +19,11 @@ ...@@ -19,6 +19,11 @@
#define RAFT_ERR_SNAPSHOT_ALREADY_LOADED -8 #define RAFT_ERR_SNAPSHOT_ALREADY_LOADED -8
#define RAFT_ERR_LAST -100 #define RAFT_ERR_LAST -100
typedef enum {
RAFT_MEMBERSHIP_ADD,
RAFT_MEMBERSHIP_REMOVE,
} raft_membership_e;
#define RAFT_REQUESTVOTE_ERR_GRANTED 1 #define RAFT_REQUESTVOTE_ERR_GRANTED 1
#define RAFT_REQUESTVOTE_ERR_NOT_GRANTED 0 #define RAFT_REQUESTVOTE_ERR_NOT_GRANTED 0
#define RAFT_REQUESTVOTE_ERR_UNKNOWN_NODE -1 #define RAFT_REQUESTVOTE_ERR_UNKNOWN_NODE -1
...@@ -331,6 +336,25 @@ typedef int ( ...@@ -331,6 +336,25 @@ typedef int (
int entry_idx int entry_idx
); );
/** Callback for being notified of membership changes.
*
* Implementing this callback is optional.
*
* Remove notification happens before the node is about to be removed.
*
* @param[in] raft The Raft server making this callback
* @param[in] user_data User data that is passed from Raft server
* @param[in] node The node that is the subject of this log. Could be NULL.
* @param[in] type The type of membership change */
typedef void (
*func_membership_event_f
) (
raft_server_t* raft,
void *user_data,
raft_node_t *node,
raft_membership_e type
);
typedef struct typedef struct
{ {
/** Callback for sending request vote messages */ /** Callback for sending request vote messages */
...@@ -382,6 +406,8 @@ typedef struct ...@@ -382,6 +406,8 @@ typedef struct
/** Callback for detecting when a non-voting node has sufficient logs. */ /** Callback for detecting when a non-voting node has sufficient logs. */
func_node_has_sufficient_logs_f node_has_sufficient_logs; func_node_has_sufficient_logs_f node_has_sufficient_logs;
func_membership_event_f notify_membership_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;
......
...@@ -980,7 +980,12 @@ raft_node_t* raft_add_node(raft_server_t* me_, void* udata, int id, int is_self) ...@@ -980,7 +980,12 @@ raft_node_t* raft_add_node(raft_server_t* me_, void* udata, int id, int is_self)
if (is_self) if (is_self)
me->node = me->nodes[me->num_nodes - 1]; me->node = me->nodes[me->num_nodes - 1];
return me->nodes[me->num_nodes - 1]; node = me->nodes[me->num_nodes - 1];
if (me->cb.notify_membership_event)
me->cb.notify_membership_event(me_, raft_get_udata(me_), node, RAFT_MEMBERSHIP_ADD);
return node;
} }
raft_node_t* raft_add_non_voting_node(raft_server_t* me_, void* udata, int id, int is_self) raft_node_t* raft_add_non_voting_node(raft_server_t* me_, void* udata, int id, int is_self)
...@@ -1000,6 +1005,9 @@ void raft_remove_node(raft_server_t* me_, raft_node_t* node) ...@@ -1000,6 +1005,9 @@ void raft_remove_node(raft_server_t* me_, raft_node_t* node)
{ {
raft_server_private_t* me = (raft_server_private_t*)me_; raft_server_private_t* me = (raft_server_private_t*)me_;
if (me->cb.notify_membership_event)
me->cb.notify_membership_event(me_, raft_get_udata(me_), node, RAFT_MEMBERSHIP_REMOVE);
assert(node); assert(node);
int i, found = 0; int i, found = 0;
...@@ -1123,7 +1131,7 @@ void raft_offer_log(raft_server_t* me_, raft_entry_t* ety, const int idx) ...@@ -1123,7 +1131,7 @@ void raft_offer_log(raft_server_t* me_, raft_entry_t* ety, const int idx)
} }
else if (!node) else if (!node)
{ {
raft_node_t* node = raft_add_non_voting_node(me_, NULL, node_id, is_self); node = raft_add_non_voting_node(me_, NULL, node_id, is_self);
assert(node); assert(node);
} }
} }
...@@ -1312,6 +1320,8 @@ int raft_end_snapshot(raft_server_t *me_) ...@@ -1312,6 +1320,8 @@ int raft_end_snapshot(raft_server_t *me_)
} }
} }
assert(raft_get_log_count(me_) == 1);
return 0; return 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