Commit 16e8d02a authored by Willem Thiart's avatar Willem Thiart
Browse files

Bring membership changes inhouse

parent ec4f4305
......@@ -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;
......
......@@ -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_ */
......@@ -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;
}
......@@ -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--;
}
......
......@@ -919,7 +919,7 @@ 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)
......@@ -927,5 +927,96 @@ 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;
}
}
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