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
87896ab2
Commit
87896ab2
authored
Aug 07, 2015
by
Willem Thiart
Browse files
Make raft_get_current_leader easier to use
parent
7f268ffc
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
87896ab2
...
@@ -427,9 +427,8 @@ int raft_get_voted_for(raft_server_t* me);
...
@@ -427,9 +427,8 @@ int raft_get_voted_for(raft_server_t* me);
/**
/**
* Gets what this node thinks the node ID of the leader is.
* Gets what this node thinks the node ID of the leader is.
* If this node doesn't think there's a leader, returns 0.
* @return node of what this node thinks is the valid leader;
* @param current_leader Pointer to an integer to store the result.
* -1 if the leader is unknown */
* @return True if this node thinks there's a valid leader. */
int
raft_get_current_leader
(
raft_server_t
*
me
);
int
raft_get_current_leader
(
raft_server_t
*
me
,
int
*
current_leader
);
#endif
/* RAFT_H_ */
#endif
/* RAFT_H_ */
src/raft_server.c
View file @
87896ab2
...
@@ -586,18 +586,3 @@ void raft_vote(raft_server_t* me_, int node)
...
@@ -586,18 +586,3 @@ void raft_vote(raft_server_t* me_, int node)
me
->
voted_for
=
node
;
me
->
voted_for
=
node
;
}
}
int
raft_get_current_leader
(
raft_server_t
*
me_
,
int
*
current_leader
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
/* use -1 as marker for unknown leader, because node IDs
* must be valid array indexes (see raft_get_node) */
if
(
me
->
current_leader
<
0
)
return
0
;
else
{
if
(
current_leader
!=
NULL
)
*
current_leader
=
me
->
current_leader
;
return
1
;
}
}
src/raft_server_properties.c
View file @
87896ab2
...
@@ -140,6 +140,12 @@ raft_node_t* raft_get_node(raft_server_t *me_, int nodeid)
...
@@ -140,6 +140,12 @@ raft_node_t* raft_get_node(raft_server_t *me_, int nodeid)
return
(
raft_node_t
*
)
me
->
nodes
[
nodeid
];
return
(
raft_node_t
*
)
me
->
nodes
[
nodeid
];
}
}
int
raft_get_current_leader
(
raft_server_t
*
me_
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
return
me
->
current_leader
;
}
int
raft_is_follower
(
raft_server_t
*
me_
)
int
raft_is_follower
(
raft_server_t
*
me_
)
{
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
...
...
tests/test_server.c
View file @
87896ab2
...
@@ -523,7 +523,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
...
@@ -523,7 +523,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
sender
=
sender_new
(
NULL
);
sender
=
sender_new
(
NULL
);
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
/* no leader known at this point */
/* no leader known at this point */
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
,
NULL
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
/* term is low */
/* term is low */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
@@ -537,7 +537,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
...
@@ -537,7 +537,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
CuAssertTrue
(
tc
,
NULL
!=
aerr
);
CuAssertTrue
(
tc
,
NULL
!=
aerr
);
CuAssertTrue
(
tc
,
0
==
aerr
->
success
);
CuAssertTrue
(
tc
,
0
==
aerr
->
success
);
/* rejected appendentries doesn't change the current leader. */
/* rejected appendentries doesn't change the current leader. */
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
,
NULL
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
}
}
/* TODO: check if test case is needed */
/* TODO: check if test case is needed */
...
@@ -549,7 +549,6 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
...
@@ -549,7 +549,6 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
void
*
sender
;
void
*
sender
;
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
msg_appendentries_response_t
aer
;
int
current_leader
=
0
;
raft_cbs_t
funcs
=
{
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
...
@@ -563,7 +562,7 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
...
@@ -563,7 +562,7 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
/* older currentterm */
/* older currentterm */
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
,
NULL
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
/* newer term for appendentry */
/* newer term for appendentry */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
@@ -577,8 +576,7 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
...
@@ -577,8 +576,7 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
/* term has been updated */
/* term has been updated */
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
/* and leader has been updated */
/* and leader has been updated */
CuAssertTrue
(
tc
,
1
==
raft_get_current_leader
(
r
,
&
current_leader
));
CuAssertTrue
(
tc
,
1
==
raft_get_current_leader
(
r
));
CuAssertTrue
(
tc
,
1
==
current_leader
);
}
}
void
TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specified
(
void
TestRaft_follower_recv_appendentries_does_not_log_if_no_entries_are_specified
(
...
@@ -1208,7 +1206,6 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
...
@@ -1208,7 +1206,6 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
{
{
void
*
r
;
void
*
r
;
void
*
sender
;
void
*
sender
;
int
current_leader
=
0
;
raft_cbs_t
funcs
=
{
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
};
...
@@ -1222,7 +1219,7 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
...
@@ -1222,7 +1219,7 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
,
NULL
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
/* receive recent appendentries */
/* receive recent appendentries */
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
...
@@ -1233,8 +1230,7 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
...
@@ -1233,8 +1230,7 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
/* after accepting a leader, it's available as the last known leader */
/* after accepting a leader, it's available as the last known leader */
CuAssertTrue
(
tc
,
1
==
raft_get_current_leader
(
r
,
&
current_leader
));
CuAssertTrue
(
tc
,
1
==
raft_get_current_leader
(
r
));
CuAssertTrue
(
tc
,
1
==
current_leader
);
}
}
/* Candidate 5.2 */
/* Candidate 5.2 */
...
@@ -1264,7 +1260,7 @@ TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follow
...
@@ -1264,7 +1260,7 @@ TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follow
/* is a candidate */
/* is a candidate */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
,
NULL
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
/* invalid leader determined by "leaders" old log */
/* invalid leader determined by "leaders" old log */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
@@ -1276,7 +1272,7 @@ TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follow
...
@@ -1276,7 +1272,7 @@ TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follow
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
raft_is_candidate
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_candidate
(
r
));
/* should not have changed leader after rejecting appendentry */
/* should not have changed leader after rejecting appendentry */
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
,
NULL
));
CuAssertTrue
(
tc
,
-
1
==
raft_get_current_leader
(
r
));
}
}
void
TestRaft_leader_becomes_leader_is_leader
(
CuTest
*
tc
)
void
TestRaft_leader_becomes_leader_is_leader
(
CuTest
*
tc
)
...
@@ -1760,7 +1756,6 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
...
@@ -1760,7 +1756,6 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
{
{
void
*
r
;
void
*
r
;
void
*
sender
;
void
*
sender
;
int
current_leader
=
0
;
raft_cbs_t
funcs
=
{
raft_cbs_t
funcs
=
{
.
log
=
NULL
.
log
=
NULL
};
};
...
@@ -1779,8 +1774,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
...
@@ -1779,8 +1774,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
/* check that node 0 considers itself the leader */
/* check that node 0 considers itself the leader */
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_current_leader
(
r
,
&
current_leader
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
));
CuAssertTrue
(
tc
,
0
==
current_leader
);
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
5
;
ae
.
term
=
5
;
...
@@ -1791,8 +1785,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
...
@@ -1791,8 +1785,7 @@ void TestRaft_leader_recv_appendentries_steps_down_if_newer(
/* after more recent appendentries from node 1, node 0 should
/* after more recent appendentries from node 1, node 0 should
* consider node 1 the leader. */
* consider node 1 the leader. */
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_current_leader
(
r
,
&
current_leader
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_leader
(
r
));
CuAssertTrue
(
tc
,
0
==
current_leader
);
}
}
void
TestRaft_leader_recv_appendentries_steps_down_if_newer_term
(
void
TestRaft_leader_recv_appendentries_steps_down_if_newer_term
(
...
...
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