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
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