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
ce87cec8
Commit
ce87cec8
authored
Sep 29, 2015
by
Willem Thiart
Browse files
Fix bug where non-leader receives AE response
parent
daa93cb1
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/raft_server.c
View file @
ce87cec8
...
...
@@ -172,6 +172,9 @@ int raft_recv_appendentries_response(raft_server_t* me_,
// TODO: should force invalid leaders to stepdown
if
(
!
raft_is_leader
(
me_
))
return
-
1
;
raft_node_t
*
p
=
raft_get_node
(
me_
,
node
);
if
(
0
==
r
->
success
)
...
...
tests/test_server.c
View file @
ce87cec8
...
...
@@ -1542,6 +1542,53 @@ TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majority_ha
CuAssertTrue
(
tc
,
2
==
raft_get_last_applied_idx
(
r
));
}
void
TestRaft_leader_recv_appendentries_response_retry_only_if_leader
(
CuTest
*
tc
)
{
raft_cbs_t
funcs
=
{
.
send_appendentries
=
sender_appendentries
,
};
void
*
sender
=
sender_new
(
NULL
);
void
*
r
=
raft_new
();
raft_add_node
(
r
,
(
void
*
)
1
,
1
);
raft_add_node
(
r
,
(
void
*
)
2
,
0
);
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
/* I'm the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_current_term
(
r
,
1
);
raft_set_commit_idx
(
r
,
0
);
/* the last applied idx will became 1, and then 2 */
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
raft_entry_t
ety
;
ety
.
term
=
1
;
ety
.
id
=
1
;
ety
.
data
.
buf
=
"aaaa"
;
ety
.
data
.
len
=
4
;
raft_append_entry
(
r
,
&
ety
);
raft_send_appendentries
(
r
,
0
);
raft_send_appendentries
(
r
,
1
);
CuAssertTrue
(
tc
,
NULL
!=
sender_poll_msg_data
(
sender
));
CuAssertTrue
(
tc
,
NULL
!=
sender_poll_msg_data
(
sender
));
raft_become_follower
(
r
);
/* receive mock success responses */
msg_appendentries_response_t
aer
;
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
aer
.
term
=
1
;
aer
.
success
=
1
;
aer
.
current_idx
=
1
;
aer
.
first_idx
=
1
;
CuAssertTrue
(
tc
,
-
1
==
raft_recv_appendentries_response
(
r
,
1
,
&
aer
));
CuAssertTrue
(
tc
,
NULL
==
sender_poll_msg_data
(
sender
));
}
void
TestRaft_leader_recv_entry_is_committed_returns_0_if_not_committed
(
CuTest
*
tc
)
{
void
*
r
=
raft_new
();
...
...
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