Commit e95a1a87 authored by willem's avatar willem
Browse files

Split out public and private function defs

parent 81c6277e
...@@ -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_server_request_vote.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_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
......
/**
* Copyright (c) 2013, Willem-Hendrik Thiart
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* @file
* @author Willem Thiart himself@willemthiart.com
* @version 0.1
*/
enum { enum {
RAFT_STATE_NONE, RAFT_STATE_NONE,
...@@ -136,79 +145,89 @@ typedef void* raft_server_t; ...@@ -136,79 +145,89 @@ typedef void* raft_server_t;
typedef void* raft_node_t; typedef void* raft_node_t;
/** /**
* Initialise a new raft server */ * Initialise a new raft server
* Election timeout defaults to 1000 milliseconds */
raft_server_t* raft_new(); raft_server_t* raft_new();
/** /**
* De-Initialise raft server */ * De-Initialise raft server */
void raft_free(raft_server_t* me_); void raft_free(raft_server_t* me_);
void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* caller); /**
* Set callbacks
void raft_election_start(raft_server_t* me); * @param funcs Callbacks
* @param cb_ctx The context that we include with all callbacks */
void raft_become_leader(raft_server_t* me); void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* cb_ctx);
void raft_become_candidate(raft_server_t* me); /**
* Set configuration
* @param nodes Array of nodes, end of array is marked by NULL entry
* @param me_idx Which node is myself */
void raft_set_configuration(raft_server_t* me_,
raft_node_configuration_t* nodes, int me_idx);
int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae); /**
* Set election timeout */
void raft_set_election_timeout(raft_server_t* me, int millisec);
/** /**
* @return 0 on error */ * Set request timeout */
int raft_periodic(raft_server_t* me, int msec_since_last_period); void raft_set_request_timeout(raft_server_t* me_, int millisec);
/** /**
* Run actions that are dependent on time passing
* @return 0 on error */ * @return 0 on error */
int raft_recv_appendentries_response(raft_server_t* me_, int raft_periodic(raft_server_t* me, int msec_since_last_period);
int node, msg_appendentries_response_t* aer);
/** /**
* Receive an appendentries message
* @param node Who sent us the response
* @param ae The appendentries message
* @return 0 on error */ * @return 0 on error */
int raft_recv_appendentries(raft_server_t* me, int node, int raft_recv_appendentries(raft_server_t* me, int node,
msg_appendentries_t* ae); msg_appendentries_t* ae);
/**
* Receive a response from an appendentries message we sent
* @param node Who sent us the response
* @param r The appendentries response
* @return 0 on error */
int raft_recv_appendentries_response(raft_server_t* me_,
int node, msg_appendentries_response_t* r);
/**
* Receive a requestvote message
* @param node Who sent us the message
* @param vr The requestvote message
* @return 0 on error */
int raft_recv_requestvote(raft_server_t* me, int node, int raft_recv_requestvote(raft_server_t* me, int node,
msg_requestvote_t* vr); msg_requestvote_t* vr);
/** /**
* Receive a response from a requestvote message we sent
* @param node Who sent us the response
* @param r The requestvote response
* @param node The node this response was sent by */ * @param node The node this response was sent by */
int raft_recv_requestvote_response(raft_server_t* me, int node, int raft_recv_requestvote_response(raft_server_t* me, int node,
msg_requestvote_response_t* r); msg_requestvote_response_t* r);
void raft_execute_entry(raft_server_t* me); /**
* Receive an ENTRY message.
void raft_set_election_timeout(raft_server_t* me, int millisec); * Append entry to log
* Send APPENDENTRIES to followers */
int raft_recv_entry(raft_server_t* me, int node, msg_entry_t* cmd);
int raft_get_election_timeout(raft_server_t* me); int raft_get_election_timeout(raft_server_t* me);
void raft_vote(raft_server_t* me, int node);
raft_node_t* raft_add_node(raft_server_t* me, int node_udata);
int raft_remove_node(raft_server_t* me, int node);
/** /**
* @return number of nodes that this server has */ * @return number of nodes that this server has */
int raft_get_num_nodes(raft_server_t* me); int raft_get_num_nodes(raft_server_t* me);
/**
* Receive an ENTRY message.
* Append entry to log
* Send APPENDENTRIES to followers */
int raft_recv_entry(raft_server_t* me, int node, msg_entry_t* cmd);
/** /**
* @return number of items within log */ * @return number of items within log */
int raft_get_log_count(raft_server_t* me); int raft_get_log_count(raft_server_t* me);
void raft_set_current_term(raft_server_t* me,int term);
void raft_set_current_idx(raft_server_t* me,int idx);
int raft_get_current_term(raft_server_t* me); int raft_get_current_term(raft_server_t* me);
void raft_set_current_idx(raft_server_t* me,int idx);
int raft_get_current_idx(raft_server_t* me); int raft_get_current_idx(raft_server_t* me);
int raft_is_follower(raft_server_t* me); int raft_is_follower(raft_server_t* me);
...@@ -217,54 +236,14 @@ int raft_is_leader(raft_server_t* me); ...@@ -217,54 +236,14 @@ 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 0 on error */
int raft_send_requestvote(raft_server_t* me, int node);
void raft_send_appendentries(raft_server_t* me, int node);
void raft_send_appendentries_all(raft_server_t* me_);
/**
* Appends entry using the current term.
* Note: we make the assumption that current term is up-to-date
* @return 0 if unsuccessful */
int raft_append_entry(raft_server_t* me_, raft_entry_t* c);
int raft_get_timeout_elapsed(raft_server_t* me); int raft_get_timeout_elapsed(raft_server_t* me);
void raft_set_commit_idx(raft_server_t* me, int commit_idx);
void raft_set_last_applied_idx(raft_server_t* me, int idx);
void raft_set_state(raft_server_t* me_, int state);
void raft_set_request_timeout(raft_server_t* me_, int millisec);
int raft_get_last_applied_idx(raft_server_t* me); int raft_get_last_applied_idx(raft_server_t* me);
raft_node_t* raft_node_new(void* udata);
int raft_node_is_leader(raft_node_t* node); int raft_node_is_leader(raft_node_t* node);
int raft_node_get_next_idx(raft_node_t* node); int raft_node_get_next_idx(raft_node_t* node);
void raft_node_set_next_idx(raft_node_t* node, int nextIdx);
/**
* Set configuration
* @param nodes Array of nodes, end of array is marked by NULL entry
* @param me_idx Which node is myself */
void raft_set_configuration(raft_server_t* me_,
raft_node_configuration_t* nodes, int me_idx);
int raft_votes_is_majority(const int nnodes, const int nvotes);
/**
* Apply entry at lastApplied + 1. Entry becomes 'committed'.
* @return 1 if entry committed, 0 otherwise */
int raft_apply_entry(raft_server_t* me_);
raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int idx); raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int idx);
raft_node_t* raft_get_node(raft_server_t *me_, int nodeid); raft_node_t* raft_get_node(raft_server_t *me_, int nodeid);
......
/**
* Copyright (c) 2013, Willem-Hendrik Thiart
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* @file
* @author Willem Thiart himself@willemthiart.com
* @version 0.1
*/
/* These are here for testing purposes */
void raft_election_start(raft_server_t* me);
void raft_become_leader(raft_server_t* me);
void raft_become_candidate(raft_server_t* me);
void raft_vote(raft_server_t* me, int node);
void raft_set_current_term(raft_server_t* me,int term);
void raft_set_current_idx(raft_server_t* me,int idx);
/**
* @return 0 on error */
int raft_send_requestvote(raft_server_t* me, int node);
void raft_send_appendentries(raft_server_t* me, int node);
void raft_send_appendentries_all(raft_server_t* me_);
/**
* Apply entry at lastApplied + 1. Entry becomes 'committed'.
* @return 1 if entry committed, 0 otherwise */
int raft_apply_entry(raft_server_t* me_);
/**
* Appends entry using the current term.
* Note: we make the assumption that current term is up-to-date
* @return 0 if unsuccessful */
int raft_append_entry(raft_server_t* me_, raft_entry_t* c);
void raft_set_commit_idx(raft_server_t* me, int commit_idx);
void raft_set_last_applied_idx(raft_server_t* me, int idx);
void raft_set_state(raft_server_t* me_, int state);
raft_node_t* raft_node_new(void* udata);
void raft_node_set_next_idx(raft_node_t* node, int nextIdx);
int raft_votes_is_majority(const int nnodes, const int nvotes);
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <stdarg.h> #include <stdarg.h>
#include "raft.h" #include "raft.h"
#include "raft_private.h"
#include "raft_log.h" #include "raft_log.h"
typedef struct { typedef struct {
...@@ -91,6 +92,7 @@ typedef struct { ...@@ -91,6 +92,7 @@ typedef struct {
raft_cbs_t cb; raft_cbs_t cb;
void* cb_ctx; void* cb_ctx;
/* my node ID */
int nodeid; int nodeid;
union { union {
...@@ -116,7 +118,7 @@ raft_server_t* raft_new() ...@@ -116,7 +118,7 @@ raft_server_t* raft_new()
{ {
raft_server_private_t* me; raft_server_private_t* me;
if (!(me = calloc(1,sizeof(raft_server_private_t)))) if (!(me = calloc(1, sizeof(raft_server_private_t))))
return NULL; return NULL;
me->current_term = 1; me->current_term = 1;
...@@ -124,7 +126,7 @@ raft_server_t* raft_new() ...@@ -124,7 +126,7 @@ raft_server_t* raft_new()
me->current_idx = 1; me->current_idx = 1;
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
me->log = log_new(); me->log = log_new();
raft_set_state((void*)me,RAFT_STATE_FOLLOWER); raft_set_state((void*)me, RAFT_STATE_FOLLOWER);
me->request_timeout = 200; me->request_timeout = 200;
me->election_timeout = 1000; me->election_timeout = 1000;
return (void*)me; return (void*)me;
...@@ -153,7 +155,6 @@ void raft_election_start(raft_server_t* me_) ...@@ -153,7 +155,6 @@ void raft_election_start(raft_server_t* me_)
__log(me_, NULL, "election starting: %d %d, term: %d", __log(me_, NULL, "election starting: %d %d, term: %d",
me->election_timeout, me->timeout_elapsed, me->current_term); me->election_timeout, me->timeout_elapsed, me->current_term);
/* time to throw our hat in */
raft_become_candidate(me_); raft_become_candidate(me_);
} }
...@@ -247,7 +248,7 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int etyidx) ...@@ -247,7 +248,7 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int etyidx)
} }
int raft_recv_appendentries_response(raft_server_t* me_, int raft_recv_appendentries_response(raft_server_t* me_,
int node, msg_appendentries_response_t* aer) int node, msg_appendentries_response_t* r)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
raft_node_t* p; raft_node_t* p;
...@@ -256,11 +257,11 @@ int raft_recv_appendentries_response(raft_server_t* me_, ...@@ -256,11 +257,11 @@ int raft_recv_appendentries_response(raft_server_t* me_,
p = raft_get_node(me_, node); p = raft_get_node(me_, node);
if (1 == aer->success) if (1 == r->success)
{ {
int i; int i;
for (i=aer->first_idx; i<=aer->current_idx; i++) for (i=r->first_idx; i<=r->current_idx; i++)
log_mark_node_has_committed(me->log, i); log_mark_node_has_committed(me->log, i);
while (1) while (1)
...@@ -589,7 +590,7 @@ void raft_send_appendentries(raft_server_t* me_, int node) ...@@ -589,7 +590,7 @@ void raft_send_appendentries(raft_server_t* me_, int node)
raft_node_t* p = raft_get_node(me_, node); raft_node_t* p = raft_get_node(me_, node);
ae.term = me->current_term; ae.term = me->current_term;
ae.leader_id = raft_get_my_id(me_); ae.leader_id = me->nodeid;
ae.prev_log_term = raft_node_get_next_idx(p); ae.prev_log_term = raft_node_get_next_idx(p);
// TODO: // TODO:
ae.prev_log_idx = 0; ae.prev_log_idx = 0;
...@@ -640,7 +641,7 @@ int raft_get_nvotes_for_me(raft_server_t* me_) ...@@ -640,7 +641,7 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
votes += 1; votes += 1;
} }
if (raft_get_voted_for(me_) == raft_get_my_id(me_)) if (me->voted_for == me->nodeid)
votes += 1; votes += 1;
return votes; return votes;
...@@ -684,17 +685,6 @@ int raft_get_num_nodes(raft_server_t* me_) ...@@ -684,17 +685,6 @@ int raft_get_num_nodes(raft_server_t* me_)
return ((raft_server_private_t*)me_)->nnodes; return ((raft_server_private_t*)me_)->nnodes;
} }
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;
}
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_;
...@@ -784,4 +774,15 @@ int raft_get_commit_idx(raft_server_t* me_) ...@@ -784,4 +774,15 @@ int raft_get_commit_idx(raft_server_t* me_)
return ((raft_server_private_t*)me_)->commit_idx; 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,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "CuTest.h" #include "CuTest.h"
#include "raft.h" #include "raft.h"
#include "raft_private.h"
#include "raft_log.h" #include "raft_log.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_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_private.h"
#include "mock_send_functions.h" #include "mock_send_functions.h"
void TestRaft_scenario_leader_appears(CuTest * tc) void TestRaft_scenario_leader_appears(CuTest * tc)
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "CuTest.h" #include "CuTest.h"
#include "raft.h" #include "raft.h"
#include "raft_private.h"
#include "mock_send_functions.h" #include "mock_send_functions.h"
// TODO: leader doesn't timeout and cause election // TODO: leader doesn't timeout and cause election
......
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "CuTest.h"
#include "raft.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