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
65353d06
Commit
65353d06
authored
Dec 02, 2015
by
Willem Thiart
Browse files
Add node_has_sufficient_logs callback
parent
c0616495
Changes
4
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
65353d06
...
...
@@ -168,6 +168,19 @@ typedef int (
msg_appendentries_t
*
msg
);
/** Callback for detecting when non-voting nodes have obtained enough logs.
* @param[in] raft The Raft server making this callback
* @param[in] user_data User data that is passed from Raft server
* @param[in] node The node
* @return 0 on success */
typedef
void
(
*
func_node_has_sufficient_logs_f
)
(
raft_server_t
*
raft
,
void
*
user_data
,
raft_node_t
*
node
);
#ifndef HAVE_FUNC_LOG
#define HAVE_FUNC_LOG
/** Callback for providing debug logging information.
...
...
@@ -277,6 +290,9 @@ typedef struct
* time to free the memory. */
func_logentry_event_f
log_pop
;
/** Callback for detecting when a non-voting node has sufficient logs. */
func_node_has_sufficient_logs_f
node_has_sufficient_logs
;
/** Callback for catching debugging log messages
* This callback is optional */
func_log_f
log
;
...
...
include/raft_private.h
View file @
65353d06
...
...
@@ -90,6 +90,7 @@ int raft_apply_entry(raft_server_t* me_);
int
raft_append_entry
(
raft_server_t
*
me_
,
raft_entry_t
*
c
);
void
raft_set_commit_idx
(
raft_server_t
*
me
,
int
commit_idx
);
int
raft_get_commit_idx
(
raft_server_t
*
me_
);
void
raft_set_last_applied_idx
(
raft_server_t
*
me
,
int
idx
);
...
...
@@ -110,6 +111,10 @@ void raft_node_vote_for_me(raft_node_t* me_, const int vote);
int
raft_node_has_vote_for_me
(
raft_node_t
*
me_
);
void
raft_node_set_has_sufficient_logs
(
raft_node_t
*
me_
);
int
raft_node_has_sufficient_logs
(
raft_node_t
*
me_
);
int
raft_votes_is_majority
(
const
int
nnodes
,
const
int
nvotes
);
#endif
/* RAFT_PRIVATE_H_ */
src/raft_node.c
View file @
65353d06
...
...
@@ -18,6 +18,7 @@
#define RAFT_NODE_VOTED_FOR_ME 1
#define RAFT_NODE_VOTING 1 << 1
#define RAFT_NODE_HAS_SUFFICIENT_LOG 1 << 2
typedef
struct
{
...
...
@@ -111,6 +112,18 @@ int raft_node_is_voting(raft_node_t* me_)
return
(
me
->
flags
&
RAFT_NODE_VOTING
)
!=
0
;
}
void
raft_node_set_has_sufficient_logs
(
raft_node_t
*
me_
)
{
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
me
->
flags
|=
RAFT_NODE_HAS_SUFFICIENT_LOG
;
}
int
raft_node_has_sufficient_logs
(
raft_node_t
*
me_
)
{
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
return
(
me
->
flags
&
RAFT_NODE_HAS_SUFFICIENT_LOG
)
!=
0
;
}
int
raft_node_get_id
(
raft_node_t
*
me_
)
{
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
...
...
src/raft_server.c
View file @
65353d06
...
...
@@ -109,7 +109,7 @@ void raft_become_candidate(raft_server_t* me_)
__log
(
me_
,
NULL
,
"becoming candidate"
);
raft_set_current_term
(
me_
,
raft_get_current_term
(
me_
)
+
1
);
raft_set_current_term
(
me_
,
raft_get_current_term
(
me_
)
+
1
);
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
raft_node_vote_for_me
(
me
->
nodes
[
i
],
0
);
raft_vote
(
me_
,
me
->
node
);
...
...
@@ -220,6 +220,16 @@ int raft_recv_appendentries_response(raft_server_t* me_,
raft_node_set_next_idx
(
node
,
r
->
current_idx
+
1
);
raft_node_set_match_idx
(
node
,
r
->
current_idx
);
if
(
!
raft_node_is_voting
(
node
)
&&
raft_get_current_idx
(
me_
)
<=
r
->
current_idx
+
1
&&
me
->
cb
.
node_has_sufficient_logs
&&
0
==
raft_node_has_sufficient_logs
(
node
)
)
{
raft_node_set_has_sufficient_logs
(
node
);
me
->
cb
.
node_has_sufficient_logs
(
me_
,
me
->
udata
,
node
);
}
/* Update commit idx */
int
votes
=
1
;
/* include me */
int
point
=
r
->
current_idx
;
...
...
@@ -291,7 +301,7 @@ int raft_recv_appendentries(
{
/* 1. Reply false if term < currentTerm (§5.1) */
__log
(
me_
,
node
,
"AE term %d is less than current term %d"
,
ae
->
term
,
me
->
current_term
);
ae
->
term
,
me
->
current_term
);
goto
fail_with_current_idx
;
}
...
...
@@ -409,7 +419,7 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
return
0
;
}
int
raft_recv_requestvote
(
raft_server_t
*
me_
,
raft_node_t
*
node
,
msg_requestvote_t
*
vr
,
...
...
@@ -513,7 +523,7 @@ int raft_recv_entry(raft_server_t* me_, raft_node_t* node, msg_entry_t* e,
return
-
1
;
__log
(
me_
,
node
,
"received entry t:%d id: %d idx: %d"
,
me
->
current_term
,
e
->
id
,
raft_get_current_idx
(
me_
)
+
1
,
node
);
me
->
current_term
,
e
->
id
,
raft_get_current_idx
(
me_
)
+
1
,
node
);
raft_entry_t
ety
;
ety
.
term
=
me
->
current_term
;
...
...
@@ -581,7 +591,7 @@ int raft_apply_entry(raft_server_t* me_)
return
-
1
;
__log
(
me_
,
NULL
,
"applying log: %d, id: %d size: %d"
,
me
->
last_applied_idx
,
e
->
id
,
e
->
data
.
len
);
me
->
last_applied_idx
,
e
->
id
,
e
->
data
.
len
);
me
->
last_applied_idx
++
;
if
(
me
->
cb
.
applylog
)
...
...
@@ -633,11 +643,11 @@ int raft_send_appendentries(raft_server_t* me_, raft_node_t* node)
}
__log
(
me_
,
node
,
"sending appendentries node: ci:%d t:%d lc:%d pli:%d plt:%d"
,
raft_get_current_idx
(
me_
),
ae
.
term
,
ae
.
leader_commit
,
ae
.
prev_log_idx
,
ae
.
prev_log_term
);
raft_get_current_idx
(
me_
),
ae
.
term
,
ae
.
leader_commit
,
ae
.
prev_log_idx
,
ae
.
prev_log_term
);
me
->
cb
.
send_appendentries
(
me_
,
me
->
udata
,
node
,
&
ae
);
...
...
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