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
2d680b42
Commit
2d680b42
authored
Dec 09, 2018
by
Yossi Gottlieb
Browse files
Raft entry memory safety documentation + fixes.
parent
bdd49a1e
Changes
11
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
2d680b42
...
...
@@ -101,7 +101,7 @@ typedef struct
short
type
;
/** number of references */
short
refs
;
unsigned
short
refs
;
/** private local data */
void
*
user_data
;
...
...
@@ -339,11 +339,9 @@ typedef int (
* @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.
* For offering, polling, and popping, the user is allowed to change the
* memory pointed to in the raft_entry_data_t struct. This MUST be done if
* the memory is temporary.
* @param[in] entry_idx The entries index in the log
* @return 0 on success */
* @return 0 on success
* */
typedef
int
(
*
func_logentry_event_f
)
(
...
...
@@ -407,6 +405,7 @@ typedef struct
/** Callback for detecting when a non-voting node has sufficient logs. */
func_node_has_sufficient_logs_f
node_has_sufficient_logs
;
/** Callback for being notified of membership changes (optional). */
func_membership_event_f
notify_membership_event
;
/** Callback for catching debugging log messages
...
...
@@ -493,7 +492,9 @@ typedef struct raft_log_impl
* RAFT_ERR_NOMEM memory allocation failure.
*
* @note
* The passed raft_entry_t is expected to be allocated on the heap.
* The passed raft_entry_t is expected to be allocated by raft_entry_new().
* The caller is expected to call raft_entry_release() after the append.
*
* The log implementation shall call raft_entry_hold() in order to
* maintain its reference count, and call raft_entry_release() when
* the entry is no longer needed.
...
...
@@ -536,9 +537,8 @@ typedef struct raft_log_impl
* NULL if no entry in specified index.
*
* @note
* Returned entry memory is owned by the log and may be freed on next log
* operation, so caller must make a copy if it is going to be retained beyond
* this scope.
* Caller must use raft_entry_release() when no longer requiring the
* entry.
*/
raft_entry_t
*
(
*
get
)
(
void
*
log
,
raft_index_t
idx
);
...
...
@@ -550,6 +550,10 @@ typedef struct raft_log_impl
* @return
* Number of entries fetched;
* -1 on error.
*
* @note
* Caller must use raft_entry_release_list() when no longer requiring
* the returned entries.
*/
int
(
*
get_batch
)
(
void
*
log
,
raft_index_t
idx
,
int
entries_n
,
raft_entry_t
**
entries
);
...
...
@@ -669,14 +673,8 @@ int raft_periodic(raft_server_t* me, int msec_elapsed);
*
* Will block (ie. by syncing to disk) if we need to append a message.
*
* Might call malloc once to increase the log entry array size.
*
* The log_offer callback will be called.
*
* @note The memory pointer (ie. raft_entry_data_t) for each msg_entry_t is
* copied directly. If the memory is temporary you MUST either make the
* memory permanent (ie. via malloc) OR re-assign the memory within the
* log_offer callback.
* The caller is responsible to call raft_entry_release() for all
* included entries.
*
* @param[in] node The node who sent us this message
* @param[in] ae The appendentries message
...
...
@@ -727,14 +725,8 @@ int raft_recv_requestvote_response(raft_server_t* me,
*
* Will block (ie. by syncing to disk) if we need to append a message.
*
* Might call malloc once to increase the log entry array size.
*
* The log_offer callback will be called.
*
* @note The memory pointer (ie. raft_entry_data_t) in msg_entry_t is
* copied directly. If the memory is temporary you MUST either make the
* memory permanent (ie. via malloc) OR re-assign the memory within the
* log_offer callback.
* The caller is responsible to call raft_entry_release() following this
* call.
*
* Will fail:
* <ul>
...
...
src/raft_log.c
View file @
2d680b42
...
...
@@ -245,6 +245,8 @@ static int __log_delete(log_t* me_, raft_index_t idx, func_entry_notify_f cb, vo
if
(
cb
)
cb
(
cb_arg
,
me
->
entries
[
back
],
idx_tmp
);
raft_entry_release
(
me
->
entries
[
back
]);
me
->
back
=
back
;
me
->
count
--
;
}
...
...
@@ -272,6 +274,9 @@ int log_poll(log_t * me_, void** etyp)
if
(
0
!=
e
)
return
e
;
}
raft_entry_release
(
me
->
entries
[
me
->
front
]);
me
->
front
++
;
me
->
front
=
me
->
front
%
me
->
size
;
me
->
count
--
;
...
...
@@ -359,12 +364,16 @@ static void __log_reset(void *log, raft_index_t first_idx, raft_term_t term)
static
int
__log_append
(
void
*
log
,
raft_entry_t
*
entry
)
{
raft_entry_hold
(
entry
);
return
log_append_entry
(
log
,
entry
);
}
static
raft_entry_t
*
__log_get
(
void
*
log
,
raft_index_t
idx
)
{
return
log_get_at_idx
(
log
,
idx
);
raft_entry_t
*
e
=
log_get_at_idx
(
log
,
idx
);
if
(
e
!=
NULL
)
raft_entry_hold
(
e
);
return
e
;
}
static
int
__log_get_batch
(
void
*
log
,
raft_index_t
idx
,
int
entries_n
,
raft_entry_t
**
entries
)
...
...
@@ -381,6 +390,7 @@ static int __log_get_batch(void *log, raft_index_t idx, int entries_n, raft_entr
for
(
i
=
0
;
i
<
n
;
i
++
)
{
entries
[
i
]
=
r
[
i
];
raft_entry_hold
(
entries
[
i
]);
}
return
n
;
}
...
...
src/raft_server.c
View file @
2d680b42
...
...
@@ -12,6 +12,7 @@
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stdint.h>
/* for varags */
#include <stdarg.h>
...
...
@@ -376,6 +377,8 @@ int raft_recv_appendentries_response(raft_server_t* me_,
if
(
raft_get_num_voting_nodes
(
me_
)
/
2
<
votes
)
raft_set_commit_idx
(
me_
,
point
);
}
if
(
ety
)
raft_entry_release
(
ety
);
}
/* Aggressively send remaining entries */
...
...
@@ -446,6 +449,8 @@ int raft_recv_appendentries(
/* Should never happen; something is seriously wrong! */
__log
(
me_
,
node
,
"Snapshot AE prev conflicts with committed entry"
);
e
=
RAFT_ERR_SHUTDOWN
;
if
(
ety
)
raft_entry_release
(
ety
);
goto
out
;
}
}
...
...
@@ -466,12 +471,16 @@ int raft_recv_appendentries(
/* Should never happen; something is seriously wrong! */
__log
(
me_
,
node
,
"AE prev conflicts with committed entry"
);
e
=
RAFT_ERR_SHUTDOWN
;
raft_entry_release
(
ety
);
goto
out
;
}
/* Delete all the following log entries because they don't match */
e
=
raft_delete_entry_from_idx
(
me_
,
ae
->
prev_log_idx
);
raft_entry_release
(
ety
);
goto
out
;
}
if
(
ety
)
raft_entry_release
(
ety
);
}
r
->
success
=
1
;
...
...
@@ -485,8 +494,13 @@ int raft_recv_appendentries(
{
raft_entry_t
*
ety
=
ae
->
entries
[
i
];
raft_index_t
ety_index
=
ae
->
prev_log_idx
+
1
+
i
;
raft_entry_t
*
existing_ety
=
raft_get_entry_from_idx
(
me_
,
ety_index
);
if
(
existing_ety
&&
existing_ety
->
term
!=
ety
->
term
)
raft_term_t
existing_term
=
existing_ety
?
existing_ety
->
term
:
0
;
if
(
existing_ety
)
raft_entry_release
(
existing_ety
);
if
(
existing_ety
&&
existing_term
!=
ety
->
term
)
{
if
(
ety_index
<=
raft_get_commit_idx
(
me_
))
{
...
...
@@ -561,9 +575,10 @@ static int __should_grant_vote(raft_server_private_t* me, msg_requestvote_t* vr)
int
ety_term
;
// TODO: add test
if
(
ety
)
if
(
ety
)
{
ety_term
=
ety
->
term
;
else
if
(
!
ety
&&
me
->
snapshot_last_idx
==
current_idx
)
raft_entry_release
(
ety
);
}
else
if
(
!
ety
&&
me
->
snapshot_last_idx
==
current_idx
)
ety_term
=
me
->
snapshot_last_term
;
else
return
0
;
...
...
@@ -845,8 +860,10 @@ int raft_apply_entry(raft_server_t* me_)
if
(
me
->
cb
.
applylog
)
{
int
e
=
me
->
cb
.
applylog
(
me_
,
me
->
udata
,
ety
,
me
->
last_applied_idx
);
if
(
RAFT_ERR_SHUTDOWN
==
e
)
if
(
RAFT_ERR_SHUTDOWN
==
e
)
{
raft_entry_release
(
ety
);
return
RAFT_ERR_SHUTDOWN
;
}
}
/* voting cfg change is now complete.
...
...
@@ -888,6 +905,7 @@ int raft_apply_entry(raft_server_t* me_)
exit:
raft_entry_release
(
ety
);
return
0
;
}
...
...
@@ -956,6 +974,7 @@ int raft_send_appendentries(raft_server_t* me_, raft_node_t* node)
{
ae
.
prev_log_idx
=
next_idx
-
1
;
ae
.
prev_log_term
=
prev_ety
->
term
;
raft_entry_release
(
prev_ety
);
}
}
...
...
@@ -969,6 +988,7 @@ int raft_send_appendentries(raft_server_t* me_, raft_node_t* node)
ae
.
n_entries
);
int
res
=
me
->
cb
.
send_appendentries
(
me_
,
me
->
udata
,
node
,
&
ae
);
raft_entry_release_list
(
ae
.
entries
,
ae
.
n_entries
);
__raft_free
(
ae
.
entries
);
return
res
;
...
...
@@ -1505,6 +1525,7 @@ raft_entry_t *raft_entry_new(unsigned int data_len)
void
raft_entry_hold
(
raft_entry_t
*
ety
)
{
assert
(
ety
->
refs
<
UINT16_MAX
);
ety
->
refs
++
;
}
...
...
src/raft_server_properties.c
View file @
2d680b42
...
...
@@ -221,6 +221,7 @@ raft_term_t raft_get_last_log_term(raft_server_t* me_)
raft_entry_t
*
ety
=
raft_get_entry_from_idx
(
me_
,
current_idx
);
if
(
ety
)
{
raft_term_t
term
=
ety
->
term
;
raft_entry_release
(
ety
);
return
term
;
}
}
...
...
tests/helpers.h
View file @
2d680b42
...
...
@@ -32,13 +32,13 @@ static raft_entry_t **__MAKE_ENTRY_ARRAY_SEQ_ID(int count, int start_id, raft_te
return
array
;
}
static
void
__APPEND_ENTRY
(
void
*
r
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
static
void
__
RAFT_
APPEND_ENTRY
(
void
*
r
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
raft_entry_t
*
e
=
__MAKE_ENTRY
(
id
,
term
,
data
);
raft_append_entry
(
r
,
e
);
}
static
void
__APPEND_ENTRIES_SEQ_ID
(
void
*
r
,
int
count
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
static
void
__
RAFT_
APPEND_ENTRIES_SEQ_ID
(
void
*
r
,
int
count
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
int
i
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
...
...
@@ -47,7 +47,7 @@ static void __APPEND_ENTRIES_SEQ_ID(void *r, int count, int id, raft_term_t term
}
}
static
void
__APPEND_ENTRIES_SEQ_ID_TERM
(
void
*
r
,
int
count
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
static
void
__
RAFT_
APPEND_ENTRIES_SEQ_ID_TERM
(
void
*
r
,
int
count
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
int
i
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
...
...
@@ -56,5 +56,4 @@ static void __APPEND_ENTRIES_SEQ_ID_TERM(void *r, int count, int id, raft_term_t
}
}
#endif
tests/log_fuzzer.py
View file @
2d680b42
...
...
@@ -21,6 +21,7 @@ class Libraft(object):
src/raft_node.c
"""
.
split
(),
include_dirs
=
[
"include"
],
extra_compile_args
=
[
"-UNDEBUG"
]
)
library
=
ffi
.
compile
()
...
...
@@ -83,7 +84,7 @@ class CoreTestCase(unittest.TestCase):
for
cmd
in
commands
:
if
cmd
==
'append'
:
entry
=
self
.
r
.
ffi
.
new
(
'
raft_entry_
t*'
)
entry
=
r
.
raft_entry_
new
(
0
)
entry
.
id
=
unique_id
unique_id
+=
1
...
...
tests/test_log.c
View file @
2d680b42
...
...
@@ -14,6 +14,21 @@
#include "helpers.h"
static
void
__LOG_APPEND_ENTRY
(
void
*
l
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
raft_entry_t
*
e
=
__MAKE_ENTRY
(
id
,
term
,
data
);
log_append_entry
(
l
,
e
);
}
static
void
__LOG_APPEND_ENTRIES_SEQ_ID
(
void
*
l
,
int
count
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
int
i
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
raft_entry_t
*
e
=
__MAKE_ENTRY
(
id
++
,
term
,
data
);
log_append_entry
(
l
,
e
);
}
}
static
int
__logentry_get_node_id
(
raft_server_t
*
raft
,
void
*
udata
,
...
...
@@ -86,65 +101,46 @@ void TestLog_new_is_empty(CuTest * tc)
void
TestLog_append_is_not_empty
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e
;
void
*
r
=
raft_new
();
memset
(
&
e
,
0
,
sizeof
(
raft_entry_t
));
e
.
id
=
1
;
l
=
log_new
();
raft_log_cbs_t
funcs
=
{
.
log_offer
=
__log_offer
};
log_set_callbacks
(
l
,
&
funcs
,
r
);
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e
)
);
__LOG_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
}
void
TestLog_get_at_idx
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
log_new
();
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
e1
.
id
,
log_get_at_idx
(
l
,
1
)
->
id
);
CuAssertIntEquals
(
tc
,
e2
.
id
,
log_get_at_idx
(
l
,
2
)
->
id
);
CuAssertIntEquals
(
tc
,
e3
.
id
,
log_get_at_idx
(
l
,
3
)
->
id
);
CuAssertIntEquals
(
tc
,
1
,
log_get_at_idx
(
l
,
1
)
->
id
);
CuAssertIntEquals
(
tc
,
2
,
log_get_at_idx
(
l
,
2
)
->
id
);
CuAssertIntEquals
(
tc
,
3
,
log_get_at_idx
(
l
,
3
)
->
id
);
}
void
TestLog_get_at_idx_returns_null_where_out_of_bounds
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
l
=
log_new
();
CuAssertTrue
(
tc
,
NULL
==
log_get_at_idx
(
l
,
0
));
CuAssertTrue
(
tc
,
NULL
==
log_get_at_idx
(
l
,
1
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
__LOG_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertTrue
(
tc
,
NULL
==
log_get_at_idx
(
l
,
2
));
}
void
TestLog_delete
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
...
...
@@ -160,22 +156,13 @@ void TestLog_delete(CuTest * tc)
l
=
log_new
();
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
3
,
log_get_current_idx
(
l
));
log_delete
(
l
,
3
);
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
e3
.
id
,
((
raft_entry_t
*
)
llqueue_poll
(
queue
))
->
id
);
CuAssertIntEquals
(
tc
,
3
,
((
raft_entry_t
*
)
llqueue_poll
(
queue
))
->
id
);
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
CuAssertTrue
(
tc
,
NULL
==
log_get_at_idx
(
l
,
3
));
...
...
@@ -201,26 +188,17 @@ void TestLog_delete_onwards(CuTest * tc)
raft_set_callbacks
(
r
,
&
funcs
,
queue
);
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
log_new
();
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
/* even 3 gets deleted */
log_delete
(
l
,
2
);
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
e1
.
id
,
log_get_at_idx
(
l
,
1
)
->
id
);
CuAssertIntEquals
(
tc
,
1
,
log_get_at_idx
(
l
,
1
)
->
id
);
CuAssertTrue
(
tc
,
NULL
==
log_get_at_idx
(
l
,
2
));
CuAssertTrue
(
tc
,
NULL
==
log_get_at_idx
(
l
,
3
));
}
...
...
@@ -228,7 +206,6 @@ void TestLog_delete_onwards(CuTest * tc)
void
TestLog_delete_handles_log_pop_failure
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
void
*
queue
=
llqueue_new
();
void
*
r
=
raft_new
();
...
...
@@ -243,23 +220,14 @@ void TestLog_delete_handles_log_pop_failure(CuTest * tc)
l
=
log_new
();
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
3
,
log_get_current_idx
(
l
));
CuAssertIntEquals
(
tc
,
-
1
,
log_delete
(
l
,
3
));
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
e3
.
id
,
((
raft_entry_t
*
)
log_peektail
(
l
))
->
id
);
CuAssertIntEquals
(
tc
,
3
,
((
raft_entry_t
*
)
log_peektail
(
l
))
->
id
);
}
void
TestLog_delete_fails_for_idx_zero
(
CuTest
*
tc
)
...
...
@@ -276,24 +244,10 @@ void TestLog_delete_fails_for_idx_zero(CuTest * tc)
log_set_callbacks
(
raft_get_log
(
r
),
&
log_funcs
,
r
);
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
log_alloc
(
1
);
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e4
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
4
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
log_delete
(
l
,
0
),
-
1
);
}
...
...
@@ -310,25 +264,17 @@ void TestLog_poll(CuTest * tc)
raft_set_callbacks
(
r
,
&
funcs
,
queue
);
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
l
=
log_new
();
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
__LOG_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
log_get_current_idx
(
l
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
__LOG_APPEND_ENTRY
(
l
,
2
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
log_get_current_idx
(
l
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
__LOG_APPEND_ENTRY
(
l
,
3
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
3
,
log_get_current_idx
(
l
));
...
...
@@ -372,21 +318,12 @@ void TestLog_poll(CuTest * tc)
void
TestLog_peektail
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
log_new
();
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
e3
.
id
,
log_peektail
(
l
)
->
id
);
CuAssertIntEquals
(
tc
,
3
,
log_peektail
(
l
)
->
id
);
}
#if 0
...
...
@@ -407,11 +344,6 @@ void T_estlog_cant_append_duplicates(CuTest * tc)
void
TestLog_load_from_snapshot
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
log_new
();
CuAssertIntEquals
(
tc
,
0
,
log_get_current_idx
(
l
));
...
...
@@ -423,16 +355,10 @@ void TestLog_load_from_snapshot(CuTest * tc)
void
TestLog_load_from_snapshot_clears_log
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
log_new
();
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
2
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
2
,
log_get_current_idx
(
l
));
...
...
@@ -447,18 +373,15 @@ void TestLog_front_pushes_across_boundary(CuTest * tc)
void
*
l
;
raft_entry_t
*
e1
=
__MAKE_ENTRY
(
1
,
1
,
"aa"
);
raft_entry_t
*
e2
=
__MAKE_ENTRY
(
2
,
1
,
"aa"
);
l
=
log_alloc
(
1
);
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
raft_entry_t
*
ety
;
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
e1
)
);
__LOG_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
log_poll
(
l
,
(
void
*
)
&
ety
),
0
);
CuAssertIntEquals
(
tc
,
ety
->
id
,
1
);
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
e2
)
);
__LOG_APPEND_ENTRY
(
l
,
2
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
log_poll
(
l
,
(
void
*
)
&
ety
),
0
);
CuAssertIntEquals
(
tc
,
ety
->
id
,
2
);
}
...
...
@@ -466,39 +389,28 @@ void TestLog_front_pushes_across_boundary(CuTest * tc)
void
TestLog_front_and_back_pushed_across_boundary_with_enlargement_required
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
log_alloc
(
1
);
raft_entry_t
*
ety
;
/* append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
)
);
__LOG_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
/* poll */
CuAssertIntEquals
(
tc
,
log_poll
(
l
,
(
void
*
)
&
ety
),
0
);
CuAssertIntEquals
(
tc
,
ety
->
id
,
1
);
/* append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
)
);
__LOG_APPEND_ENTRY
(
l
,
2
,
0
,
NULL
);
/* poll */
CuAssertIntEquals
(
tc
,
log_poll
(
l
,
(
void
*
)
&
ety
),
0
);
CuAssertIntEquals
(
tc
,
ety
->
id
,
2
);
/* append append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
)
);
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e4
)
);
__LOG_APPEND_ENTRY
(
l
,
3
,
0
,
NULL
);
__LOG_APPEND_ENTRY
(
l
,
4
,
0
,
NULL
);
/* poll */
CuAssertIntEquals
(
tc
,
log_poll
(
l
,
(
void
*
)
&
ety
),
0
);
...
...
@@ -508,24 +420,13 @@ void TestLog_front_and_back_pushed_across_boundary_with_enlargement_required(CuT
void
TestLog_delete_after_polling
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
log_alloc
(
1
);
raft_entry_t
*
ety
;
/* append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
)
);
__LOG_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
/* poll */
...
...
@@ -534,7 +435,7 @@ void TestLog_delete_after_polling(CuTest * tc)
CuAssertIntEquals
(
tc
,
0
,
log_count
(
l
));
/* append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
)
);
__LOG_APPEND_ENTRY
(
l
,
2
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
/* poll */
...
...
@@ -555,17 +456,6 @@ void TestLog_delete_after_polling_from_double_append(CuTest * tc)
raft_set_callbacks
(
r
,
&
funcs
,
queue
);
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
log_alloc
(
1
);
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
...
...
@@ -573,8 +463,7 @@ void TestLog_delete_after_polling_from_double_append(CuTest * tc)
raft_entry_t
*
ety
;
/* append append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
2
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
/* poll */
...
...
@@ -583,7 +472,7 @@ void TestLog_delete_after_polling_from_double_append(CuTest * tc)
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
/* append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e3
)
);
__LOG_APPEND_ENTRY
(
l
,
3
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
/* poll */
...
...
@@ -604,13 +493,6 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc)
raft_set_callbacks
(
r
,
&
funcs
,
queue
);
void
*
l
;
raft_entry_t
e1
,
e2
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
l
=
log_alloc
(
1
);
log_set_callbacks
(
l
,
&
log_funcs
,
r
);
...
...
@@ -618,8 +500,7 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc)
raft_entry_t
*
ety
;
/* append append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
__LOG_APPEND_ENTRIES_SEQ_ID
(
l
,
2
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
/* poll */
...
...
tests/test_log_impl.c
View file @
2d680b42
...
...
@@ -9,6 +9,7 @@
#include "linked_list_queue.h"
#include "raft.h"
#include "helpers.h"
static
int
__logentry_get_node_id
(
raft_server_t
*
raft
,
...
...
@@ -56,6 +57,22 @@ static int __log_pop_failing(
static
const
raft_log_impl_t
*
impl
=
&
raft_log_internal_impl
;
static
void
__LOGIMPL_APPEND_ENTRY
(
void
*
l
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
raft_entry_t
*
e
=
__MAKE_ENTRY
(
id
,
term
,
data
);
impl
->
append
(
l
,
e
);
}
static
void
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
void
*
l
,
int
count
,
int
id
,
raft_term_t
term
,
const
char
*
data
)
{
int
i
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
raft_entry_t
*
e
=
__MAKE_ENTRY
(
id
++
,
term
,
data
);
impl
->
append
(
l
,
e
);
}
}
void
TestLogImpl_new_is_empty
(
CuTest
*
tc
)
{
void
*
l
;
...
...
@@ -68,54 +85,35 @@ void TestLogImpl_new_is_empty(CuTest * tc)
void
TestLogImpl_append_is_not_empty
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e
;
void
*
r
=
raft_new
();
memset
(
&
e
,
0
,
sizeof
(
raft_entry_t
));
e
.
id
=
1
;
l
=
impl
->
init
(
r
,
NULL
);
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e
)
);
__LOGIMPL_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
count
(
l
));
}
void
TestLogImpl_get_at_idx
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
impl
->
init
(
NULL
,
NULL
);
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e3
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
e1
.
id
,
impl
->
get
(
l
,
1
)
->
id
);
CuAssertIntEquals
(
tc
,
e2
.
id
,
impl
->
get
(
l
,
2
)
->
id
);
CuAssertIntEquals
(
tc
,
e3
.
id
,
impl
->
get
(
l
,
3
)
->
id
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
get
(
l
,
1
)
->
id
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
get
(
l
,
2
)
->
id
);
CuAssertIntEquals
(
tc
,
3
,
impl
->
get
(
l
,
3
)
->
id
);
}
void
TestLogImpl_get_at_idx_returns_null_where_out_of_bounds
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
l
=
impl
->
init
(
NULL
,
NULL
);
CuAssertTrue
(
tc
,
NULL
==
impl
->
get
(
l
,
0
));
CuAssertTrue
(
tc
,
NULL
==
impl
->
get
(
l
,
1
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
__LOGIMPL_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertTrue
(
tc
,
NULL
==
impl
->
get
(
l
,
2
));
}
...
...
@@ -130,7 +128,6 @@ void TestLogImpl_pop(CuTest * tc)
{
void
*
queue
=
llqueue_new
();
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
void
*
r
=
raft_new
();
raft_cbs_t
funcs
=
{
...
...
@@ -140,23 +137,13 @@ void TestLogImpl_pop(CuTest * tc)
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
l
=
impl
->
init
(
r
,
NULL
);
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e3
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
3
,
impl
->
current_idx
(
l
));
impl
->
pop
(
l
,
3
,
event_entry_enqueue
,
queue
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
e3
.
id
,
((
raft_entry_t
*
)
llqueue_poll
(
queue
))
->
id
);
CuAssertIntEquals
(
tc
,
3
,
((
raft_entry_t
*
)
llqueue_poll
(
queue
))
->
id
);
CuAssertTrue
(
tc
,
NULL
==
impl
->
get
(
l
,
3
));
impl
->
pop
(
l
,
2
,
NULL
,
NULL
);
...
...
@@ -173,25 +160,15 @@ void TestLogImpl_pop_onwards(CuTest * tc)
void
*
r
=
raft_new
();
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
impl
->
init
(
r
,
NULL
);
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e3
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
3
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
impl
->
count
(
l
));
/* even 3 gets deleted */
impl
->
pop
(
l
,
2
,
NULL
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
e1
.
id
,
impl
->
get
(
l
,
1
)
->
id
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
get
(
l
,
1
)
->
id
);
CuAssertTrue
(
tc
,
NULL
==
impl
->
get
(
l
,
2
));
CuAssertTrue
(
tc
,
NULL
==
impl
->
get
(
l
,
3
));
}
...
...
@@ -202,23 +179,9 @@ void TestLogImpl_pop_fails_for_idx_zero(CuTest * tc)
void
*
r
=
raft_new
();
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
impl
->
init
(
r
,
NULL
);
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e3
));
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e4
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
4
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
impl
->
pop
(
l
,
0
,
NULL
,
NULL
),
-
1
);
}
...
...
@@ -227,24 +190,15 @@ void TestLogImpl_poll(CuTest * tc)
void
*
r
=
raft_new
();
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
l
=
impl
->
init
(
r
,
NULL
);
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
__LOGIMPL_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
current_idx
(
l
));
e2
.
id
=
2
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
__LOGIMPL_APPEND_ENTRY
(
l
,
2
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
current_idx
(
l
));
e3
.
id
=
3
;
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e3
));
__LOGIMPL_APPEND_ENTRY
(
l
,
3
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
3
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
3
,
impl
->
current_idx
(
l
));
...
...
@@ -300,16 +254,10 @@ void TestLogImpl_reset_after_compaction(CuTest * tc)
void
TestLogImpl_load_from_snapshot_clears_log
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
l
=
impl
->
init
(
NULL
,
NULL
);
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
2
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
2
,
impl
->
current_idx
(
l
));
...
...
@@ -321,22 +269,11 @@ void TestLogImpl_load_from_snapshot_clears_log(CuTest * tc)
void
TestLogImpl_pop_after_polling
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
impl
->
init
(
NULL
,
NULL
);
/* append */
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
)
);
__LOGIMPL_APPEND_ENTRY
(
l
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
1
,
impl
->
first_idx
(
l
));
CuAssertIntEquals
(
tc
,
1
,
impl
->
current_idx
(
l
));
...
...
@@ -348,7 +285,7 @@ void TestLogImpl_pop_after_polling(CuTest * tc)
CuAssertIntEquals
(
tc
,
1
,
impl
->
current_idx
(
l
));
/* append */
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
)
);
__LOGIMPL_APPEND_ENTRY
(
l
,
2
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
1
,
impl
->
count
(
l
));
CuAssertIntEquals
(
tc
,
2
,
impl
->
current_idx
(
l
));
...
...
@@ -362,23 +299,11 @@ void TestLogImpl_pop_after_polling_from_double_append(CuTest * tc)
{
void
*
r
=
raft_new
();
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
,
e4
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e3
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e4
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
e3
.
id
=
3
;
e4
.
id
=
4
;
l
=
impl
->
init
(
r
,
NULL
);
/* append append */
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
2
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
count
(
l
));
/* poll */
...
...
@@ -387,7 +312,7 @@ void TestLogImpl_pop_after_polling_from_double_append(CuTest * tc)
CuAssertIntEquals
(
tc
,
1
,
impl
->
count
(
l
));
/* append */
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e3
)
);
__LOGIMPL_APPEND_ENTRY
(
l
,
3
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
count
(
l
));
/* pop */
...
...
@@ -400,19 +325,11 @@ void TestLogImpl_get_from_idx_with_base_off_by_one(CuTest * tc)
void
*
r
=
raft_new
();
void
*
l
;
raft_entry_t
e1
,
e2
;
memset
(
&
e1
,
0
,
sizeof
(
raft_entry_t
));
memset
(
&
e2
,
0
,
sizeof
(
raft_entry_t
));
e1
.
id
=
1
;
e2
.
id
=
2
;
l
=
impl
->
init
(
r
,
NULL
);
/* append append */
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
impl
->
append
(
l
,
&
e2
));
__LOGIMPL_APPEND_ENTRIES_SEQ_ID
(
l
,
2
,
1
,
0
,
NULL
);
CuAssertIntEquals
(
tc
,
2
,
impl
->
count
(
l
));
/* poll */
...
...
tests/test_server.c
View file @
2d680b42
...
...
@@ -129,7 +129,7 @@ void TestRaft_server_idx_starts_at_1(CuTest * tc)
void
*
r
=
raft_new
();
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
}
...
...
@@ -275,7 +275,7 @@ void TestRaft_server_append_entry_is_retrievable(CuTest * tc)
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_current_term
(
r
,
5
);
__APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
raft_entry_t
*
kept
=
raft_get_entry_from_idx
(
r
,
1
);
CuAssertIntEquals
(
tc
,
3
,
kept
->
data_len
);
...
...
@@ -330,8 +330,8 @@ void TestRaft_server_entry_is_retrieveable_using_idx(CuTest* tc)
void
*
r
=
raft_new
();
__APPEND_ENTRY
(
r
,
1
,
1
,
str
);
__APPEND_ENTRY
(
r
,
2
,
1
,
str2
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
str
);
__
RAFT_
APPEND_ENTRY
(
r
,
2
,
1
,
str2
);
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str2
,
3
));
...
...
@@ -362,7 +362,7 @@ void TestRaft_server_wont_apply_entry_if_there_isnt_a_majority(CuTest* tc)
CuAssertTrue
(
tc
,
0
==
raft_get_commit_idx
(
r
));
char
*
str
=
"aaa"
;
__APPEND_ENTRY
(
r
,
1
,
1
,
str
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
str
);
raft_apply_entry
(
r
);
/* Not allowed to be applied because we haven't confirmed a majority yet */
CuAssertTrue
(
tc
,
0
==
raft_get_last_applied_idx
(
r
));
...
...
@@ -388,7 +388,7 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(
raft_set_last_applied_idx
(
r
,
0
);
/* need at least one entry */
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
raft_set_commit_idx
(
r
,
1
);
...
...
@@ -414,7 +414,7 @@ void TestRaft_user_applylog_error_propogates_to_periodic(
raft_set_last_applied_idx
(
r
,
0
);
/* need at least one entry */
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
raft_set_commit_idx
(
r
,
1
);
...
...
@@ -433,7 +433,7 @@ void TestRaft_server_apply_entry_increments_last_applied_idx(CuTest* tc)
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
raft_set_last_applied_idx
(
r
,
0
);
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
raft_set_commit_idx
(
r
,
1
);
raft_apply_entry
(
r
);
CuAssertTrue
(
tc
,
1
==
raft_get_last_applied_idx
(
r
));
...
...
@@ -1218,19 +1218,19 @@ static raft_entry_t* __create_mock_entries_for_conflict_tests(
/* increase log size */
char
*
str1
=
strs
[
0
];
__APPEND_ENTRY
(
r
,
1
,
1
,
str1
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
str1
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
/* this log will be overwritten by a later appendentries */
char
*
str2
=
strs
[
1
];
__APPEND_ENTRY
(
r
,
2
,
1
,
str2
);
__
RAFT_
APPEND_ENTRY
(
r
,
2
,
1
,
str2
);
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
2
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str2
,
3
));
/* this log will be overwritten by a later appendentries */
char
*
str3
=
strs
[
2
];
__APPEND_ENTRY
(
r
,
3
,
1
,
str3
);
__
RAFT_
APPEND_ENTRY
(
r
,
3
,
1
,
str3
);
CuAssertTrue
(
tc
,
3
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
3
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str3
,
3
));
...
...
@@ -1494,8 +1494,8 @@ void TestRaft_follower_recv_appendentries_partial_failures(
raft_set_current_term
(
r
,
1
);
/* Append entry 1 and 2 of term 1. */
__APPEND_ENTRY
(
r
,
1
,
1
,
"1aa"
);
__APPEND_ENTRY
(
r
,
2
,
1
,
"1bb"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"1aa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
2
,
1
,
"1bb"
);
CuAssertIntEquals
(
tc
,
2
,
raft_get_current_idx
(
r
));
msg_appendentries_t
ae
;
...
...
@@ -1658,7 +1658,7 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx(
raft_add_node
(
r
,
NULL
,
2
,
0
);
raft_set_current_term
(
r
,
1
);
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
/* receive an appendentry with commit */
msg_appendentries_t
ae
;
...
...
@@ -1676,7 +1676,7 @@ void TestRaft_follower_recv_appendentries_failure_includes_current_idx(
/* try again with a higher current_idx */
memset
(
&
aer
,
0
,
sizeof
(
aer
));
__APPEND_ENTRY
(
r
,
2
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
2
,
1
,
"aaa"
);
raft_recv_appendentries
(
r
,
raft_get_node
(
r
,
2
),
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
0
==
aer
.
success
);
CuAssertIntEquals
(
tc
,
2
,
aer
.
current_idx
);
...
...
@@ -1736,8 +1736,8 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(
raft_set_current_term
(
r
,
1
);
/* server's idx are more up-to-date */
__APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
__APPEND_ENTRY
(
r
,
101
,
2
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
101
,
2
,
"aaa"
);
/* vote not granted */
raft_recv_requestvote
(
r
,
raft_get_node
(
r
,
2
),
&
rv
,
&
rvr
);
...
...
@@ -2127,9 +2127,9 @@ void TestRaft_candidate_requestvote_includes_logidx(CuTest * tc)
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
5
);
/* 3 entries */
__APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
__APPEND_ENTRY
(
r
,
101
,
1
,
"aaa"
);
__APPEND_ENTRY
(
r
,
102
,
3
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
101
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
102
,
3
,
"aaa"
);
raft_send_requestvote
(
r
,
raft_get_node
(
r
,
2
));
msg_requestvote_t
*
rv
=
sender_poll_msg_data
(
sender
);
...
...
@@ -2427,7 +2427,7 @@ void TestRaft_leader_sends_appendentries_with_leader_commit(
for
(
i
=
0
;
i
<
10
;
i
++
)
{
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaa"
);
}
raft_set_commit_idx
(
r
,
10
);
...
...
@@ -2466,7 +2466,7 @@ void TestRaft_leader_sends_appendentries_with_prevLogIdx(
/* add 1 entry */
/* receive appendentries messages */
__APPEND_ENTRY
(
r
,
100
,
2
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
100
,
2
,
"aaa"
);
raft_node_set_next_idx
(
n
,
1
);
raft_send_appendentries
(
r
,
raft_get_node
(
r
,
2
));
ae
=
sender_poll_msg_data
(
sender
);
...
...
@@ -2510,7 +2510,7 @@ void TestRaft_leader_sends_appendentries_when_node_has_next_idx_of_0(
/* receive appendentries messages */
raft_node_t
*
n
=
raft_get_node
(
r
,
2
);
raft_node_set_next_idx
(
n
,
1
);
__APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
100
,
1
,
"aaa"
);
raft_send_appendentries
(
r
,
n
);
ae
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
...
...
@@ -2626,7 +2626,7 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_when_majori
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
__APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaa"
);
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
...
@@ -2696,7 +2696,7 @@ void TestRaft_leader_recv_appendentries_response_set_has_sufficient_logs_for_nod
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
__APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaaa"
);
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
...
@@ -2742,7 +2742,7 @@ void TestRaft_leader_recv_appendentries_response_increase_commit_idx_using_votin
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
...
@@ -2787,7 +2787,7 @@ void TestRaft_leader_recv_appendentries_response_duplicate_does_not_decrement_ma
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
__APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaaa"
);
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
...
@@ -2843,8 +2843,8 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
__APPEND_ENTRIES_SEQ_ID
(
r
,
2
,
1
,
1
,
"aaaa"
);
__APPEND_ENTRY
(
r
,
3
,
2
,
"aaaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID
(
r
,
2
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
3
,
2
,
"aaaa"
);
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
...
@@ -2919,7 +2919,7 @@ void TestRaft_leader_recv_appendentries_response_jumps_to_lower_next_idx(
raft_set_commit_idx
(
r
,
0
);
/* append entries */
__APPEND_ENTRIES_SEQ_ID_TERM
(
r
,
4
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID_TERM
(
r
,
4
,
1
,
1
,
"aaaa"
);
msg_appendentries_t
*
ae
;
...
...
@@ -2973,7 +2973,7 @@ void TestRaft_leader_recv_appendentries_response_decrements_to_lower_next_idx(
raft_set_commit_idx
(
r
,
0
);
/* append entries */
__APPEND_ENTRIES_SEQ_ID_TERM
(
r
,
4
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID_TERM
(
r
,
4
,
1
,
1
,
"aaaa"
);
msg_appendentries_t
*
ae
;
...
...
@@ -3042,7 +3042,7 @@ void TestRaft_leader_recv_appendentries_response_retry_only_if_leader(CuTest * t
raft_set_last_applied_idx
(
r
,
0
);
/* append entries - we need two */
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
raft_send_appendentries
(
r
,
raft_get_node
(
r
,
2
));
raft_send_appendentries
(
r
,
raft_get_node
(
r
,
3
));
...
...
@@ -3250,7 +3250,7 @@ void TestRaft_leader_recv_entry_does_not_send_new_appendentries_to_slow_nodes(Cu
raft_node_set_next_idx
(
raft_get_node
(
r
,
2
),
1
);
/* append entries */
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
/* entry message */
msg_entry_t
*
mety
=
__MAKE_ENTRY
(
1
,
1
,
"entry"
);
...
...
@@ -3286,7 +3286,7 @@ void TestRaft_leader_recv_appendentries_response_failure_does_not_set_node_nexti
raft_set_commit_idx
(
r
,
0
);
/* append entries */
__APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"aaaa"
);
/* send appendentries -
* server will be waiting for response */
...
...
tests/test_snapshotting.c
View file @
2d680b42
...
...
@@ -428,9 +428,9 @@ void TestRaft_follower_load_from_snapshot_does_not_break_cluster_safety(CuTest *
CuAssertIntEquals
(
tc
,
0
,
raft_get_log_count
(
r
));
/* entry message */
__APPEND_ENTRY
(
r
,
1
,
1
,
"entry"
);
__APPEND_ENTRY
(
r
,
2
,
1
,
"entry"
);
__APPEND_ENTRY
(
r
,
3
,
1
,
"entry"
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
"entry"
);
__
RAFT_
APPEND_ENTRY
(
r
,
2
,
1
,
"entry"
);
__
RAFT_
APPEND_ENTRY
(
r
,
3
,
1
,
"entry"
);
CuAssertIntEquals
(
tc
,
-
1
,
raft_begin_load_snapshot
(
r
,
2
,
2
));
}
...
...
@@ -471,7 +471,7 @@ void TestRaft_leader_sends_appendentries_when_node_next_index_was_compacted(CuTe
raft_add_node
(
r
,
NULL
,
3
,
0
);
/* entry 1 */
__APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaa"
);
__
RAFT_
APPEND_ENTRIES_SEQ_ID
(
r
,
3
,
1
,
1
,
"aaa"
);
CuAssertIntEquals
(
tc
,
3
,
raft_get_current_idx
(
r
));
/* compact entry 1 & 2 */
...
...
@@ -700,13 +700,13 @@ void TestRaft_leader_sends_snapshot_if_log_was_compacted(CuTest* tc)
/* entry 1 */
char
*
str
=
"aaa"
;
__APPEND_ENTRY
(
r
,
1
,
1
,
str
);
__
RAFT_
APPEND_ENTRY
(
r
,
1
,
1
,
str
);
/* entry 2 */
__APPEND_ENTRY
(
r
,
2
,
1
,
str
);
__
RAFT_
APPEND_ENTRY
(
r
,
2
,
1
,
str
);
/* entry 3 */
__APPEND_ENTRY
(
r
,
3
,
1
,
str
);
__
RAFT_
APPEND_ENTRY
(
r
,
3
,
1
,
str
);
CuAssertIntEquals
(
tc
,
3
,
raft_get_current_idx
(
r
));
/* compact entry 1 & 2 */
...
...
tests/virtraft2.py
View file @
2d680b42
...
...
@@ -438,6 +438,7 @@ class Network(object):
ety
=
lib
.
raft_get_entry_from_idx
(
server
.
raft
,
ci
)
try
:
assert
ety
lib
.
raft_entry_release
(
ety
)
except
Exception
:
print
(
'current idx '
,
ci
)
print
(
'count'
,
lib
.
raft_get_log_count
(
server
.
raft
))
...
...
@@ -799,6 +800,7 @@ class RaftServer(object):
logger
.
error
(
self
.
debug_log
())
logger
.
error
(
server
.
debug_log
())
return
lib
.
RAFT_ERR_SHUTDOWN
lib
.
raft_entry_release
(
their_log
)
def
entry_apply
(
self
,
ety
,
idx
):
# collect stats
...
...
@@ -971,6 +973,7 @@ class RaftServer(object):
assert
prev_ety
other_id
=
prev_ety
.
id
assert
other_id
<
ety
.
id
lib
.
raft_entry_release
(
prev_ety
)
except
Exception
as
e
:
logger
.
error
(
other_id
,
ety
.
id
)
self
.
abort_exception
=
e
...
...
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