Commit 64bdc559 authored by willem's avatar willem
Browse files

More test cases passing

parent 24f6666a
...@@ -41,10 +41,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ...@@ -41,10 +41,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "raft.h" #include "raft.h"
typedef struct { typedef struct {
/* Persistent state: */ /* Persistent state: */
/* the server's best guess of what the current term is /* the server's best guess of what the current term is
* starts at zero */ * starts at zero */
int current_term; int current_term;
/* The candidate the server voted for in its current term, /* The candidate the server voted for in its current term,
...@@ -54,7 +54,7 @@ typedef struct { ...@@ -54,7 +54,7 @@ typedef struct {
/* the log which is replicated */ /* the log which is replicated */
void* log; void* log;
/* Volatile state: */ /* Volatile state: */
/* Index of highest log entry known to be committed */ /* Index of highest log entry known to be committed */
int commit_index; int commit_index;
...@@ -173,6 +173,8 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -173,6 +173,8 @@ void raft_become_candidate(raft_server_t* me_)
me->voted_for = 0; me->voted_for = 0;
me->timeout_elapased = 0; me->timeout_elapased = 0;
raft_set_state(me_,RAFT_STATE_CANDIDATE);
// for (hashmap_iterator(me->peers, &iter); // for (hashmap_iterator(me->peers, &iter);
// (p = hashmap_iterator_next_value(me->peers, &iter));) // (p = hashmap_iterator_next_value(me->peers, &iter));)
for (ii=0; ii<me->npeers; ii++) for (ii=0; ii<me->npeers; ii++)
...@@ -189,6 +191,11 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -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 * Convert to candidate if election timeout elapses without either
* Receiving valid AppendEntries RPC, or * Receiving valid AppendEntries RPC, or
...@@ -228,8 +235,38 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period) ...@@ -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). */ * 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; return 0;
} }
...@@ -392,8 +429,7 @@ int raft_get_current_index(raft_server_t* me_) ...@@ -392,8 +429,7 @@ int raft_get_current_index(raft_server_t* me_)
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 0;
} }
int raft_is_leader(raft_server_t* me_) int raft_is_leader(raft_server_t* me_)
...@@ -403,8 +439,7 @@ 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_) int raft_is_candidate(raft_server_t* me_)
{ {
return raft_get_state(me_) == RAFT_STATE_CANDIDATE;
return 0;
} }
int raft_get_my_id(raft_server_t* me_) int raft_get_my_id(raft_server_t* me_)
......
...@@ -9,6 +9,16 @@ ...@@ -9,6 +9,16 @@
#include "raft.h" #include "raft.h"
#include "mock_send_functions.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 */ /* Candidate 5.2 */
void TestRaft_follower_becoming_candidate_increments_current_term(CuTest * tc) 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 ...@@ -269,12 +279,10 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg); raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
CuAssertTrue(tc, raft_get_my_id(r) == raft_is_follower(r)); CuAssertTrue(tc, 0 == raft_is_follower(r));
raft_periodic(r,1);
raft_recv_appendentries(r,1,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
......
...@@ -9,6 +9,17 @@ ...@@ -9,6 +9,17 @@
#include "raft.h" #include "raft.h"
#include "mock_send_functions.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 */ /* 5.1 */
void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(CuTest * tc) 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 ...@@ -28,9 +39,10 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
{(-1),NULL}}; {(-1),NULL}};
sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg); raft_set_configuration(r,cfg);
sender = sender_new();
raft_set_external_functions(r,&funcs,sender);
/* term is low */ /* term is low */
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
...@@ -38,7 +50,6 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -38,7 +50,6 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */ /* higher current term */
raft_set_current_term(r,5); raft_set_current_term(r,5);
raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,1,&ae); raft_recv_appendentries(r,1,&ae);
/* response is false */ /* response is false */
...@@ -47,6 +58,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -47,6 +58,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
CuAssertTrue(tc, 0 == aer->success); 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 TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(CuTest * tc)
{ {
void *r; void *r;
...@@ -73,11 +85,10 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current ...@@ -73,11 +85,10 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* appendentry has newer term, so we change our currentterm */ /* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries(r,1,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 2 == raft_get_current_term(r)); CuAssertTrue(tc, 2 == raft_get_current_term(r));
} }
/* 5.3 */ /* 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 *r;
void *sender; void *sender;
......
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