Skip to content

Commit

Permalink
Bring membership changes inhouse
Browse files Browse the repository at this point in the history
  • Loading branch information
willemt committed Jun 11, 2016
1 parent ec4f430 commit 16e8d02
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/raft.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ typedef enum {
RAFT_LOGTYPE_NORMAL,
RAFT_LOGTYPE_ADD_NONVOTING_NODE,
RAFT_LOGTYPE_ADD_NODE,
RAFT_LOGTYPE_DEMOTE_NODE,
RAFT_LOGTYPE_REMOVE_NODE,
RAFT_LOGTYPE_NUM,
} raft_logtype_e;
Expand Down
4 changes: 4 additions & 0 deletions include/raft_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,8 @@ int raft_node_has_sufficient_logs(raft_node_t* me_);

int raft_votes_is_majority(const int nnodes, const int nvotes);

void raft_pop_log(raft_server_t* me_, raft_entry_t* ety, const int idx);

void raft_offer_log(raft_server_t* me_, raft_entry_t* ety, const int idx);

#endif /* RAFT_PRIVATE_H_ */
2 changes: 2 additions & 0 deletions src/raft_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ int log_append_entry(log_t* me_, raft_entry_t* c)
{
void* ud = raft_get_udata(me->raft);
e = me->cb->log_offer(me->raft, ud, c, me->back);
raft_offer_log(me->raft, c, me->back);
if (e == RAFT_ERR_SHUTDOWN)
return e;
}
Expand Down Expand Up @@ -184,6 +185,7 @@ void log_delete(log_t* me_, int idx)
if (me->cb && me->cb->log_pop)
me->cb->log_pop(me->raft, raft_get_udata(me->raft),
&me->entries[me->back - 1], me->back);
raft_pop_log(me->raft, &me->entries[me->back - 1], me->back);
me->back--;
me->count--;
}
Expand Down
93 changes: 92 additions & 1 deletion src/raft_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -919,13 +919,104 @@ int raft_apply_all(raft_server_t* me_)
int raft_entry_is_voting_cfg_change(raft_entry_t* ety)
{
return RAFT_LOGTYPE_ADD_NODE == ety->type ||
RAFT_LOGTYPE_REMOVE_NODE == ety->type;
RAFT_LOGTYPE_DEMOTE_NODE == ety->type;
}

int raft_entry_is_cfg_change(raft_entry_t* ety)
{
return (
RAFT_LOGTYPE_ADD_NODE == ety->type ||
RAFT_LOGTYPE_ADD_NONVOTING_NODE == ety->type ||
RAFT_LOGTYPE_DEMOTE_NODE == ety->type ||
RAFT_LOGTYPE_REMOVE_NODE == ety->type);
}

void raft_offer_log(raft_server_t* me_, raft_entry_t* ety, const int idx)
{
raft_server_private_t* me = (raft_server_private_t*)me_;

if (!raft_entry_is_cfg_change(ety))
return;

int node_id = me->cb.log_get_node_id(me_, raft_get_udata(me_), ety, idx);
raft_node_t* node = raft_get_node(me_, node_id);
int is_self = node_id == raft_get_nodeid(me_);

switch (ety->type)
{
case RAFT_LOGTYPE_ADD_NONVOTING_NODE:
if (!is_self)
{
raft_node_t* node = raft_add_non_voting_node(me_, NULL, node_id, is_self);
assert(node);
}
break;

case RAFT_LOGTYPE_ADD_NODE:
node = raft_add_node(me_, NULL, node_id, is_self);
assert(node);
assert(raft_node_is_voting(node));
break;

case RAFT_LOGTYPE_DEMOTE_NODE:
raft_node_set_voting(node, 0);
break;

case RAFT_LOGTYPE_REMOVE_NODE:
if (node)
raft_remove_node(me_, node);
break;

default:
assert(0);
}
}

void raft_pop_log(raft_server_t* me_, raft_entry_t* ety, const int idx)
{
raft_server_private_t* me = (raft_server_private_t*)me_;

if (!raft_entry_is_cfg_change(ety))
return;

int node_id = me->cb.log_get_node_id(me_, raft_get_udata(me_), ety, idx);

switch (ety->type)
{
case RAFT_LOGTYPE_DEMOTE_NODE:
{
raft_node_t* node = raft_get_node(me_, node_id);
raft_node_set_voting(node, 1);
}
break;

case RAFT_LOGTYPE_REMOVE_NODE:
{
int is_self = node_id == raft_get_nodeid(me_);
raft_node_t* node = raft_add_non_voting_node(me_, NULL, node_id, is_self);
assert(node);
}
break;

case RAFT_LOGTYPE_ADD_NONVOTING_NODE:
{
int is_self = node_id == raft_get_nodeid(me_);
raft_node_t* node = raft_get_node(me_, node_id);
raft_remove_node(me_, node);
if (is_self)
assert(0);
}
break;

case RAFT_LOGTYPE_ADD_NODE:
{
raft_node_t* node = raft_get_node(me_, node_id);
raft_node_set_voting(node, 0);
}
break;

default:
assert(0);
break;
}
}

0 comments on commit 16e8d02

Please sign in to comment.