Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Willemt Raft
Commits
5bd3d1d2
Commit
5bd3d1d2
authored
Dec 17, 2013
by
willem
Browse files
Refactoring
parent
ab8baa06
Changes
2
Hide whitespace changes
Inline
Side-by-side
raft.h
View file @
5bd3d1d2
...
@@ -73,6 +73,12 @@ typedef struct {
...
@@ -73,6 +73,12 @@ typedef struct {
/* success true if follower contained entry matching
/* success true if follower contained entry matching
* prevLogidx and prevLogTerm */
* prevLogidx and prevLogTerm */
int
success
;
int
success
;
/* NON-RAFT field */
/* Having the following field allows us to do less book keeping in
* regards to full fledged RPC. This is the highest log IDX we've
* received and appended to our log */
int
current_idx
;
}
msg_appendentries_response_t
;
}
msg_appendentries_response_t
;
typedef
int
(
typedef
int
(
...
@@ -112,14 +118,7 @@ typedef struct {
...
@@ -112,14 +118,7 @@ typedef struct {
func_applylog_f
applylog
;
func_applylog_f
applylog
;
}
raft_external_functions_t
;
}
raft_external_functions_t
;
typedef
struct
{
int
pass
;
// recv_appendentries_f recv_appendentries,
// recv_requestvote_f recv_requestvote,
}
raft_functions_t
;
typedef
void
*
raft_server_t
;
typedef
void
*
raft_server_t
;
typedef
void
*
raft_peer_t
;
typedef
void
*
raft_peer_t
;
raft_server_t
*
raft_new
();
raft_server_t
*
raft_new
();
...
...
raft_server.c
View file @
5bd3d1d2
...
@@ -131,6 +131,38 @@ void raft_free(raft_server_t* me_)
...
@@ -131,6 +131,38 @@ void raft_free(raft_server_t* me_)
free
(
me_
);
free
(
me_
);
}
}
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_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_vote
(
raft_server_t
*
me_
,
int
peer
)
{
return
0
;
}
int
raft_get_num_peers
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
npeers
;
}
void
raft_set_state
(
raft_server_t
*
me_
,
int
state
)
void
raft_set_state
(
raft_server_t
*
me_
,
int
state
)
{
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
raft_server_private_t
*
me
=
(
void
*
)
me_
;
...
@@ -142,10 +174,26 @@ int raft_get_state(raft_server_t* me_)
...
@@ -142,10 +174,26 @@ int raft_get_state(raft_server_t* me_)
return
((
raft_server_private_t
*
)
me_
)
->
state
;
return
((
raft_server_private_t
*
)
me_
)
->
state
;
}
}
raft_peer_t
*
raft_get_peer
(
raft_server_t
*
me_
,
int
peerid
)
{
return
((
raft_server_private_t
*
)
me_
)
->
peers
[
peerid
];
}
/**
* @return number of peers that this server has */
int
raft_get_npeers
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
npeers
;
}
int
raft_get_timeout_elapsed
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
timeout_elapased
;
}
void
raft_set_callbacks
(
raft_server_t
*
me_
,
raft_external_functions_t
*
funcs
,
void
*
cb_ctx
)
void
raft_set_callbacks
(
raft_server_t
*
me_
,
raft_external_functions_t
*
funcs
,
void
*
cb_ctx
)
{
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
raft_server_private_t
*
me
=
(
void
*
)
me_
;
me
->
cb_ctx
=
cb_ctx
;
me
->
cb_ctx
=
cb_ctx
;
me
->
cb
=
funcs
;
me
->
cb
=
funcs
;
}
}
...
@@ -203,27 +251,6 @@ void raft_become_follower(raft_server_t* me_)
...
@@ -203,27 +251,6 @@ void raft_become_follower(raft_server_t* me_)
raft_set_state
(
me_
,
RAFT_STATE_FOLLOWER
);
raft_set_state
(
me_
,
RAFT_STATE_FOLLOWER
);
}
}
/**
* Convert to candidate if election timeout elapses without either
* Receiving valid AppendEntries RPC, or
* Granting vote to candidate */
#if 0
int raft_election_timeout_elapsed(raft_server_t* me_)
{
raft_server_t* me_ = me_;
if (nvalid_AEs_since_election == 0 || votes_granted_to_candidate_since_election == 0)
{
raft_become_candidate(me);
}
}
#endif
int
raft_get_timeout_elapsed
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
timeout_elapased
;
}
int
raft_periodic
(
raft_server_t
*
me_
,
int
msec_since_last_period
)
int
raft_periodic
(
raft_server_t
*
me_
,
int
msec_since_last_period
)
{
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
raft_server_private_t
*
me
=
(
void
*
)
me_
;
...
@@ -326,16 +353,14 @@ int raft_recv_appendentries(
...
@@ -326,16 +353,14 @@ int raft_recv_appendentries(
if
((
e
=
log_peektail
(
me
->
log
)))
if
((
e
=
log_peektail
(
me
->
log
)))
{
{
raft_set_commit_idx
(
me_
,
raft_set_commit_idx
(
me_
,
e
->
id
<
ae
->
leader_commit
?
e
->
id
<
ae
->
leader_commit
?
e
->
id
:
ae
->
leader_commit
);
e
->
id
:
ae
->
leader_commit
);
while
(
1
==
raft_apply_entry
(
me_
));
while
(
1
==
raft_apply_entry
(
me_
));
}
}
}
}
if
(
raft_is_candidate
(
me_
))
if
(
raft_is_candidate
(
me_
))
{
raft_become_follower
(
me_
);
raft_become_follower
(
me_
);
}
raft_set_current_term
(
me_
,
ae
->
term
);
raft_set_current_term
(
me_
,
ae
->
term
);
...
@@ -365,12 +390,12 @@ int raft_recv_appendentries(
...
@@ -365,12 +390,12 @@ int raft_recv_appendentries(
}
}
r
.
success
=
1
;
r
.
success
=
1
;
r
.
current_idx
=
raft_get_current_idx
(
me_
);
done:
done:
if
(
me
->
cb
&&
me
->
cb
->
send
)
if
(
me
->
cb
&&
me
->
cb
->
send
)
me
->
cb
->
send
(
me
->
cb_ctx
,
NULL
,
peer
,
(
void
*
)
&
r
,
me
->
cb
->
send
(
me
->
cb_ctx
,
NULL
,
peer
,
(
void
*
)
&
r
,
sizeof
(
msg_appendentries_response_t
));
sizeof
(
msg_appendentries_response_t
));
return
0
;
return
0
;
}
}
...
@@ -428,9 +453,7 @@ int raft_recv_requestvote_response(raft_server_t* me_, int peer, msg_requestvote
...
@@ -428,9 +453,7 @@ int raft_recv_requestvote_response(raft_server_t* me_, int peer, msg_requestvote
int
votes
;
int
votes
;
me
->
votes_for_me
[
peer
]
=
1
;
me
->
votes_for_me
[
peer
]
=
1
;
votes
=
raft_get_nvotes_for_me
(
me_
);
votes
=
raft_get_nvotes_for_me
(
me_
);
if
(
raft_votes_is_majority
(
me
->
npeers
,
votes
))
if
(
raft_votes_is_majority
(
me
->
npeers
,
votes
))
raft_become_leader
(
me_
);
raft_become_leader
(
me_
);
}
}
...
@@ -438,42 +461,6 @@ int raft_recv_requestvote_response(raft_server_t* me_, int peer, msg_requestvote
...
@@ -438,42 +461,6 @@ int raft_recv_requestvote_response(raft_server_t* me_, int peer, msg_requestvote
return
0
;
return
0
;
}
}
void
raft_execute_entry
(
raft_server_t
*
me_
)
{
}
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_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_vote
(
raft_server_t
*
me_
,
int
peer
)
{
return
0
;
}
int
raft_get_num_peers
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
npeers
;
}
int
raft_send_entry_response
(
raft_server_t
*
me_
,
int
peerid
,
int
etyid
,
int
was_committed
)
int
raft_send_entry_response
(
raft_server_t
*
me_
,
int
peerid
,
int
etyid
,
int
was_committed
)
{
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
raft_server_private_t
*
me
=
(
void
*
)
me_
;
...
@@ -643,7 +630,7 @@ void raft_send_appendentries(raft_server_t* me_, int peer)
...
@@ -643,7 +630,7 @@ void raft_send_appendentries(raft_server_t* me_, int peer)
ae
.
term
=
raft_get_current_term
(
me_
);
ae
.
term
=
raft_get_current_term
(
me_
);
ae
.
leader_id
=
raft_get_my_id
(
me_
);
ae
.
leader_id
=
raft_get_my_id
(
me_
);
ae
.
prev_log_term
=
raft_peer_get_next_idx
(
p
);
ae
.
prev_log_term
=
raft_peer_get_next_idx
(
p
);
ae
.
prev_log_idx
=
//
ae.prev_log_idx =
me
->
cb
->
send
(
me
->
cb_ctx
,
NULL
,
peer
,
me
->
cb
->
send
(
me
->
cb_ctx
,
NULL
,
peer
,
(
void
*
)
&
ae
,
sizeof
(
msg_appendentries_t
));
(
void
*
)
&
ae
,
sizeof
(
msg_appendentries_t
));
}
}
...
@@ -681,15 +668,3 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
...
@@ -681,15 +668,3 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
return
votes
;
return
votes
;
}
}
raft_peer_t
*
raft_get_peer
(
raft_server_t
*
me_
,
int
peerid
)
{
return
((
raft_server_private_t
*
)
me_
)
->
peers
[
peerid
];
}
/**
* @return number of peers that this server has */
int
raft_get_npeers
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
npeers
;
}
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