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
Willemt Raft
Commits
d4792de9
Commit
d4792de9
authored
Aug 15, 2015
by
Willem Thiart
Browse files
Fixed current index counter
parent
6a46f305
Changes
3
Hide 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,22 +514,16 @@ 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
)
{
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
;
mety
.
data
.
len
=
ety
->
len
;
mety
.
data
.
buf
=
ety
->
data
;
ae
.
entries
=
&
mety
;
// TODO: we want to send more than 1 at a time
ae
.
n_entries
=
1
;
}
}
mety
.
term
=
ety
->
term
;
mety
.
id
=
ety
->
id
;
mety
.
data
.
len
=
ety
->
len
;
mety
.
data
.
buf
=
ety
->
data
;
ae
.
entries
=
&
mety
;
// 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 */
...
...
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