Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Willemt Raft
Commits
16e8d02a
Commit
16e8d02a
authored
Jun 11, 2016
by
Willem Thiart
Browse files
Bring membership changes inhouse
parent
ec4f4305
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
16e8d02a
...
...
@@ -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
;
...
...
include/raft_private.h
View file @
16e8d02a
...
...
@@ -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_ */
src/raft_log.c
View file @
16e8d02a
...
...
@@ -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
--
;
}
...
...
src/raft_server.c
View file @
16e8d02a
...
...
@@ -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_
R
EMO
V
E_NODE
==
ety
->
type
;
RAFT_LOGTYPE_
D
EMO
T
E_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
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment