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
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