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
64bdc559
Commit
64bdc559
authored
Oct 23, 2013
by
willem
Browse files
More test cases passing
parent
24f6666a
Changes
3
Hide whitespace changes
Inline
Side-by-side
raft_server.c
View file @
64bdc559
...
...
@@ -41,10 +41,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "raft.h"
typedef
struct
{
/*
Persistent state: */
/* Persistent state: */
/*
the server's best guess of what the current term is
*
starts at zero */
/* the server's best guess of what the current term is
* starts at zero */
int
current_term
;
/* The candidate the server voted for in its current term,
...
...
@@ -54,7 +54,7 @@ typedef struct {
/* the log which is replicated */
void
*
log
;
/*
Volatile state: */
/* Volatile state: */
/* Index of highest log entry known to be committed */
int
commit_index
;
...
...
@@ -173,6 +173,8 @@ void raft_become_candidate(raft_server_t* me_)
me
->
voted_for
=
0
;
me
->
timeout_elapased
=
0
;
raft_set_state
(
me_
,
RAFT_STATE_CANDIDATE
);
// for (hashmap_iterator(me->peers, &iter);
// (p = hashmap_iterator_next_value(me->peers, &iter));)
for
(
ii
=
0
;
ii
<
me
->
npeers
;
ii
++
)
...
...
@@ -189,6 +191,11 @@ void raft_become_candidate(raft_server_t* me_)
}
void
raft_become_follower
(
raft_server_t
*
me_
)
{
raft_set_state
(
me_
,
RAFT_STATE_FOLLOWER
);
}
/**
* Convert to candidate if election timeout elapses without either
* Receiving valid AppendEntries RPC, or
...
...
@@ -228,8 +235,38 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
/**
* Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */
int
raft_recv_appendentries
(
raft_server_t
*
me_
,
int
peer
,
msg_appendentries_t
*
ae
)
int
raft_recv_appendentries
(
raft_server_t
*
me_
,
const
int
peer
,
msg_appendentries_t
*
ae
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
msg_appendentries_response_t
r
;
r
.
term
=
raft_get_current_term
(
me_
);
if
(
ae
->
term
<
raft_get_current_term
(
me_
)
||
ae
->
prev_log_index
<
raft_get_current_index
(
me_
))
{
r
.
success
=
0
;
}
else
{
if
(
raft_is_candidate
(
me_
))
{
raft_become_follower
(
me_
);
}
if
(
raft_get_current_term
(
me_
)
<
ae
->
term
)
{
raft_set_current_term
(
me_
,
ae
->
term
);
}
r
.
success
=
1
;
}
if
(
me
->
ext_func
&&
me
->
ext_func
->
send
)
me
->
ext_func
->
send
(
me
->
caller
,
NULL
,
peer
,
(
void
*
)
&
r
,
sizeof
(
msg_appendentries_response_t
));
return
0
;
}
...
...
@@ -392,8 +429,7 @@ int raft_get_current_index(raft_server_t* me_)
int
raft_is_follower
(
raft_server_t
*
me_
)
{
return
0
;
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
}
int
raft_is_leader
(
raft_server_t
*
me_
)
...
...
@@ -403,8 +439,7 @@ int raft_is_leader(raft_server_t* me_)
int
raft_is_candidate
(
raft_server_t
*
me_
)
{
return
0
;
return
raft_get_state
(
me_
)
==
RAFT_STATE_CANDIDATE
;
}
int
raft_get_my_id
(
raft_server_t
*
me_
)
...
...
test_candidate.c
View file @
64bdc559
...
...
@@ -9,6 +9,16 @@
#include "raft.h"
#include "mock_send_functions.h"
void
TestRaft_candidate_becomes_candidate_is_candidate
(
CuTest
*
tc
)
{
void
*
r
;
r
=
raft_new
();
raft_become_candidate
(
r
);
CuAssertTrue
(
tc
,
raft_is_candidate
(
r
));
}
/* Candidate 5.2 */
void
TestRaft_follower_becoming_candidate_increments_current_term
(
CuTest
*
tc
)
{
...
...
@@ -269,12 +279,10 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
raft_get_my_id
(
r
)
==
raft_is_follower
(
r
));
raft_periodic
(
r
,
1
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
...
...
test_follower.c
View file @
64bdc559
...
...
@@ -9,6 +9,17 @@
#include "raft.h"
#include "mock_send_functions.h"
void
TestRaft_follower_becomes_follower_is_follower
(
CuTest
*
tc
)
{
void
*
r
;
r
=
raft_new
();
raft_become_follower
(
r
);
CuAssertTrue
(
tc
,
raft_is_follower
(
r
));
}
/* 5.1 */
void
TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm
(
CuTest
*
tc
)
{
...
...
@@ -28,9 +39,10 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
{(
-
1
),
NULL
}};
sender
=
sender_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
sender
=
sender_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* term is low */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
...
@@ -38,7 +50,6 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */
raft_set_current_term
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
/* response is false */
...
...
@@ -47,6 +58,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
CuAssertTrue
(
tc
,
0
==
aer
->
success
);
}
/* TODO: check if test case is needed */
void
TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm
(
CuTest
*
tc
)
{
void
*
r
;
...
...
@@ -73,11 +85,10 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
}
/* 5.3 */
void
TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index
_which_matches_prev_log_term
(
CuTest
*
tc
)
{
void
*
r
;
void
*
sender
;
...
...
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