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
RedisLabs Raft
Commits
ce8b0f02
Unverified
Commit
ce8b0f02
authored
Sep 23, 2021
by
Ozan Tezcan
Committed by
GitHub
Sep 23, 2021
Browse files
Define separate callback function for node id retrieval (#55)
Define separate callback function for node id retrieval
parent
36efee07
Changes
6
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
ce8b0f02
...
...
@@ -355,6 +355,25 @@ typedef int (
* */
typedef
int
(
*
func_logentry_event_f
)
(
raft_server_t
*
raft
,
void
*
user_data
,
raft_entry_t
*
entry
,
raft_index_t
entry_idx
);
/** Callback for determining which node this configuration log entry
* affects. This call only applies to configuration change log entries.
* @return the node ID of the node
*
* @param[in] raft The Raft server making this callback
* @param[in] user_data User data that is passed from Raft server
* @param[in] entry The entry that the event is happening to.
* @param[in] entry_idx The entries index in the log
* @return the node ID of the node
* */
typedef
raft_node_id_t
(
*
func_get_node_id_f
)
(
raft_server_t
*
raft
,
void
*
user_data
,
...
...
@@ -427,7 +446,7 @@ typedef struct
/** Callback for determining which node this configuration log entry
* affects. This call only applies to configuration change log entries.
* @return the node ID of the node */
func_
logentry_event_f
log_
get_node_id
;
func_
get_node_id_f
get_node_id
;
/** Callback for detecting when a non-voting node has sufficient logs. */
func_node_has_sufficient_logs_f
node_has_sufficient_logs
;
...
...
src/raft_server.c
View file @
ce8b0f02
...
...
@@ -266,11 +266,11 @@ void raft_handle_append_cfg_change(raft_server_t* me_, raft_entry_t* ety, raft_i
if
(
!
raft_entry_is_cfg_change
(
ety
))
return
;
if
(
!
me
->
cb
.
log_
get_node_id
)
if
(
!
me
->
cb
.
get_node_id
)
return
;
void
*
udata
=
raft_get_udata
(
me_
);
raft_node_id_t
node_id
=
me
->
cb
.
log_
get_node_id
(
me_
,
udata
,
ety
,
idx
);
raft_node_id_t
node_id
=
me
->
cb
.
get_node_id
(
me_
,
udata
,
ety
,
idx
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
int
is_self
=
node_id
==
raft_get_nodeid
(
me_
);
...
...
@@ -315,11 +315,11 @@ void raft_handle_remove_cfg_change(raft_server_t* me_, raft_entry_t* ety, const
if
(
!
raft_entry_is_cfg_change
(
ety
))
return
;
if
(
!
me
->
cb
.
log_
get_node_id
)
if
(
!
me
->
cb
.
get_node_id
)
return
;
void
*
udata
=
raft_get_udata
(
me_
);
raft_node_id_t
node_id
=
me
->
cb
.
log_
get_node_id
(
me_
,
udata
,
ety
,
idx
);
raft_node_id_t
node_id
=
me
->
cb
.
get_node_id
(
me_
,
udata
,
ety
,
idx
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
switch
(
ety
->
type
)
...
...
@@ -1194,7 +1194,7 @@ int raft_apply_entry(raft_server_t* me_)
if
(
!
raft_entry_is_cfg_change
(
ety
))
goto
exit
;
raft_node_id_t
node_id
=
me
->
cb
.
log_
get_node_id
(
me_
,
raft_get_udata
(
me_
),
ety
,
log_idx
);
raft_node_id_t
node_id
=
me
->
cb
.
get_node_id
(
me_
,
raft_get_udata
(
me_
),
ety
,
log_idx
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
switch
(
ety
->
type
)
{
...
...
tests/test_log.c
View file @
ce8b0f02
...
...
@@ -31,7 +31,7 @@ static void __LOG_APPEND_ENTRIES_SEQ_ID(void *l, int count, int id, raft_term_t
}
}
static
int
__logentry
_get_node_id
(
static
raft_node_id_t
_
_get_node_id
(
raft_server_t
*
raft
,
void
*
udata
,
raft_entry_t
*
ety
,
...
...
@@ -76,8 +76,7 @@ static int __log_pop_failing(
}
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
...
...
@@ -147,7 +146,7 @@ void TestLog_delete(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_
get_node_id
=
__
logentry_
get_node_id
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
...
...
@@ -182,8 +181,7 @@ void TestLog_delete_onwards(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
};
...
...
@@ -212,8 +210,7 @@ void TestLog_delete_handles_log_pop_failure(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop_failing
};
...
...
@@ -237,8 +234,7 @@ void TestLog_delete_fails_for_idx_zero(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
};
...
...
@@ -258,8 +254,7 @@ void TestLog_poll(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
};
...
...
@@ -450,8 +445,7 @@ void TestLog_delete_after_polling_from_double_append(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
};
...
...
@@ -487,8 +481,7 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc)
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_pop
=
__log_pop
};
...
...
tests/test_log_impl.c
View file @
ce8b0f02
...
...
@@ -11,7 +11,7 @@
#include "raft.h"
#include "helpers.h"
static
int
__logentry
_get_node_id
(
static
raft_node_id_t
_
_get_node_id
(
raft_server_t
*
raft
,
void
*
udata
,
raft_entry_t
*
ety
,
...
...
@@ -131,8 +131,7 @@ void TestLogImpl_pop(CuTest * tc)
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__logentry_get_node_id
};
.
get_node_id
=
__get_node_id
};
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
...
...
tests/test_server.c
View file @
ce8b0f02
...
...
@@ -70,7 +70,7 @@ static int __raft_send_appendentries(raft_server_t* raft,
return
0
;
}
static
in
t
__raft_
log_
get_node_id
(
raft_server_t
*
raft
,
static
raft_node_id_
t
__raft_get_node_id
(
raft_server_t
*
raft
,
void
*
udata
,
raft_entry_t
*
entry
,
raft_index_t
entry_idx
)
...
...
@@ -3737,7 +3737,7 @@ void TestRaft_leader_recv_entry_add_nonvoting_node_remove_and_revert(CuTest *tc)
.
applylog
=
__raft_applylog
,
.
persist_term
=
__raft_persist_term
,
.
node_has_sufficient_logs
=
__raft_node_has_sufficient_logs
,
.
log_
get_node_id
=
__raft_
log_
get_node_id
.
get_node_id
=
__raft_get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_offer
=
__raft_log_offer
...
...
@@ -3785,8 +3785,7 @@ void TestRaft_leader_recv_appendentries_response_set_has_sufficient_logs_after_v
.
applylog
=
__raft_applylog
,
.
persist_term
=
__raft_persist_term
,
.
node_has_sufficient_logs
=
__raft_node_has_sufficient_logs
,
.
log_get_node_id
=
__raft_log_get_node_id
};
.
get_node_id
=
__raft_get_node_id
};
raft_log_cbs_t
log_funcs
=
{
.
log_offer
=
__raft_log_offer
};
...
...
@@ -4120,8 +4119,7 @@ void TestRaft_recv_appendreq_from_unknown_node(CuTest * tc)
void
TestRaft_unknown_node_can_become_leader
(
CuTest
*
tc
)
{
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__raft_log_get_node_id
};
.
get_node_id
=
__raft_get_node_id
};
void
*
r
=
raft_new
();
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
...
...
@@ -4211,8 +4209,7 @@ void TestRaft_unknown_node_can_become_leader(CuTest * tc)
void
TestRaft_removed_node_starts_election
(
CuTest
*
tc
)
{
raft_cbs_t
funcs
=
{
.
log_get_node_id
=
__raft_log_get_node_id
};
.
get_node_id
=
__raft_get_node_id
};
void
*
r
=
raft_new
();
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
...
...
tests/virtraft2.py
View file @
ce8b0f02
...
...
@@ -211,7 +211,7 @@ def raft_logentry_pop(raft, udata, ety, ety_idx):
return
ffi
.
from_handle
(
udata
).
entry_pop
(
ety
,
ety_idx
)
def
raft_
logentry_
get_node_id
(
raft
,
udata
,
ety
,
ety_idx
):
def
raft_get_node_id
(
raft
,
udata
,
ety
,
ety_idx
):
change_entry
=
ffi
.
from_handle
(
lib
.
raft_entry_getdata
(
ety
))
assert
isinstance
(
change_entry
,
ChangeRaftEntry
)
return
change_entry
.
node_id
...
...
@@ -773,7 +773,7 @@ class RaftServer(object):
cbs
.
applylog
=
self
.
raft_applylog
cbs
.
persist_vote
=
self
.
raft_persist_vote
cbs
.
persist_term
=
self
.
raft_persist_term
cbs
.
log_
get_node_id
=
self
.
raft_
logentry_
get_node_id
cbs
.
get_node_id
=
self
.
raft_get_node_id
cbs
.
node_has_sufficient_logs
=
self
.
raft_node_has_sufficient_logs
cbs
.
notify_membership_event
=
self
.
raft_notify_membership_event
cbs
.
log
=
self
.
raft_log
...
...
@@ -872,7 +872,7 @@ class RaftServer(object):
self
.
raft_logentry_offer
=
ffi
.
callback
(
"int(raft_server_t*, void*, raft_entry_t*, raft_index_t)"
,
raft_logentry_offer
)
self
.
raft_logentry_poll
=
ffi
.
callback
(
"int(raft_server_t*, void*, raft_entry_t*, raft_index_t)"
,
raft_logentry_poll
)
self
.
raft_logentry_pop
=
ffi
.
callback
(
"int(raft_server_t*, void*, raft_entry_t*, raft_index_t)"
,
raft_logentry_pop
)
self
.
raft_
logentry_
get_node_id
=
ffi
.
callback
(
"int(raft_server_t*, void*, raft_entry_t*, raft_index_t)"
,
raft_
logentry_
get_node_id
)
self
.
raft_get_node_id
=
ffi
.
callback
(
"int(raft_server_t*, void*, raft_entry_t*, raft_index_t)"
,
raft_get_node_id
)
self
.
raft_node_has_sufficient_logs
=
ffi
.
callback
(
"int(raft_server_t* raft, void *user_data, raft_node_t* node)"
,
raft_node_has_sufficient_logs
)
self
.
raft_notify_membership_event
=
ffi
.
callback
(
"void(raft_server_t* raft, void *user_data, raft_node_t* node, raft_entry_t* ety, raft_membership_e)"
,
raft_notify_membership_event
)
self
.
raft_log
=
ffi
.
callback
(
"void(raft_server_t*, raft_node_id_t, void*, const char* buf)"
,
raft_log
)
...
...
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