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
5752034b
Commit
5752034b
authored
Aug 17, 2015
by
Willem Thiart
Browse files
Improved documentation
parent
8aeb24cf
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
5752034b
This diff is collapsed.
Click to expand it.
src/raft_server.c
View file @
5752034b
...
@@ -172,6 +172,8 @@ int raft_recv_appendentries_response(raft_server_t* me_,
...
@@ -172,6 +172,8 @@ int raft_recv_appendentries_response(raft_server_t* me_,
__log
(
me_
,
"received appendentries response node: %d %s cidx: %d 1stidx: %d"
,
__log
(
me_
,
"received appendentries response node: %d %s cidx: %d 1stidx: %d"
,
node
,
r
->
success
==
1
?
"success"
:
"fail"
,
r
->
current_idx
,
r
->
first_idx
);
node
,
r
->
success
==
1
?
"success"
:
"fail"
,
r
->
current_idx
,
r
->
first_idx
);
// TODO: should force invalid leaders to stepdown
raft_node_t
*
p
=
raft_get_node
(
me_
,
node
);
raft_node_t
*
p
=
raft_get_node
(
me_
,
node
);
if
(
0
==
r
->
success
)
if
(
0
==
r
->
success
)
...
@@ -318,10 +320,10 @@ int raft_recv_appendentries(
...
@@ -318,10 +320,10 @@ int raft_recv_appendentries(
/* TODO: replace malloc with mempoll/arena */
/* TODO: replace malloc with mempoll/arena */
raft_entry_t
*
c
=
(
raft_entry_t
*
)
malloc
(
sizeof
(
raft_entry_t
));
raft_entry_t
*
c
=
(
raft_entry_t
*
)
malloc
(
sizeof
(
raft_entry_t
));
c
->
term
=
cmd
->
term
;
c
->
term
=
cmd
->
term
;
c
->
len
=
cmd
->
data
.
len
;
memcpy
(
&
c
->
data
,
&
cmd
->
data
,
sizeof
(
raft_entry_data_t
));
c
->
data
.
buf
=
(
unsigned
char
*
)
malloc
(
cmd
->
data
.
len
);
memcpy
(
c
->
data
.
buf
,
cmd
->
data
.
buf
,
cmd
->
data
.
len
);
c
->
id
=
cmd
->
id
;
c
->
id
=
cmd
->
id
;
c
->
data
=
(
unsigned
char
*
)
malloc
(
cmd
->
data
.
len
);
memcpy
(
c
->
data
,
cmd
->
data
.
buf
,
cmd
->
data
.
len
);
int
e
=
raft_append_entry
(
me_
,
c
);
int
e
=
raft_append_entry
(
me_
,
c
);
if
(
-
1
==
e
)
if
(
-
1
==
e
)
{
{
...
@@ -433,9 +435,9 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e,
...
@@ -433,9 +435,9 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e,
ety
.
term
=
me
->
current_term
;
ety
.
term
=
me
->
current_term
;
ety
.
id
=
e
->
id
;
ety
.
id
=
e
->
id
;
ety
.
len
=
e
->
data
.
len
;
ety
.
data
.
len
=
e
->
data
.
len
;
ety
.
data
=
malloc
(
e
->
data
.
len
);
ety
.
data
.
buf
=
malloc
(
e
->
data
.
len
);
memcpy
(
ety
.
data
,
e
->
data
.
buf
,
e
->
data
.
len
);
memcpy
(
ety
.
data
.
buf
,
e
->
data
.
buf
,
e
->
data
.
len
);
int
res
=
raft_append_entry
(
me_
,
&
ety
);
int
res
=
raft_append_entry
(
me_
,
&
ety
);
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
if
(
me
->
nodeid
!=
i
)
if
(
me
->
nodeid
!=
i
)
...
@@ -482,13 +484,13 @@ int raft_apply_entry(raft_server_t* me_)
...
@@ -482,13 +484,13 @@ int raft_apply_entry(raft_server_t* me_)
if
(
!
e
)
if
(
!
e
)
return
-
1
;
return
-
1
;
__log
(
me_
,
"applying log: %d, size: %d"
,
me
->
last_applied_idx
,
e
->
len
);
__log
(
me_
,
"applying log: %d, size: %d"
,
me
->
last_applied_idx
,
e
->
data
.
len
);
me
->
last_applied_idx
++
;
me
->
last_applied_idx
++
;
if
(
me
->
commit_idx
<
me
->
last_applied_idx
)
if
(
me
->
commit_idx
<
me
->
last_applied_idx
)
me
->
commit_idx
=
me
->
last_applied_idx
;
me
->
commit_idx
=
me
->
last_applied_idx
;
if
(
me
->
cb
.
applylog
)
if
(
me
->
cb
.
applylog
)
me
->
cb
.
applylog
(
me_
,
me
->
udata
,
e
->
data
,
e
->
len
);
me
->
cb
.
applylog
(
me_
,
me
->
udata
,
e
->
data
.
buf
,
e
->
data
.
len
);
return
0
;
return
0
;
}
}
...
@@ -503,7 +505,6 @@ void raft_send_appendentries(raft_server_t* me_, int node)
...
@@ -503,7 +505,6 @@ void raft_send_appendentries(raft_server_t* me_, int node)
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
ae
.
term
=
me
->
current_term
;
ae
.
term
=
me
->
current_term
;
ae
.
leader_id
=
me
->
nodeid
;
ae
.
leader_commit
=
raft_get_commit_idx
(
me_
);
ae
.
leader_commit
=
raft_get_commit_idx
(
me_
);
ae
.
prev_log_idx
=
0
;
ae
.
prev_log_idx
=
0
;
ae
.
prev_log_term
=
0
;
ae
.
prev_log_term
=
0
;
...
@@ -519,8 +520,8 @@ void raft_send_appendentries(raft_server_t* me_, int node)
...
@@ -519,8 +520,8 @@ void raft_send_appendentries(raft_server_t* me_, int node)
{
{
mety
.
term
=
ety
->
term
;
mety
.
term
=
ety
->
term
;
mety
.
id
=
ety
->
id
;
mety
.
id
=
ety
->
id
;
mety
.
data
.
len
=
ety
->
len
;
mety
.
data
.
len
=
ety
->
data
.
len
;
mety
.
data
.
buf
=
ety
->
data
;
mety
.
data
.
buf
=
ety
->
data
.
buf
;
ae
.
entries
=
&
mety
;
ae
.
entries
=
&
mety
;
// TODO: we want to send more than 1 at a time
// TODO: we want to send more than 1 at a time
ae
.
n_entries
=
1
;
ae
.
n_entries
=
1
;
...
...
tests/test_server.c
View file @
5752034b
...
@@ -27,8 +27,8 @@ void TestRaft_server_idx_starts_at_1(CuTest * tc)
...
@@ -27,8 +27,8 @@ void TestRaft_server_idx_starts_at_1(CuTest * tc)
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
raft_entry_t
ety
;
raft_entry_t
ety
;
ety
.
data
=
"aaa"
;
ety
.
data
.
buf
=
"aaa"
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
term
=
1
;
ety
.
term
=
1
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
...
@@ -95,8 +95,8 @@ void TestRaft_server_entry_append_cant_append_if_id_is_zero(CuTest* tc)
...
@@ -95,8 +95,8 @@ void TestRaft_server_entry_append_cant_append_if_id_is_zero(CuTest* tc)
raft_entry_t
ety
;
raft_entry_t
ety
;
char
*
str
=
"aaa"
;
char
*
str
=
"aaa"
;
ety
.
data
=
str
;
ety
.
data
.
buf
=
str
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
0
;
ety
.
id
=
0
;
ety
.
term
=
1
;
ety
.
term
=
1
;
...
@@ -111,8 +111,8 @@ void TestRaft_server_entry_append_increases_logidx(CuTest* tc)
...
@@ -111,8 +111,8 @@ void TestRaft_server_entry_append_increases_logidx(CuTest* tc)
raft_entry_t
ety
;
raft_entry_t
ety
;
char
*
str
=
"aaa"
;
char
*
str
=
"aaa"
;
ety
.
data
=
str
;
ety
.
data
.
buf
=
str
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
term
=
1
;
ety
.
term
=
1
;
...
@@ -127,8 +127,8 @@ void TestRaft_server_append_entry_means_entry_gets_current_term(CuTest* tc)
...
@@ -127,8 +127,8 @@ void TestRaft_server_append_entry_means_entry_gets_current_term(CuTest* tc)
raft_entry_t
ety
;
raft_entry_t
ety
;
char
*
str
=
"aaa"
;
char
*
str
=
"aaa"
;
ety
.
data
=
str
;
ety
.
data
.
buf
=
str
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
term
=
1
;
ety
.
term
=
1
;
...
@@ -148,8 +148,8 @@ T_estRaft_server_append_entry_not_sucessful_if_entry_with_id_already_appended(
...
@@ -148,8 +148,8 @@ T_estRaft_server_append_entry_not_sucessful_if_entry_with_id_already_appended(
raft_entry_t ety;
raft_entry_t ety;
char *str = "aaa";
char *str = "aaa";
ety.data = str;
ety.data
.buf
= str;
ety.len = 3;
ety.
data.
len = 3;
ety.id = 1;
ety.id = 1;
ety.term = 1;
ety.term = 1;
...
@@ -178,19 +178,19 @@ void TestRaft_server_entry_is_retrieveable_using_idx(CuTest* tc)
...
@@ -178,19 +178,19 @@ void TestRaft_server_entry_is_retrieveable_using_idx(CuTest* tc)
e1
.
term
=
1
;
e1
.
term
=
1
;
e1
.
id
=
1
;
e1
.
id
=
1
;
e1
.
data
=
str
;
e1
.
data
.
buf
=
str
;
e1
.
len
=
3
;
e1
.
data
.
len
=
3
;
raft_append_entry
(
r
,
&
e1
);
raft_append_entry
(
r
,
&
e1
);
/* different ID so we can be successful */
/* different ID so we can be successful */
e2
.
term
=
1
;
e2
.
term
=
1
;
e2
.
id
=
2
;
e2
.
id
=
2
;
e2
.
data
=
str2
;
e2
.
data
.
buf
=
str2
;
e2
.
len
=
3
;
e2
.
data
.
len
=
3
;
raft_append_entry
(
r
,
&
e2
);
raft_append_entry
(
r
,
&
e2
);
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str2
,
3
));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
.
buf
,
str2
,
3
));
}
}
void
TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply
(
CuTest
*
tc
)
void
TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply
(
CuTest
*
tc
)
...
@@ -208,8 +208,8 @@ void TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply(CuTest* tc)
...
@@ -208,8 +208,8 @@ void TestRaft_server_wont_apply_entry_if_we_dont_have_entry_to_apply(CuTest* tc)
ety
.
term
=
1
;
ety
.
term
=
1
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
data
=
str
;
ety
.
data
.
buf
=
str
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
raft_apply_entry
(
r
);
raft_apply_entry
(
r
);
CuAssertTrue
(
tc
,
1
==
raft_get_last_applied_idx
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_last_applied_idx
(
r
));
...
@@ -234,8 +234,8 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(
...
@@ -234,8 +234,8 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(
/* need at least one entry */
/* need at least one entry */
ety
.
term
=
1
;
ety
.
term
=
1
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
data
=
"aaa"
;
ety
.
data
.
buf
=
"aaa"
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
/* let time lapse */
/* let time lapse */
...
@@ -256,8 +256,8 @@ void TestRaft_server_apply_entry_increments_last_applied_idx(CuTest* tc)
...
@@ -256,8 +256,8 @@ void TestRaft_server_apply_entry_increments_last_applied_idx(CuTest* tc)
raft_set_last_applied_idx
(
r
,
0
);
raft_set_last_applied_idx
(
r
,
0
);
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
data
=
str
;
ety
.
data
.
buf
=
str
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
raft_apply_entry
(
r
);
raft_apply_entry
(
r
);
CuAssertTrue
(
tc
,
1
==
raft_get_last_applied_idx
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_last_applied_idx
(
r
));
...
@@ -668,8 +668,8 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
...
@@ -668,8 +668,8 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
/* increase log size */
/* increase log size */
char
*
str1
=
"111"
;
char
*
str1
=
"111"
;
ety
.
data
=
str1
;
ety
.
data
.
buf
=
str1
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
term
=
1
;
ety
.
term
=
1
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
...
@@ -677,14 +677,14 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
...
@@ -677,14 +677,14 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
/* this log will be overwritten by the appendentries below */
/* this log will be overwritten by the appendentries below */
char
*
str2
=
"222"
;
char
*
str2
=
"222"
;
ety
.
data
=
str2
;
ety
.
data
.
buf
=
str2
;
ety
.
len
=
3
;
ety
.
data
.
len
=
3
;
ety
.
id
=
2
;
ety
.
id
=
2
;
ety
.
term
=
1
;
ety
.
term
=
1
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str2
,
3
));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
.
buf
,
str2
,
3
));
/* pass a appendentry that is newer */
/* pass a appendentry that is newer */
msg_entry_t
mety
;
msg_entry_t
mety
;
...
@@ -706,7 +706,7 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
...
@@ -706,7 +706,7 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
1
)));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
1
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str1
,
3
));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
.
buf
,
str1
,
3
));
}
}
void
TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log
(
void
TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log
(
...
@@ -1330,8 +1330,8 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
...
@@ -1330,8 +1330,8 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
raft_entry_t
ety
;
raft_entry_t
ety
;
ety
.
term
=
2
;
ety
.
term
=
2
;
ety
.
id
=
100
;
ety
.
id
=
100
;
ety
.
len
=
4
;
ety
.
data
.
len
=
4
;
ety
.
data
=
(
unsigned
char
*
)
"aaa"
;
ety
.
data
.
buf
=
(
unsigned
char
*
)
"aaa"
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
raft_node_set_next_idx
(
n
,
1
);
raft_node_set_next_idx
(
n
,
1
);
raft_send_appendentries
(
r
,
1
);
raft_send_appendentries
(
r
,
1
);
...
@@ -1379,8 +1379,8 @@ void TestRaft_leader_sends_appendentries_when_peer_has_next_idx_of_0(
...
@@ -1379,8 +1379,8 @@ void TestRaft_leader_sends_appendentries_when_peer_has_next_idx_of_0(
raft_entry_t
ety
;
raft_entry_t
ety
;
ety
.
term
=
1
;
ety
.
term
=
1
;
ety
.
id
=
100
;
ety
.
id
=
100
;
ety
.
len
=
4
;
ety
.
data
.
len
=
4
;
ety
.
data
=
(
unsigned
char
*
)
"aaa"
;
ety
.
data
.
buf
=
(
unsigned
char
*
)
"aaa"
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
raft_send_appendentries
(
r
,
0
);
raft_send_appendentries
(
r
,
0
);
ae
=
sender_poll_msg_data
(
sender
);
ae
=
sender_poll_msg_data
(
sender
);
...
@@ -1452,7 +1452,7 @@ void T_estRaft_leader_doesnt_append_entry_if_unique_id_is_duplicate(CuTest * tc)
...
@@ -1452,7 +1452,7 @@ void T_estRaft_leader_doesnt_append_entry_if_unique_id_is_duplicate(CuTest * tc)
msg_entry_t ety;
msg_entry_t ety;
ety.id = 1;
ety.id = 1;
ety.data = "entry";
ety.data = "entry";
ety.len = strlen("entry");
ety.
data.
len = strlen("entry");
r = raft_new();
r = raft_new();
raft_set_configuration(r, cfg, 0);
raft_set_configuration(r, cfg, 0);
...
@@ -1495,8 +1495,8 @@ TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majority_ha
...
@@ -1495,8 +1495,8 @@ TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majority_ha
raft_entry_t
ety
;
raft_entry_t
ety
;
ety
.
term
=
1
;
ety
.
term
=
1
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
data
=
"aaaa"
;
ety
.
data
.
buf
=
"aaaa"
;
ety
.
len
=
4
;
ety
.
data
.
len
=
4
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
ety
.
id
=
2
;
ety
.
id
=
2
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
...
@@ -1561,8 +1561,8 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti
...
@@ -1561,8 +1561,8 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti
raft_entry_t
ety
;
raft_entry_t
ety
;
ety
.
term
=
1
;
ety
.
term
=
1
;
ety
.
id
=
1
;
ety
.
id
=
1
;
ety
.
data
=
"aaaa"
;
ety
.
data
.
buf
=
"aaaa"
;
ety
.
len
=
4
;
ety
.
data
.
len
=
4
;
raft_append_entry
(
r
,
&
ety
);
raft_append_entry
(
r
,
&
ety
);
/* send appendentries -
/* send appendentries -
...
...
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