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
a0456901
Commit
a0456901
authored
Aug 10, 2015
by
Willem Thiart
Browse files
Added log entry callbacks
parent
50868621
Changes
6
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
a0456901
...
...
@@ -179,7 +179,7 @@ typedef int (
* @param voted_for The node we voted for
* @return 0 on success */
typedef
int
(
*
func_persist_
vote
_f
*
func_persist_
int
_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
...
...
@@ -187,42 +187,38 @@ typedef int (
);
/**
* 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
* @param
entry The entry that the event is happening to
* @return 0 on success */
typedef
int
(
*
func_
persist_current_term
_f
*
func_
logentry_event
_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
raft_entry_t
*
entry
);
typedef
struct
{
/* message sending */
func_send_requestvote_f
send_requestvote
;
func_send_appendentries_f
send_appendentries
;
func_log_f
log
;
/* finite state machine application */
func_applylog_f
applylog
;
func_persist_vote_f
persist_vote
;
func_persist_current_term_f
persist_current_term
;
func_persist_entry_f
persist_entry
;
/* persistence */
func_persist_int_f
persist_vote
;
func_persist_int_f
persist_term
;
/* log entry persistence */
func_logentry_event_f
log_offer
;
func_logentry_event_f
log_poll
;
func_logentry_event_f
log_pop
;
/* debugging - optional */
func_log_f
log
;
}
raft_cbs_t
;
/**
...
...
@@ -431,4 +427,18 @@ int raft_get_voted_for(raft_server_t* me);
* -1 if the leader is unknown */
int
raft_get_current_leader
(
raft_server_t
*
me
);
/**
* @return callback user data */
void
*
raft_get_udata
(
raft_server_t
*
me_
);
/**
* Vote for a server
* @param node The server to vote for */
void
raft_vote
(
raft_server_t
*
me_
,
const
int
node
);
/**
* Set the current term
* @param term The new current term */
void
raft_set_current_term
(
raft_server_t
*
me_
,
const
int
term
);
#endif
/* RAFT_H_ */
include/raft_log.h
View file @
a0456901
...
...
@@ -5,6 +5,8 @@ typedef void* log_t;
log_t
*
log_new
();
void
log_set_callbacks
(
log_t
*
me_
,
raft_cbs_t
*
funcs
,
void
*
raft
);
void
log_free
(
log_t
*
me_
);
/**
...
...
include/raft_private.h
View file @
a0456901
...
...
@@ -31,7 +31,7 @@ typedef struct {
int
voted_for
;
/* the log which is replicated */
log_t
*
log
;
void
*
log
;
/* Volatile state: */
...
...
src/raft_log.c
View file @
a0456901
...
...
@@ -15,6 +15,7 @@
#include <assert.h>
#include "raft.h"
#include "raft_private.h"
#include "raft_log.h"
#define INITIAL_CAPACITY 10
...
...
@@ -35,6 +36,10 @@ typedef struct
int
base_log_idx
;
raft_entry_t
*
entries
;
/* callbacks */
raft_cbs_t
*
cb
;
void
*
raft
;
}
log_private_t
;
static
void
__ensurecapacity
(
log_private_t
*
me
)
...
...
@@ -73,6 +78,14 @@ log_t* log_new()
return
(
log_t
*
)
me
;
}
void
log_set_callbacks
(
log_t
*
me_
,
raft_cbs_t
*
funcs
,
void
*
raft
)
{
log_private_t
*
me
=
(
log_private_t
*
)
me_
;
me
->
raft
=
raft
;
me
->
cb
=
funcs
;
}
int
log_append_entry
(
log_t
*
me_
,
raft_entry_t
*
c
)
{
log_private_t
*
me
=
(
log_private_t
*
)
me_
;
...
...
@@ -86,6 +99,8 @@ int log_append_entry(log_t* me_, raft_entry_t* c)
me
->
entries
[
me
->
back
].
num_nodes
=
0
;
me
->
count
++
;
me
->
back
++
;
if
(
me
->
cb
&&
me
->
cb
->
log_offer
)
me
->
cb
->
log_offer
(
me
->
raft
,
raft_get_udata
(
me
->
raft
),
c
);
return
0
;
}
...
...
@@ -122,6 +137,8 @@ void log_delete(log_t* me_, int idx)
for
(
end
=
log_count
(
me_
);
idx
<
end
;
idx
++
)
{
if
(
me
->
cb
&&
me
->
cb
->
log_pop
)
me
->
cb
->
log_pop
(
me
->
raft
,
raft_get_udata
(
me
->
raft
),
&
me
->
entries
[
me
->
back
]);
me
->
back
--
;
me
->
count
--
;
}
...
...
@@ -135,6 +152,8 @@ void *log_poll(log_t * me_)
return
NULL
;
const
void
*
elem
=
&
me
->
entries
[
me
->
front
];
if
(
me
->
cb
&&
me
->
cb
->
log_poll
)
me
->
cb
->
log_poll
(
me
->
raft
,
raft_get_udata
(
me
->
raft
),
&
me
->
entries
[
me
->
front
]);
me
->
front
++
;
me
->
count
--
;
me
->
base_log_idx
++
;
...
...
src/raft_server.c
View file @
a0456901
...
...
@@ -51,13 +51,13 @@ raft_server_t* raft_new()
return
(
raft_server_t
*
)
me
;
}
void
raft_set_callbacks
(
raft_server_t
*
me_
,
raft_cbs_t
*
funcs
,
void
*
udata
)
void
raft_set_callbacks
(
raft_server_t
*
me_
,
raft_cbs_t
*
funcs
,
void
*
udata
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
memcpy
(
&
me
->
cb
,
funcs
,
sizeof
(
raft_cbs_t
));
me
->
udata
=
udata
;
log_set_callbacks
(
me
->
log
,
&
me
->
cb
,
me_
);
}
void
raft_free
(
raft_server_t
*
me_
)
...
...
@@ -597,9 +597,11 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
return
votes
;
}
void
raft_vote
(
raft_server_t
*
me_
,
int
node
)
void
raft_vote
(
raft_server_t
*
me_
,
const
int
node
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
me
->
voted_for
=
node
;
if
(
me
->
cb
.
persist_vote
)
me
->
cb
.
persist_vote
(
me_
,
me
->
udata
,
node
);
}
src/raft_server_properties.c
View file @
a0456901
...
...
@@ -68,10 +68,12 @@ 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
)
void
raft_set_current_term
(
raft_server_t
*
me_
,
const
int
term
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
me
->
current_term
=
term
;
if
(
me
->
cb
.
persist_term
)
me
->
cb
.
persist_term
(
me_
,
me
->
udata
,
term
);
}
int
raft_get_current_term
(
raft_server_t
*
me_
)
...
...
@@ -146,6 +148,11 @@ int raft_get_current_leader(raft_server_t* me_)
return
me
->
current_leader
;
}
void
*
raft_get_udata
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
udata
;
}
int
raft_is_follower
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
...
...
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