Commit 7eb782f7 authored by Willem Thiart's avatar Willem Thiart
Browse files

Added membership changes

parent 09832a52
......@@ -240,6 +240,22 @@ typedef int (
int entry_idx
);
/** Callback for sending log entry messages.
* 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] node The node's ID that we are sending this message to
* @param[in] msg The entry message to be sent
* @return 0 on success */
typedef int (
*func_send_entry_f
) (
raft_server_t* raft,
void *user_data,
int node,
msg_entry_t* msg
);
typedef struct
{
/** Callback for sending request vote messages */
......@@ -324,6 +340,11 @@ void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* user_data);
* @param[in] id The integer ID of this node
* This is used for identifying clients across sessions.
* @param[in] is_self Set to 1 if this "node" is this server
* @param[out] r If the cluster has started, an entry will be sent to the
* leader so that we can have the membership change committed. We can check
* this entry response with raft_msg_entry_response_committed to confirm if
* it has been committed. If the cluster has not started it is safe to pass
* NULL.
* @return 0 on success; otherwise -1 */
raft_node_t* raft_add_node(raft_server_t* me, void* user_data, int id, int is_self);
......
......@@ -56,6 +56,10 @@ typedef struct {
/* my node ID */
raft_node_t* node;
/* Is 1 if we are in catch up mode
* This is when we are about to join a Raft node */
int catchup_mode;
} raft_server_private_t;
void raft_election_start(raft_server_t* me);
......
......@@ -258,13 +258,12 @@ int raft_recv_appendentries(
{
raft_server_private_t* me = (raft_server_private_t*)me_;
assert(node);
assert(node != me->node);
me->timeout_elapsed = 0;
if (0 < ae->n_entries)
__log(me_, "recvd appendentries from: %d, %d %d %d %d #%d",
__log(me_, "recvd appendentries from: %lx, %d %d %d %d #%d",
node,
ae->term,
ae->leader_commit,
......@@ -661,6 +660,12 @@ raft_node_t* raft_add_node(raft_server_t* me_, void* udata, int id, int is_self)
return me->nodes[me->num_nodes - 1];
}
int raft_has_started(raft_server_t* me_)
{
raft_server_private_t* me = (raft_server_private_t*)me_;
return me->current_term != 0 && me->timeout_elapsed != 0 && me->election_timeout != 0;
}
int raft_get_nvotes_for_me(raft_server_t* me_)
{
raft_server_private_t* me = (raft_server_private_t*)me_;
......
......@@ -2560,3 +2560,8 @@ void TestRaft_leader_recv_requestvote_responds_with_granting_if_term_is_higher(C
raft_recv_requestvote(r, raft_get_node(r, 3), &rv, &rvr);
CuAssertTrue(tc, 1 == raft_is_follower(r));
}
void TestRaft_membership_change_add_node_fails_if_node_is_being_added(CuTest * tc)
{
}
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