Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
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
Show whitespace changes
Inline
Side-by-side
include/raft.h
View file @
16e8d02a
...
@@ -29,6 +29,7 @@ typedef enum {
...
@@ -29,6 +29,7 @@ typedef enum {
RAFT_LOGTYPE_NORMAL
,
RAFT_LOGTYPE_NORMAL
,
RAFT_LOGTYPE_ADD_NONVOTING_NODE
,
RAFT_LOGTYPE_ADD_NONVOTING_NODE
,
RAFT_LOGTYPE_ADD_NODE
,
RAFT_LOGTYPE_ADD_NODE
,
RAFT_LOGTYPE_DEMOTE_NODE
,
RAFT_LOGTYPE_REMOVE_NODE
,
RAFT_LOGTYPE_REMOVE_NODE
,
RAFT_LOGTYPE_NUM
,
RAFT_LOGTYPE_NUM
,
}
raft_logtype_e
;
}
raft_logtype_e
;
...
...
include/raft_private.h
View file @
16e8d02a
...
@@ -123,4 +123,8 @@ int raft_node_has_sufficient_logs(raft_node_t* me_);
...
@@ -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
);
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_ */
#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)
...
@@ -107,6 +107,7 @@ int log_append_entry(log_t* me_, raft_entry_t* c)
{
{
void
*
ud
=
raft_get_udata
(
me
->
raft
);
void
*
ud
=
raft_get_udata
(
me
->
raft
);
e
=
me
->
cb
->
log_offer
(
me
->
raft
,
ud
,
c
,
me
->
back
);
e
=
me
->
cb
->
log_offer
(
me
->
raft
,
ud
,
c
,
me
->
back
);
raft_offer_log
(
me
->
raft
,
c
,
me
->
back
);
if
(
e
==
RAFT_ERR_SHUTDOWN
)
if
(
e
==
RAFT_ERR_SHUTDOWN
)
return
e
;
return
e
;
}
}
...
@@ -184,6 +185,7 @@ void log_delete(log_t* me_, int idx)
...
@@ -184,6 +185,7 @@ void log_delete(log_t* me_, int idx)
if
(
me
->
cb
&&
me
->
cb
->
log_pop
)
if
(
me
->
cb
&&
me
->
cb
->
log_pop
)
me
->
cb
->
log_pop
(
me
->
raft
,
raft_get_udata
(
me
->
raft
),
me
->
cb
->
log_pop
(
me
->
raft
,
raft_get_udata
(
me
->
raft
),
&
me
->
entries
[
me
->
back
-
1
],
me
->
back
);
&
me
->
entries
[
me
->
back
-
1
],
me
->
back
);
raft_pop_log
(
me
->
raft
,
&
me
->
entries
[
me
->
back
-
1
],
me
->
back
);
me
->
back
--
;
me
->
back
--
;
me
->
count
--
;
me
->
count
--
;
}
}
...
...
src/raft_server.c
View file @
16e8d02a
...
@@ -919,7 +919,7 @@ int raft_apply_all(raft_server_t* me_)
...
@@ -919,7 +919,7 @@ int raft_apply_all(raft_server_t* me_)
int
raft_entry_is_voting_cfg_change
(
raft_entry_t
*
ety
)
int
raft_entry_is_voting_cfg_change
(
raft_entry_t
*
ety
)
{
{
return
RAFT_LOGTYPE_ADD_NODE
==
ety
->
type
||
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
)
int
raft_entry_is_cfg_change
(
raft_entry_t
*
ety
)
...
@@ -927,5 +927,96 @@ 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
(
return
(
RAFT_LOGTYPE_ADD_NODE
==
ety
->
type
||
RAFT_LOGTYPE_ADD_NODE
==
ety
->
type
||
RAFT_LOGTYPE_ADD_NONVOTING_NODE
==
ety
->
type
||
RAFT_LOGTYPE_ADD_NONVOTING_NODE
==
ety
->
type
||
RAFT_LOGTYPE_DEMOTE_NODE
==
ety
->
type
||
RAFT_LOGTYPE_REMOVE_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