Commit ea759b8f authored by willem's avatar willem
Browse files

Split out raft_server properties

parent 15594a8d
...@@ -24,7 +24,7 @@ $(TEST_DIR)/main_test.c: ...@@ -24,7 +24,7 @@ $(TEST_DIR)/main_test.c:
fi fi
cd $(TEST_DIR) && sh make-tests.sh "test_*.c" > main_test.c && cd .. cd $(TEST_DIR) && sh make-tests.sh "test_*.c" > main_test.c && cd ..
tests_main: raft_server.c raft_log.c raft_node.c $(TEST_DIR)/main_test.c $(TEST_DIR)/test_server.c $(TEST_DIR)/test_node.c $(TEST_DIR)/test_log.c $(TEST_DIR)/test_scenario.c $(TEST_DIR)/mock_send_functions.c $(TEST_DIR)/CuTest.c $(LLQUEUE_DIR)/linked_list_queue.c tests_main: raft_server.c raft_server_properties.c raft_log.c raft_node.c $(TEST_DIR)/main_test.c $(TEST_DIR)/test_server.c $(TEST_DIR)/test_node.c $(TEST_DIR)/test_log.c $(TEST_DIR)/test_scenario.c $(TEST_DIR)/mock_send_functions.c $(TEST_DIR)/CuTest.c $(LLQUEUE_DIR)/linked_list_queue.c
$(CC) $(CCFLAGS) -o $@ $^ $(CC) $(CCFLAGS) -o $@ $^
./tests_main ./tests_main
......
...@@ -15,6 +15,53 @@ enum { ...@@ -15,6 +15,53 @@ enum {
RAFT_STATE_LEADER RAFT_STATE_LEADER
}; };
typedef struct {
/* Persistent state: */
/* 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,
* or Nil if it hasn't voted for any. */
int voted_for;
/* the log which is replicated */
log_t* log;
/* Volatile state: */
/* idx of highest log entry known to be committed */
int commit_idx;
/* idx of highest log entry applied to state machine */
int last_applied_idx;
/* follower/leader/candidate indicator */
int state;
/* most recently append idx, also indicates size of log */
int current_idx;
/* amount of time left till timeout */
int timeout_elapsed;
/* who has voted for me. This is an array with N = 'num_nodes' elements */
int *votes_for_me;
raft_node_t* nodes;
int num_nodes;
int election_timeout;
int request_timeout;
/* callbacks */
raft_cbs_t cb;
void* cb_ctx;
/* my node ID */
int nodeid;
} raft_server_private_t;
void raft_election_start(raft_server_t* me); void raft_election_start(raft_server_t* me);
......
...@@ -19,57 +19,8 @@ ...@@ -19,57 +19,8 @@
#include <stdarg.h> #include <stdarg.h>
#include "raft.h" #include "raft.h"
#include "raft_private.h"
#include "raft_log.h" #include "raft_log.h"
#include "raft_private.h"
typedef struct {
/* Persistent state: */
/* 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,
* or Nil if it hasn't voted for any. */
int voted_for;
/* the log which is replicated */
log_t* log;
/* Volatile state: */
/* idx of highest log entry known to be committed */
int commit_idx;
/* idx of highest log entry applied to state machine */
int last_applied_idx;
/* follower/leader/candidate indicator */
int state;
/* most recently append idx, also indicates size of log */
int current_idx;
/* amount of time left till timeout */
int timeout_elapsed;
/* who has voted for me. This is an array with N = 'num_nodes' elements */
int *votes_for_me;
raft_node_t* nodes;
int num_nodes;
int election_timeout;
int request_timeout;
/* callbacks */
raft_cbs_t cb;
void* cb_ctx;
/* my node ID */
int nodeid;
} raft_server_private_t;
static void __log(raft_server_t *me_, void *src, const char *fmt, ...) static void __log(raft_server_t *me_, void *src, const char *fmt, ...)
{ {
...@@ -79,8 +30,10 @@ static void __log(raft_server_t *me_, void *src, const char *fmt, ...) ...@@ -79,8 +30,10 @@ static void __log(raft_server_t *me_, void *src, const char *fmt, ...)
va_start(args, fmt); va_start(args, fmt);
vsprintf(buf, fmt, args); vsprintf(buf, fmt, args);
//printf("%d: %s\n", me->nodeid, buf); #if 0 /* debugging */
//__FUNC_log(bto,src,buf); printf("%d: %s\n", me->nodeid, buf);
__FUNC_log(bto,src,buf);
#endif
} }
raft_server_t* raft_new() raft_server_t* raft_new()
...@@ -113,6 +66,7 @@ void raft_set_callbacks(raft_server_t* me_, ...@@ -113,6 +66,7 @@ void raft_set_callbacks(raft_server_t* me_,
void raft_free(raft_server_t* me_) void raft_free(raft_server_t* me_)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
log_free(me->log); log_free(me->log);
free(me_); free(me_);
} }
...@@ -133,6 +87,7 @@ void raft_become_leader(raft_server_t* me_) ...@@ -133,6 +87,7 @@ void raft_become_leader(raft_server_t* me_)
int i; int i;
__log(me_, NULL, "becoming leader"); __log(me_, NULL, "becoming leader");
raft_set_state(me_,RAFT_STATE_LEADER); raft_set_state(me_,RAFT_STATE_LEADER);
me->voted_for = -1; me->voted_for = -1;
for (i=0; i<me->num_nodes; i++) for (i=0; i<me->num_nodes; i++)
...@@ -150,11 +105,15 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -150,11 +105,15 @@ void raft_become_candidate(raft_server_t* me_)
int i; int i;
__log(me_, NULL, "becoming candidate"); __log(me_, NULL, "becoming candidate");
memset(me->votes_for_me, 0, sizeof(int) * me->num_nodes); memset(me->votes_for_me, 0, sizeof(int) * me->num_nodes);
me->current_term += 1; me->current_term += 1;
raft_vote(me_, me->nodeid); raft_vote(me_, me->nodeid);
raft_set_state(me_, RAFT_STATE_CANDIDATE); raft_set_state(me_, RAFT_STATE_CANDIDATE);
/* we need a random factor here to prevent simultaneous candidates */
me->timeout_elapsed = rand() % 500; me->timeout_elapsed = rand() % 500;
/* request votes from nodes */ /* request votes from nodes */
for (i=0; i<me->num_nodes; i++) for (i=0; i<me->num_nodes; i++)
{ {
...@@ -168,6 +127,7 @@ void raft_become_follower(raft_server_t* me_) ...@@ -168,6 +127,7 @@ void raft_become_follower(raft_server_t* me_)
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
__log(me_, NULL, "becoming follower"); __log(me_, NULL, "becoming follower");
raft_set_state(me_, RAFT_STATE_FOLLOWER); raft_set_state(me_, RAFT_STATE_FOLLOWER);
me->voted_for = -1; me->voted_for = -1;
} }
...@@ -622,38 +582,6 @@ void raft_vote(raft_server_t* me_, int node) ...@@ -622,38 +582,6 @@ void raft_vote(raft_server_t* me_, int node)
me->voted_for = node; me->voted_for = node;
} }
void raft_set_election_timeout(raft_server_t* me_, int millisec)
{
raft_server_private_t* me = (void*)me_;
me->election_timeout = millisec;
}
void raft_set_request_timeout(raft_server_t* me_, int millisec)
{
raft_server_private_t* me = (void*)me_;
me->request_timeout = millisec;
}
int raft_get_nodeid(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->nodeid;
}
int raft_get_election_timeout(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->election_timeout;
}
int raft_get_request_timeout(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->request_timeout;
}
int raft_get_num_nodes(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->num_nodes;
}
raft_node_t* raft_get_node(raft_server_t *me_, int nodeid) raft_node_t* raft_get_node(raft_server_t *me_, int nodeid)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
...@@ -663,44 +591,6 @@ raft_node_t* raft_get_node(raft_server_t *me_, int nodeid) ...@@ -663,44 +591,6 @@ raft_node_t* raft_get_node(raft_server_t *me_, int nodeid)
return me->nodes[nodeid]; return me->nodes[nodeid];
} }
int raft_get_timeout_elapsed(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->timeout_elapsed;
}
int raft_get_log_count(raft_server_t* me_)
{
raft_server_private_t* me = (void*)me_;
return log_count(me->log);
}
int raft_get_voted_for(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->voted_for;
}
void raft_set_current_term(raft_server_t* me_, int term)
{
raft_server_private_t* me = (void*)me_;
me->current_term = term;
}
int raft_get_current_term(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->current_term;
}
void raft_set_current_idx(raft_server_t* me_, int idx)
{
raft_server_private_t* me = (void*)me_;
me->current_idx = idx;
}
int raft_get_current_idx(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->current_idx;
}
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;
...@@ -716,42 +606,4 @@ int raft_is_candidate(raft_server_t* me_) ...@@ -716,42 +606,4 @@ int raft_is_candidate(raft_server_t* me_)
return raft_get_state(me_) == RAFT_STATE_CANDIDATE; return raft_get_state(me_) == RAFT_STATE_CANDIDATE;
} }
int raft_get_my_id(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->nodeid;
}
void raft_set_commit_idx(raft_server_t* me_, int idx)
{
raft_server_private_t* me = (void*)me_;
me->commit_idx = idx;
}
void raft_set_last_applied_idx(raft_server_t* me_, int idx)
{
raft_server_private_t* me = (void*)me_;
me->last_applied_idx = idx;
}
int raft_get_last_applied_idx(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->last_applied_idx;
}
int raft_get_commit_idx(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->commit_idx;
}
void raft_set_state(raft_server_t* me_, int state)
{
raft_server_private_t* me = (void*)me_;
me->state = state;
}
int raft_get_state(raft_server_t* me_)
{
return ((raft_server_private_t*)me_)->state;
}
/*--------------------------------------------------------------79-characters-*/ /*--------------------------------------------------------------79-characters-*/
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
#include "CuTest.h" #include "CuTest.h"
#include "raft.h" #include "raft.h"
#include "raft_private.h"
#include "raft_log.h" #include "raft_log.h"
#include "raft_private.h"
void TestLog_new_is_empty(CuTest * tc) void TestLog_new_is_empty(CuTest * tc)
{ {
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "CuTest.h" #include "CuTest.h"
#include "raft.h" #include "raft.h"
#include "raft_log.h"
#include "raft_private.h" #include "raft_private.h"
void TestRaft_node_set_nextIdx(CuTest * tc) void TestRaft_node_set_nextIdx(CuTest * tc)
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "CuTest.h" #include "CuTest.h"
#include "raft.h" #include "raft.h"
#include "raft_log.h"
#include "raft_private.h" #include "raft_private.h"
#include "mock_send_functions.h" #include "mock_send_functions.h"
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "CuTest.h" #include "CuTest.h"
#include "raft.h" #include "raft.h"
#include "raft_log.h"
#include "raft_private.h" #include "raft_private.h"
#include "mock_send_functions.h" #include "mock_send_functions.h"
......
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