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
ea759b8f
Commit
ea759b8f
authored
Jan 16, 2014
by
willem
Browse files
Split out raft_server properties
parent
15594a8d
Changes
7
Show whitespace changes
Inline
Side-by-side
Makefile
View file @
ea759b8f
...
...
@@ -24,7 +24,7 @@ $(TEST_DIR)/main_test.c:
fi
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
$@
$^
./tests_main
...
...
include/raft_private.h
View file @
ea759b8f
...
...
@@ -15,6 +15,53 @@ enum {
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
);
...
...
raft_server.c
View file @
ea759b8f
...
...
@@ -19,57 +19,8 @@
#include <stdarg.h>
#include "raft.h"
#include "raft_private.h"
#include "raft_log.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
;
#include "raft_private.h"
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
);
vsprintf
(
buf
,
fmt
,
args
);
//printf("%d: %s\n", me->nodeid, buf);
//__FUNC_log(bto,src,buf);
#if 0 /* debugging */
printf("%d: %s\n", me->nodeid, buf);
__FUNC_log(bto,src,buf);
#endif
}
raft_server_t
*
raft_new
()
...
...
@@ -113,6 +66,7 @@ void raft_set_callbacks(raft_server_t* me_,
void
raft_free
(
raft_server_t
*
me_
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
log_free
(
me
->
log
);
free
(
me_
);
}
...
...
@@ -133,6 +87,7 @@ void raft_become_leader(raft_server_t* me_)
int
i
;
__log
(
me_
,
NULL
,
"becoming leader"
);
raft_set_state
(
me_
,
RAFT_STATE_LEADER
);
me
->
voted_for
=
-
1
;
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
...
...
@@ -150,11 +105,15 @@ void raft_become_candidate(raft_server_t* me_)
int
i
;
__log
(
me_
,
NULL
,
"becoming candidate"
);
memset
(
me
->
votes_for_me
,
0
,
sizeof
(
int
)
*
me
->
num_nodes
);
me
->
current_term
+=
1
;
raft_vote
(
me_
,
me
->
nodeid
);
raft_set_state
(
me_
,
RAFT_STATE_CANDIDATE
);
/* we need a random factor here to prevent simultaneous candidates */
me
->
timeout_elapsed
=
rand
()
%
500
;
/* request votes from nodes */
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
...
...
@@ -168,6 +127,7 @@ void raft_become_follower(raft_server_t* me_)
raft_server_private_t
*
me
=
(
void
*
)
me_
;
__log
(
me_
,
NULL
,
"becoming follower"
);
raft_set_state
(
me_
,
RAFT_STATE_FOLLOWER
);
me
->
voted_for
=
-
1
;
}
...
...
@@ -622,38 +582,6 @@ void raft_vote(raft_server_t* me_, int 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_server_private_t
*
me
=
(
void
*
)
me_
;
...
...
@@ -663,44 +591,6 @@ raft_node_t* raft_get_node(raft_server_t *me_, int 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_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
...
...
@@ -716,42 +606,4 @@ int raft_is_candidate(raft_server_t* me_)
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-*/
tests/test_log.c
View file @
ea759b8f
...
...
@@ -8,8 +8,8 @@
#include "CuTest.h"
#include "raft.h"
#include "raft_private.h"
#include "raft_log.h"
#include "raft_private.h"
void
TestLog_new_is_empty
(
CuTest
*
tc
)
{
...
...
tests/test_node.c
View file @
ea759b8f
...
...
@@ -8,6 +8,7 @@
#include "CuTest.h"
#include "raft.h"
#include "raft_log.h"
#include "raft_private.h"
void
TestRaft_node_set_nextIdx
(
CuTest
*
tc
)
...
...
tests/test_scenario.c
View file @
ea759b8f
...
...
@@ -8,6 +8,7 @@
#include "CuTest.h"
#include "raft.h"
#include "raft_log.h"
#include "raft_private.h"
#include "mock_send_functions.h"
...
...
tests/test_server.c
View file @
ea759b8f
...
...
@@ -8,6 +8,7 @@
#include "CuTest.h"
#include "raft.h"
#include "raft_log.h"
#include "raft_private.h"
#include "mock_send_functions.h"
...
...
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