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
RedisLabs 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