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 @@
#define RAFT_ERR_SNAPSHOT_ALREADY_LOADED -8
#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_NOT_GRANTED 0
#define RAFT_REQUESTVOTE_ERR_UNKNOWN_NODE -1
......@@ -331,6 +336,25 @@ typedef int (
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
{
/** Callback for sending request vote messages */
......@@ -382,6 +406,8 @@ typedef struct
/** Callback for detecting when a non-voting 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
* This callback is optional */
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)
if (is_self)
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)
......@@ -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_;
if (me->cb.notify_membership_event)
me->cb.notify_membership_event(me_, raft_get_udata(me_), node, RAFT_MEMBERSHIP_REMOVE);
assert(node);
int i, found = 0;
......@@ -1123,7 +1131,7 @@ void raft_offer_log(raft_server_t* me_, raft_entry_t* ety, const int idx)
}
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);
}
}
......@@ -1312,6 +1320,8 @@ int raft_end_snapshot(raft_server_t *me_)
}
}
assert(raft_get_log_count(me_) == 1);
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