Commit 87896ab2 authored by Willem Thiart's avatar Willem Thiart
Browse files

Make raft_get_current_leader easier to use

parent 7f268ffc
...@@ -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_ */
...@@ -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;
}
}
...@@ -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;
......
...@@ -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(
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment