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
01e1b599
Commit
01e1b599
authored
May 23, 2018
by
Yossi Gottlieb
Browse files
Merge remote-tracking branch 'upstream/master'
parents
25df21a1
296c7e0b
Changes
5
Show whitespace changes
Inline
Side-by-side
Makefile
View file @
01e1b599
...
@@ -21,12 +21,13 @@ SHAREDEXT = dylib
...
@@ -21,12 +21,13 @@ SHAREDEXT = dylib
CFLAGS
+=
-I
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/
CFLAGS
+=
-I
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/
CFLAGS
+=
-I
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include
CFLAGS
+=
-I
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include
CFLAGS
+=
$(ASANFLAGS)
CFLAGS
+=
$(ASANFLAGS)
CFLAGS
+=
-Wno-nullability-completeness
else
else
SHAREDFLAGS
=
-shared
SHAREDFLAGS
=
-shared
SHAREDEXT
=
so
SHAREDEXT
=
so
endif
endif
OBJECTS
=
raft_server.o raft_server_properties.o raft_node.o raft_log.o
OBJECTS
=
src/
raft_server.o
src/
raft_server_properties.o
src/
raft_node.o
src/
raft_log.o
all
:
static shared
all
:
static shared
...
@@ -58,10 +59,23 @@ tests: src/raft_server.c src/raft_server_properties.c src/raft_log.c src/raft_no
...
@@ -58,10 +59,23 @@ tests: src/raft_server.c src/raft_server_properties.c src/raft_log.c src/raft_no
./tests_main
./tests_main
gcov raft_server.c
gcov raft_server.c
.PHONY
:
fuzzer
_tests
.PHONY
:
test_
fuzzer
fuzzer
_tests
:
test_
fuzzer
:
python tests/log_fuzzer.py
python tests/log_fuzzer.py
.PHONY
:
tests_full
tests_full
:
make clean
make tests
make test_fuzzer
make test_virtraft
.PHONY
:
test_virtraft
test_virtraft
:
cp
src/
*
.c virtraft/deps/raft/
cp
include/
*
.h virtraft/deps/raft/
cd
virtraft
;
make clean
;
make
;
make tests
.PHONY
:
amalgamation
.PHONY
:
amalgamation
amalgamation
:
amalgamation
:
./scripts/amalgamate.sh
>
raft.h
./scripts/amalgamate.sh
>
raft.h
...
@@ -72,7 +86,7 @@ infer: do_infer
...
@@ -72,7 +86,7 @@ infer: do_infer
.PHONY
:
do_infer
.PHONY
:
do_infer
do_infer
:
do_infer
:
make clean
make clean
infer
--
make
static
infer
--
make
clean
:
clean
:
@
rm
-f
$(TEST_DIR)
/main_test.c
*
.o
$(GCOV_OUTPUT)
;
\
@
rm
-f
$(TEST_DIR)
/main_test.c
*
.o
$(GCOV_OUTPUT)
;
\
...
...
src/raft_log.c
View file @
01e1b599
...
@@ -40,7 +40,7 @@ typedef struct
...
@@ -40,7 +40,7 @@ typedef struct
void
*
raft
;
void
*
raft
;
}
log_private_t
;
}
log_private_t
;
int
mod
(
int
a
,
int
b
)
static
int
mod
(
int
a
,
int
b
)
{
{
int
r
=
a
%
b
;
int
r
=
a
%
b
;
return
r
<
0
?
r
+
b
:
r
;
return
r
<
0
?
r
+
b
:
r
;
...
...
src/raft_server.c
View file @
01e1b599
...
@@ -233,7 +233,6 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
...
@@ -233,7 +233,6 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
if
(
me
->
request_timeout
<=
me
->
timeout_elapsed
)
if
(
me
->
request_timeout
<=
me
->
timeout_elapsed
)
raft_send_appendentries_all
(
me_
);
raft_send_appendentries_all
(
me_
);
}
}
else
if
(
me
->
election_timeout_rand
<=
me
->
timeout_elapsed
&&
else
if
(
me
->
election_timeout_rand
<=
me
->
timeout_elapsed
&&
/* Don't become the leader when building snapshots or bad things will
/* Don't become the leader when building snapshots or bad things will
* happen when we get a client request */
* happen when we get a client request */
...
@@ -251,7 +250,7 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
...
@@ -251,7 +250,7 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
if
(
me
->
last_applied_idx
<
raft_get_commit_idx
(
me_
)
&&
if
(
me
->
last_applied_idx
<
raft_get_commit_idx
(
me_
)
&&
!
raft_snapshot_is_in_progress
(
me_
))
!
raft_snapshot_is_in_progress
(
me_
))
{
{
int
e
=
raft_apply_
entry
(
me_
);
int
e
=
raft_apply_
all
(
me_
);
if
(
0
!=
e
)
if
(
0
!=
e
)
return
e
;
return
e
;
}
}
...
@@ -445,9 +444,15 @@ int raft_recv_appendentries(
...
@@ -445,9 +444,15 @@ int raft_recv_appendentries(
__log
(
me_
,
node
,
"AE term doesn't match prev_term (ie. %d vs %d) ci:%d comi:%d lcomi:%d pli:%d"
,
__log
(
me_
,
node
,
"AE term doesn't match prev_term (ie. %d vs %d) ci:%d comi:%d lcomi:%d pli:%d"
,
ety
->
term
,
ae
->
prev_log_term
,
raft_get_current_idx
(
me_
),
ety
->
term
,
ae
->
prev_log_term
,
raft_get_current_idx
(
me_
),
raft_get_commit_idx
(
me_
),
ae
->
leader_commit
,
ae
->
prev_log_idx
);
raft_get_commit_idx
(
me_
),
ae
->
leader_commit
,
ae
->
prev_log_idx
);
if
(
ae
->
prev_log_idx
<=
raft_get_commit_idx
(
me_
))
{
/* Should never happen; something is seriously wrong! */
__log
(
me_
,
node
,
"AE prev conflicts with committed entry"
);
e
=
RAFT_ERR_SHUTDOWN
;
goto
out
;
}
/* Delete all the following log entries because they don't match */
/* Delete all the following log entries because they don't match */
e
=
raft_delete_entry_from_idx
(
me_
,
e
=
raft_delete_entry_from_idx
(
me_
,
ae
->
prev_log_idx
);
max
(
ae
->
prev_log_idx
,
ae
->
leader_commit
+
1
));
goto
out
;
goto
out
;
}
}
}
}
...
@@ -464,8 +469,17 @@ int raft_recv_appendentries(
...
@@ -464,8 +469,17 @@ int raft_recv_appendentries(
raft_entry_t
*
ety
=
&
ae
->
entries
[
i
];
raft_entry_t
*
ety
=
&
ae
->
entries
[
i
];
int
ety_index
=
ae
->
prev_log_idx
+
1
+
i
;
int
ety_index
=
ae
->
prev_log_idx
+
1
+
i
;
raft_entry_t
*
existing_ety
=
raft_get_entry_from_idx
(
me_
,
ety_index
);
raft_entry_t
*
existing_ety
=
raft_get_entry_from_idx
(
me_
,
ety_index
);
if
(
existing_ety
&&
existing_ety
->
term
!=
ety
->
term
&&
me
->
commit_idx
<
ety_index
)
if
(
existing_ety
&&
existing_ety
->
term
!=
ety
->
term
)
{
if
(
ety_index
<=
raft_get_commit_idx
(
me_
))
{
{
/* Should never happen; something is seriously wrong! */
__log
(
me_
,
node
,
"AE entry conflicts with committed entry ci:%d comi:%d lcomi:%d pli:%d"
,
raft_get_current_idx
(
me_
),
raft_get_commit_idx
(
me_
),
ae
->
leader_commit
,
ae
->
prev_log_idx
);
e
=
RAFT_ERR_SHUTDOWN
;
goto
out
;
}
e
=
raft_delete_entry_from_idx
(
me_
,
ety_index
);
e
=
raft_delete_entry_from_idx
(
me_
,
ety_index
);
if
(
0
!=
e
)
if
(
0
!=
e
)
goto
out
;
goto
out
;
...
@@ -1291,7 +1305,7 @@ int raft_begin_load_snapshot(
...
@@ -1291,7 +1305,7 @@ int raft_begin_load_snapshot(
if
(
last_included_index
==
-
1
)
if
(
last_included_index
==
-
1
)
return
-
1
;
return
-
1
;
if
(
last_included_index
==
0
||
last_included_
index
==
0
)
if
(
last_included_index
==
0
||
last_included_
term
==
0
)
return
-
1
;
return
-
1
;
/* loading the snapshot will break cluster safety */
/* loading the snapshot will break cluster safety */
...
...
tests/test_server.c
View file @
01e1b599
...
@@ -43,6 +43,16 @@ int __raft_applylog(
...
@@ -43,6 +43,16 @@ int __raft_applylog(
return 0;
return 0;
}
}
int __raft_applylog_shutdown(
raft_server_t* raft,
void *udata,
raft_entry_t *ety,
int idx
)
{
return RAFT_ERR_SHUTDOWN;
}
int __raft_send_requestvote(raft_server_t* raft,
int __raft_send_requestvote(raft_server_t* raft,
void* udata,
void* udata,
raft_node_t* node,
raft_node_t* node,
...
@@ -464,6 +474,37 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(
...
@@ -464,6 +474,37 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(
CuAssertIntEquals(tc, 1, raft_get_last_applied_idx(r));
CuAssertIntEquals(tc, 1, raft_get_last_applied_idx(r));
}
}
void TestRaft_user_applylog_error_propogates_to_periodic(
CuTest* tc)
{
raft_cbs_t funcs = {
.persist_term = __raft_persist_term,
.applylog = __raft_applylog_shutdown,
};
void *r = raft_new();
raft_set_callbacks(r, &funcs, NULL);
/* must be follower */
raft_set_state(r, RAFT_STATE_FOLLOWER);
raft_set_current_term(r, 1);
raft_set_last_applied_idx(r, 0);
/* need at least one entry */
raft_entry_t ety = {};
ety.term = 1;
ety.id = 1;
ety.data.buf = "aaa";
ety.data.len = 3;
raft_append_entry(r, &ety);
raft_set_commit_idx(r, 1);
/* let time lapse */
CuAssertIntEquals(tc, RAFT_ERR_SHUTDOWN, raft_periodic(r, 1));
CuAssertIntEquals(tc, 1, raft_get_last_applied_idx(r));
}
void TestRaft_server_apply_entry_increments_last_applied_idx(CuTest* tc)
void TestRaft_server_apply_entry_increments_last_applied_idx(CuTest* tc)
{
{
raft_cbs_t funcs = {
raft_cbs_t funcs = {
...
@@ -3134,10 +3175,6 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca
...
@@ -3134,10 +3175,6 @@ void TestRaft_leader_recv_appendentries_response_do_not_increase_commit_idx_beca
raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
raft_recv_appendentries_response(r, raft_get_node(r, 3), &aer);
CuAssertIntEquals(tc, 3, raft_get_commit_idx(r));
CuAssertIntEquals(tc, 3, raft_get_commit_idx(r));
raft_periodic(r, 1);
raft_periodic(r, 1);
CuAssertIntEquals(tc, 1, raft_get_last_applied_idx(r));
raft_periodic(r, 1);
CuAssertIntEquals(tc, 2, raft_get_last_applied_idx(r));
raft_periodic(r, 1);
CuAssertIntEquals(tc, 3, raft_get_last_applied_idx(r));
CuAssertIntEquals(tc, 3, raft_get_last_applied_idx(r));
}
}
...
...
tests/test_snapshotting.c
View file @
01e1b599
...
@@ -369,6 +369,22 @@ void TestRaft_follower_load_from_snapshot(CuTest * tc)
...
@@ -369,6 +369,22 @@ void TestRaft_follower_load_from_snapshot(CuTest * tc)
CuAssertIntEquals
(
tc
,
7
,
raft_get_commit_idx
(
r
));
CuAssertIntEquals
(
tc
,
7
,
raft_get_commit_idx
(
r
));
}
}
void
TestRaft_follower_load_from_snapshot_fails_if_term_is_0
(
CuTest
*
tc
)
{
raft_cbs_t
funcs
=
{
};
void
*
r
=
raft_new
();
raft_set_callbacks
(
r
,
&
funcs
,
NULL
);
raft_add_node
(
r
,
NULL
,
1
,
1
);
raft_add_node
(
r
,
NULL
,
2
,
0
);
raft_set_state
(
r
,
RAFT_STATE_FOLLOWER
);
CuAssertIntEquals
(
tc
,
0
,
raft_get_log_count
(
r
));
CuAssertIntEquals
(
tc
,
-
1
,
raft_begin_load_snapshot
(
r
,
0
,
5
));
}
void
TestRaft_follower_load_from_snapshot_fails_if_already_loaded
(
CuTest
*
tc
)
void
TestRaft_follower_load_from_snapshot_fails_if_already_loaded
(
CuTest
*
tc
)
{
{
raft_cbs_t
funcs
=
{
raft_cbs_t
funcs
=
{
...
...
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