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
7eb782f7
Commit
7eb782f7
authored
Sep 15, 2015
by
Willem Thiart
Browse files
Added membership changes
parent
09832a52
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
7eb782f7
...
@@ -240,6 +240,22 @@ typedef int (
...
@@ -240,6 +240,22 @@ typedef int (
int
entry_idx
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
typedef
struct
{
{
/** Callback for sending request vote messages */
/** 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);
...
@@ -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
* @param[in] id The integer ID of this node
* This is used for identifying clients across sessions.
* This is used for identifying clients across sessions.
* @param[in] is_self Set to 1 if this "node" is this server
* @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 */
* @return 0 on success; otherwise -1 */
raft_node_t
*
raft_add_node
(
raft_server_t
*
me
,
void
*
user_data
,
int
id
,
int
is_self
);
raft_node_t
*
raft_add_node
(
raft_server_t
*
me
,
void
*
user_data
,
int
id
,
int
is_self
);
...
...
include/raft_private.h
View file @
7eb782f7
...
@@ -56,6 +56,10 @@ typedef struct {
...
@@ -56,6 +56,10 @@ typedef struct {
/* my node ID */
/* my node ID */
raft_node_t
*
node
;
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
;
}
raft_server_private_t
;
void
raft_election_start
(
raft_server_t
*
me
);
void
raft_election_start
(
raft_server_t
*
me
);
...
...
src/raft_server.c
View file @
7eb782f7
...
@@ -258,13 +258,12 @@ int raft_recv_appendentries(
...
@@ -258,13 +258,12 @@ int raft_recv_appendentries(
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
assert
(
node
);
assert
(
node
!=
me
->
node
);
assert
(
node
!=
me
->
node
);
me
->
timeout_elapsed
=
0
;
me
->
timeout_elapsed
=
0
;
if
(
0
<
ae
->
n_entries
)
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
,
node
,
ae
->
term
,
ae
->
term
,
ae
->
leader_commit
,
ae
->
leader_commit
,
...
@@ -661,6 +660,12 @@ raft_node_t* raft_add_node(raft_server_t* me_, void* udata, int id, int is_self)
...
@@ -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
];
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_
)
int
raft_get_nvotes_for_me
(
raft_server_t
*
me_
)
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
...
...
tests/test_server.c
View file @
7eb782f7
...
@@ -2560,3 +2560,8 @@ void TestRaft_leader_recv_requestvote_responds_with_granting_if_term_is_higher(C
...
@@ -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
);
raft_recv_requestvote
(
r
,
raft_get_node
(
r
,
3
),
&
rv
,
&
rvr
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
}
void
TestRaft_membership_change_add_node_fails_if_node_is_being_added
(
CuTest
*
tc
)
{
}
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