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