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
6a46f305
Commit
6a46f305
authored
Aug 15, 2015
by
Willem Thiart
Browse files
Add term to msg_entry_t
parent
8405f29e
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
6a46f305
...
...
@@ -46,6 +46,9 @@ typedef struct
/* the entry's unique ID */
unsigned
int
id
;
/* the term the entry was created */
int
term
;
msg_entry_data_t
data
;
}
msg_entry_t
;
...
...
src/raft_server.c
View file @
6a46f305
...
...
@@ -313,7 +313,7 @@ int raft_recv_appendentries(
/* TODO: replace malloc with mempoll/arena */
raft_entry_t
*
c
=
(
raft_entry_t
*
)
malloc
(
sizeof
(
raft_entry_t
));
c
->
term
=
me
->
current_
term
;
c
->
term
=
cmd
->
term
;
c
->
len
=
cmd
->
data
.
len
;
c
->
id
=
cmd
->
id
;
c
->
data
=
(
unsigned
char
*
)
malloc
(
cmd
->
data
.
len
);
...
...
@@ -509,17 +509,14 @@ void raft_send_appendentries(raft_server_t* me_, int node)
msg_entry_t
mety
;
if
(
1
<
next_idx
)
if
(
0
<
next_idx
)
{
/* previous log is the log just before the new logs */
raft_entry_t
*
ety
=
raft_get_entry_from_idx
(
me_
,
next_idx
-
1
);
raft_entry_t
*
ety
=
raft_get_entry_from_idx
(
me_
,
next_idx
);
if
(
ety
)
{
ae
.
prev_log_idx
=
next_idx
-
1
;
ae
.
prev_log_term
=
ety
->
term
;
if
(
me
->
commit_idx
<
next_idx
)
{
mety
.
term
=
ety
->
term
;
mety
.
id
=
ety
->
id
;
mety
.
data
.
len
=
ety
->
len
;
mety
.
data
.
buf
=
ety
->
data
;
...
...
@@ -530,6 +527,15 @@ void raft_send_appendentries(raft_server_t* me_, int node)
}
}
/* previous log is the log just before the new logs */
if
(
1
<
next_idx
)
{
raft_entry_t
*
prev_ety
=
raft_get_entry_from_idx
(
me_
,
next_idx
-
1
);
ae
.
prev_log_idx
=
next_idx
-
1
;
if
(
prev_ety
)
ae
.
prev_log_term
=
prev_ety
->
term
;
}
__log
(
me_
,
"sending appendentries node: %d, %d %d %d %d"
,
node
,
ae
.
term
,
...
...
tests/mock_send_functions.c
View file @
6a46f305
...
...
@@ -85,6 +85,9 @@ int sender_requestvote_response(raft_server_t* raft,
int
sender_appendentries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_t
*
msg
)
{
msg_entry_t
*
entries
=
calloc
(
1
,
sizeof
(
msg_entry_t
)
*
msg
->
n_entries
);
memcpy
(
entries
,
msg
->
entries
,
sizeof
(
msg_entry_t
)
*
msg
->
n_entries
);
msg
->
entries
=
entries
;
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES
,
sizeof
(
*
msg
),
peer
,
raft
);
}
...
...
tests/test_server.c
View file @
6a46f305
...
...
@@ -654,7 +654,7 @@ void TestRaft_follower_recv_appendentries_increases_log(CuTest * tc)
/* receive an appendentry with commit */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
ae
.
term
=
3
;
ae
.
prev_log_term
=
1
;
/* first appendentries msg */
ae
.
prev_log_idx
=
0
;
...
...
@@ -664,12 +664,16 @@ void TestRaft_follower_recv_appendentries_increases_log(CuTest * tc)
ety
.
data
.
buf
=
str
;
ety
.
data
.
len
=
3
;
ety
.
id
=
1
;
/* check that old terms are passed onto the log */
ety
.
term
=
2
;
ae
.
entries
=
&
ety
;
ae
.
n_entries
=
1
;
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
raft_entry_t
*
log
=
raft_get_entry_from_idx
(
r
,
1
);
CuAssertTrue
(
tc
,
2
==
log
->
term
);
}
/* 5.3 */
...
...
@@ -830,17 +834,10 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
void
TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx
(
CuTest
*
tc
)
{
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
};
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
sender_new
(
NULL
);
void
*
r
=
raft_new
();
raft_add_peer
(
r
,
(
void
*
)
1
,
1
);
raft_add_peer
(
r
,
(
void
*
)
2
,
0
);
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
...
...
@@ -852,9 +849,13 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
/* include entries */
msg_entry_t
e
[
4
];
memset
(
&
e
,
0
,
sizeof
(
msg_entry_t
)
*
4
);
e
[
0
].
term
=
1
;
e
[
0
].
id
=
1
;
e
[
1
].
term
=
1
;
e
[
1
].
id
=
2
;
e
[
2
].
term
=
1
;
e
[
2
].
id
=
3
;
e
[
3
].
term
=
1
;
e
[
3
].
id
=
4
;
ae
.
entries
=
e
;
ae
.
n_entries
=
4
;
...
...
@@ -899,9 +900,13 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
/* include entries */
msg_entry_t
e
[
4
];
memset
(
&
e
,
0
,
sizeof
(
msg_entry_t
)
*
4
);
e
[
0
].
term
=
1
;
e
[
0
].
id
=
1
;
e
[
1
].
term
=
1
;
e
[
1
].
id
=
2
;
e
[
2
].
term
=
1
;
e
[
2
].
id
=
3
;
e
[
3
].
term
=
1
;
e
[
3
].
id
=
4
;
ae
.
entries
=
e
;
ae
.
n_entries
=
4
;
...
...
@@ -1510,36 +1515,41 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
void
*
sender
=
sender_new
(
NULL
);
void
*
r
=
raft_new
();
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
raft_add_peer
(
r
,
(
void
*
)
1
,
1
);
raft_add_peer
(
r
,
(
void
*
)
1
,
1
);
/* me */
raft_add_peer
(
r
,
(
void
*
)
2
,
0
);
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
raft_send_appendentries
(
r
,
0
);
raft_send_appendentries
(
r
,
1
);
msg_appendentries_t
*
ae
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
CuAssertTrue
(
tc
,
ae
->
prev_log_idx
==
0
);
/* add an entry */
raft_node_t
*
n
=
raft_get_node
(
r
,
1
);
/* add 1 entry */
/* receive appendentries messages */
raft_entry_t
ety
;
ety
.
term
=
1
;
ety
.
term
=
2
;
ety
.
id
=
100
;
ety
.
len
=
4
;
ety
.
data
=
(
unsigned
char
*
)
"aaa"
;
raft_append_entry
(
r
,
&
ety
);
raft_send_appendentries
(
r
,
0
);
raft_node_set_next_idx
(
n
,
1
);
raft_send_appendentries
(
r
,
1
);
ae
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
CuAssertTrue
(
tc
,
ae
->
prev_log_idx
==
0
);
CuAssertTrue
(
tc
,
ae
->
n_entries
==
1
);
CuAssertTrue
(
tc
,
ae
->
entries
[
0
].
id
==
100
);
CuAssertTrue
(
tc
,
ae
->
entries
[
0
].
term
==
2
);
/* set next_idx */
/* receive appendentries messages */
raft_node_t
*
n
=
raft_get_node
(
r
,
0
);
raft_node_set_next_idx
(
n
,
2
);
raft_send_appendentries
(
r
,
0
);
raft_send_appendentries
(
r
,
1
);
ae
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
CuAssertTrue
(
tc
,
ae
->
prev_log_idx
==
1
);
...
...
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