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
90eba41c
Commit
90eba41c
authored
May 02, 2018
by
Yossi Gottlieb
Browse files
Fix log_get_from_idx() off by one error.
parent
ef596320
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/raft_log.c
View file @
90eba41c
...
...
@@ -172,7 +172,7 @@ raft_entry_t* log_get_from_idx(log_t* me_, int idx, int *n_etys)
assert
(
0
<=
idx
-
1
);
if
(
me
->
base
+
me
->
count
<
idx
||
idx
<
me
->
base
)
if
(
me
->
base
+
me
->
count
<
idx
||
idx
<
=
me
->
base
)
{
*
n_etys
=
0
;
return
NULL
;
...
...
src/raft_server.c
View file @
90eba41c
...
...
@@ -1250,6 +1250,12 @@ int raft_end_snapshot(raft_server_t *me_)
me
->
snapshot_in_progress
=
0
;
__log
(
me_
,
NULL
,
"end snapshot base:%d commit-index:%d current-index:%d
\n
"
,
log_get_base
(
me
->
log
),
raft_get_commit_idx
(
me_
),
raft_get_current_idx
(
me_
));
if
(
!
raft_is_leader
(
me_
))
return
0
;
...
...
tests/test_log.c
View file @
90eba41c
...
...
@@ -579,3 +579,49 @@ void TestLog_delete_after_polling_from_double_append(CuTest * tc)
CuAssertIntEquals
(
tc
,
log_delete
(
l
,
1
),
0
);
CuAssertIntEquals
(
tc
,
0
,
log_count
(
l
));
}
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_pop
=
__log_pop
,
.
log_get_node_id
=
__logentry_get_node_id
};
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
,
&
funcs
,
r
);
raft_entry_t
*
ety
;
/* append append */
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e1
));
CuAssertIntEquals
(
tc
,
0
,
log_append_entry
(
l
,
&
e2
));
CuAssertIntEquals
(
tc
,
2
,
log_count
(
l
));
/* poll */
CuAssertIntEquals
(
tc
,
log_poll
(
l
,
(
void
*
)
&
ety
),
0
);
CuAssertIntEquals
(
tc
,
ety
->
id
,
1
);
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
/* get off-by-one index */
int
n_etys
;
CuAssertPtrEquals
(
tc
,
log_get_from_idx
(
l
,
1
,
&
n_etys
),
NULL
);
CuAssertIntEquals
(
tc
,
n_etys
,
0
);
/* now get the correct index */
ety
=
log_get_from_idx
(
l
,
2
,
&
n_etys
);
CuAssertPtrNotNull
(
tc
,
ety
);
CuAssertIntEquals
(
tc
,
n_etys
,
1
);
CuAssertIntEquals
(
tc
,
ety
->
id
,
2
);
}
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