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
Willemt Raft
Commits
d4792de9
Commit
d4792de9
authored
Aug 15, 2015
by
Willem Thiart
Browse files
Fixed current index counter
parent
6a46f305
Changes
3
Show whitespace changes
Inline
Side-by-side
src/raft_node.c
View file @
d4792de9
...
...
@@ -27,6 +27,7 @@ raft_node_t* raft_node_new(void* udata)
raft_node_private_t
*
me
;
me
=
(
raft_node_private_t
*
)
calloc
(
1
,
sizeof
(
raft_node_private_t
));
me
->
udata
=
udata
;
me
->
next_idx
=
1
;
return
(
raft_node_t
*
)
me
;
}
...
...
src/raft_server.c
View file @
d4792de9
...
...
@@ -41,7 +41,7 @@ raft_server_t* raft_new()
return
NULL
;
me
->
current_term
=
0
;
me
->
voted_for
=
-
1
;
me
->
current_idx
=
1
;
me
->
current_idx
=
0
;
me
->
timeout_elapsed
=
0
;
me
->
request_timeout
=
200
;
me
->
election_timeout
=
1000
;
...
...
@@ -224,7 +224,13 @@ int raft_recv_appendentries(
me
->
timeout_elapsed
=
0
;
if
(
0
<
ae
->
n_entries
)
__log
(
me_
,
"received appendentries from: %d"
,
node
);
__log
(
me_
,
"recvd appendentries from: %d, %d %d %d %d #%d"
,
node
,
ae
->
term
,
ae
->
leader_commit
,
ae
->
prev_log_idx
,
ae
->
prev_log_term
,
ae
->
n_entries
);
r
->
term
=
me
->
current_term
;
...
...
@@ -252,7 +258,7 @@ int raft_recv_appendentries(
/* Not the first appendentries we've received */
/* NOTE: the log starts at 1 */
if
(
1
<
ae
->
prev_log_idx
)
if
(
0
<
ae
->
prev_log_idx
)
{
raft_entry_t
*
e
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
);
...
...
@@ -267,7 +273,8 @@ int raft_recv_appendentries(
whose term matches prevLogTerm (§5.3) */
if
(
e
->
term
!=
ae
->
prev_log_term
)
{
__log
(
me_
,
"AE term doesn't match prev_idx"
);
__log
(
me_
,
"AE term doesn't match prev_idx (ie. %d vs %d)"
,
e
->
term
,
ae
->
prev_log_term
);
r
->
success
=
0
;
return
0
;
}
...
...
@@ -275,9 +282,7 @@ int raft_recv_appendentries(
/* 3. If an existing entry conflicts with a new one (same index
but different terms), delete the existing entry and all that
follow it (§5.3) */
raft_entry_t
*
e2
;
e2
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
+
1
);
raft_entry_t
*
e2
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
+
1
);
if
(
e2
)
log_delete
(
me
->
log
,
ae
->
prev_log_idx
+
1
);
...
...
@@ -509,12 +514,8 @@ void raft_send_appendentries(raft_server_t* me_, int node)
msg_entry_t
mety
;
if
(
0
<
next_idx
)
{
raft_entry_t
*
ety
=
raft_get_entry_from_idx
(
me_
,
next_idx
);
if
(
ety
)
{
if
(
me
->
commit_idx
<
next_idx
)
{
mety
.
term
=
ety
->
term
;
mety
.
id
=
ety
->
id
;
...
...
@@ -524,8 +525,6 @@ void raft_send_appendentries(raft_server_t* me_, int node)
// TODO: we want to send more than 1 at a time
ae
.
n_entries
=
1
;
}
}
}
/* previous log is the log just before the new logs */
if
(
1
<
next_idx
)
...
...
tests/test_server.c
View file @
d4792de9
...
...
@@ -25,9 +25,15 @@ void TestRaft_server_voted_for_records_who_we_voted_for(CuTest * tc)
void
TestRaft_server_idx_starts_at_1
(
CuTest
*
tc
)
{
void
*
r
;
void
*
r
=
raft_new
();
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
r
=
raft_new
();
raft_entry_t
ety
;
ety
.
data
=
"aaa"
;
ety
.
len
=
3
;
ety
.
id
=
1
;
ety
.
term
=
1
;
raft_append_entry
(
r
,
&
ety
);
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
}
...
...
@@ -114,14 +120,13 @@ void TestRaft_server_entry_append_cant_append_if_id_is_zero(CuTest* tc)
ety
.
term
=
1
;
r
=
raft_new
();
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
raft_append_entry
(
r
,
&
ety
);
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
}
void
TestRaft_server_entry_append_increases_logidx
(
CuTest
*
tc
)
{
void
*
r
;
raft_entry_t
ety
;
char
*
str
=
"aaa"
;
...
...
@@ -130,15 +135,14 @@ void TestRaft_server_entry_append_increases_logidx(CuTest* tc)
ety
.
id
=
1
;
ety
.
term
=
1
;
r
=
raft_new
();
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
void
*
r
=
raft_new
();
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
raft_append_entry
(
r
,
&
ety
);
CuAssertTrue
(
tc
,
2
==
raft_get_current_idx
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
}
void
TestRaft_server_append_entry_means_entry_gets_current_term
(
CuTest
*
tc
)
{
void
*
r
;
raft_entry_t
ety
;
char
*
str
=
"aaa"
;
...
...
@@ -147,10 +151,10 @@ void TestRaft_server_append_entry_means_entry_gets_current_term(CuTest* tc)
ety
.
id
=
1
;
ety
.
term
=
1
;
r
=
raft_new
();
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
void
*
r
=
raft_new
();
CuAssertTrue
(
tc
,
0
==
raft_get_current_idx
(
r
));
raft_append_entry
(
r
,
&
ety
);
CuAssertTrue
(
tc
,
2
==
raft_get_current_idx
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_current_idx
(
r
));
}
#if 0
...
...
@@ -478,27 +482,19 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest
*
tc
)
{
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
log
=
NULL
};
msg_requestvote_t
rv
;
msg_requestvote_response_t
rvr
;
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
void
*
r
=
raft_new
();
raft_add_peer
(
r
,
(
void
*
)
1
,
1
);
raft_add_peer
(
r
,
(
void
*
)
2
,
0
);
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_vote
(
r
,
0
);
msg_requestvote_t
rv
;
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_t
));
rv
.
term
=
1
;
rv
.
candidate_id
=
1
;
rv
.
last_log_idx
=
0
;
rv
.
last_log_idx
=
1
;
rv
.
last_log_term
=
1
;
msg_requestvote_response_t
rvr
;
raft_recv_requestvote
(
r
,
1
,
&
rv
,
&
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
.
vote_granted
);
}
...
...
@@ -1814,7 +1810,7 @@ void TestRaft_leader_recv_appendentries_response_increment_idx_of_peer(
raft_set_current_term
(
r
,
1
);
raft_node_t
*
p
=
raft_get_node
(
r
,
1
);
CuAssertTrue
(
tc
,
1
!
=
raft_node_get_next_idx
(
p
));
CuAssertTrue
(
tc
,
1
=
=
raft_node_get_next_idx
(
p
));
/* receive mock success responses */
msg_appendentries_response_t
aer
;
...
...
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