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
816e8dd1
Commit
816e8dd1
authored
Jul 29, 2015
by
Willem Thiart
Browse files
Added leader_commit to append entries
parent
1ac903b0
Changes
3
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
816e8dd1
...
...
@@ -107,6 +107,20 @@ typedef enum
RAFT_MSG_ENTRY_RESPONSE
,
}
raft_message_type_e
;
typedef
struct
{
/* entry's term */
unsigned
int
term
;
/* the entry's unique ID */
unsigned
int
id
;
/* entry data */
unsigned
char
*
data
;
/* length of entry data */
unsigned
int
len
;
/* number of nodes that have this entry */
unsigned
int
num_nodes
;
}
raft_entry_t
;
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
...
...
@@ -163,28 +177,59 @@ typedef int (
const
int
len
);
/**
* Save who we voted for to disk
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param voted_for The node we voted for
* @return 0 on success */
typedef
int
(
*
func_persist_vote_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
const
int
voted_for
);
/**
* Save the term we are on to disk
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param term Current term
* @return 0 on success */
typedef
int
(
*
func_persist_current_term_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
const
int
current_term
);
/**
* Save log to disk
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param term Current term
* @return 0 on success */
typedef
int
(
*
func_persist_entry_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
const
raft_entry_t
entry
);
typedef
struct
{
func_send_requestvote_f
send_requestvote
;
func_send_appendentries_f
send_appendentries
;
func_log_f
log
;
func_applylog_f
applylog
;
func_persist_vote_f
persist_vote
;
func_persist_current_term_f
persist_current_term
;
func_persist_entry_f
persist_entry
;
}
raft_cbs_t
;
typedef
struct
{
/* entry's term */
unsigned
int
term
;
/* the entry's unique ID */
unsigned
int
id
;
/* entry data */
unsigned
char
*
data
;
/* length of entry data */
unsigned
int
len
;
/* number of nodes that have this entry */
unsigned
int
num_nodes
;
}
raft_entry_t
;
/**
* Initialise a new Raft server
*
...
...
src/raft_server.c
View file @
816e8dd1
...
...
@@ -23,12 +23,16 @@
static
void
__log
(
raft_server_t
*
me_
,
const
char
*
fmt
,
...)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
char
buf
[
1024
];
va_list
args
;
va_start
(
args
,
fmt
);
vsprintf
(
buf
,
fmt
,
args
);
if
(
me
->
cb
.
log
)
me
->
cb
.
log
(
me_
,
me
->
udata
,
buf
);
#if 0 /* debugging */
raft_server_private_t* me = (raft_server_private_t*)me_;
printf("%d: %s\n", me->nodeid, buf);
...
...
@@ -477,6 +481,7 @@ void raft_send_appendentries(raft_server_t* me_, int node)
ae
.
term
=
me
->
current_term
;
ae
.
leader_id
=
me
->
nodeid
;
ae
.
prev_log_term
=
raft_node_get_next_idx
(
p
);
ae
.
leader_commit
=
raft_get_commit_idx
(
me_
);
// TODO:
ae
.
prev_log_idx
=
0
;
ae
.
n_entries
=
0
;
...
...
tests/test_server.c
View file @
816e8dd1
...
...
@@ -1414,6 +1414,31 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
void
TestRaft_leader_sends_appendentries_with_leader_commit
(
CuTest
*
tc
)
{
raft_cbs_t
funcs
=
{
.
send_appendentries
=
sender_appendentries
,
.
log
=
NULL
};
void
*
sender
=
sender_new
(
NULL
);
void
*
r
=
raft_new
();
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
raft_add_peer
(
r
,
(
void
*
)
1
,
1
);
raft_add_peer
(
r
,
(
void
*
)
2
,
0
);
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_commit_idx
(
r
,
10
);
/* receive appendentries messages */
raft_send_appendentries
(
r
,
0
);
msg_appendentries_t
*
ae
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
CuAssertTrue
(
tc
,
ae
->
leader_commit
==
10
);
}
/* 5.3 */
void
TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency
(
...
...
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