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
2a50ff78
Commit
2a50ff78
authored
Feb 01, 2015
by
Willem Thiart
Browse files
Linting; Fixed -Wunused-variable warnings
parent
9eacf4d0
Changes
5
Expand all
Show whitespace changes
Inline
Side-by-side
Makefile
View file @
2a50ff78
...
...
@@ -8,6 +8,7 @@ GCOV_CCFLAGS = -fprofile-arcs -ftest-coverage
SHELL
=
/bin/bash
CFLAGS
+=
-Iinclude
-Werror
-Werror
=
return
-type
-Werror
=
uninitialized
-Wcast-align
\
-Wno-pointer-sign
-fno-omit-frame-pointer
-fno-common
-fsigned-char
\
-Wunused-variable
\
$(GCOV_CCFLAGS)
-I
$(LLQUEUE_DIR)
-Iinclude
-g
-O2
-fPIC
UNAME
:=
$(
shell
uname
)
...
...
src/raft_log.c
View file @
2a50ff78
...
...
@@ -40,7 +40,7 @@ typedef struct
static
void
__ensurecapacity
(
log_private_t
*
me
)
)
{
int
i
,
j
;
raft_entry_t
*
temp
;
...
...
@@ -48,7 +48,7 @@ static void __ensurecapacity(
if
(
me
->
count
<
me
->
size
)
return
;
temp
=
calloc
(
1
,
sizeof
(
raft_entry_t
)
*
me
->
size
*
2
);
temp
=
calloc
(
1
,
sizeof
(
raft_entry_t
)
*
me
->
size
*
2
);
for
(
i
=
0
,
j
=
me
->
front
;
i
<
me
->
count
;
i
++
,
j
++
)
{
...
...
@@ -70,11 +70,11 @@ log_t* log_new()
{
log_private_t
*
me
;
me
=
calloc
(
1
,
sizeof
(
log_private_t
));
me
=
calloc
(
1
,
sizeof
(
log_private_t
));
me
->
size
=
INITIAL_CAPACITY
;
me
->
count
=
0
;
me
->
back
=
in
(
me
)
->
front
=
0
;
me
->
entries
=
calloc
(
1
,
sizeof
(
raft_entry_t
)
*
me
->
size
);
me
->
entries
=
calloc
(
1
,
sizeof
(
raft_entry_t
)
*
me
->
size
);
return
(
void
*
)
me
;
}
...
...
@@ -90,7 +90,7 @@ int log_append_entry(log_t* me_, raft_entry_t* c)
// if (hashmap_get(me->log_map, (void*)c->id+1))
// return 0;
memcpy
(
&
me
->
entries
[
me
->
back
],
c
,
sizeof
(
raft_entry_t
));
memcpy
(
&
me
->
entries
[
me
->
back
],
c
,
sizeof
(
raft_entry_t
));
me
->
entries
[
me
->
back
].
num_nodes
=
0
;
me
->
count
++
;
me
->
back
++
;
...
...
@@ -120,13 +120,13 @@ int log_count(log_t* me_)
void
log_delete
(
log_t
*
me_
,
int
idx
)
{
log_private_t
*
me
=
(
void
*
)
me_
;
int
end
,
i
;
int
end
;
/* idx starts at 1 */
idx
-=
1
;
idx
-=
me
->
base_log_idx
;
for
(
end
=
log_count
(
me_
);
idx
<
end
;
idx
++
)
for
(
end
=
log_count
(
me_
);
idx
<
end
;
idx
++
)
{
me
->
back
--
;
me
->
count
--
;
...
...
@@ -145,7 +145,7 @@ void log_delete(log_t* me_, int idx)
in(me)->back = in(me)->size;
elem = me->entries[in(me)->back];
return (void
*)
elem;
return (void*)elem;
#endif
}
...
...
@@ -160,22 +160,20 @@ void *log_poll(log_t * me_)
me
->
front
++
;
me
->
count
--
;
me
->
base_log_idx
++
;
return
(
void
*
)
elem
;
return
(
void
*
)
elem
;
}
raft_entry_t
*
log_peektail
(
log_t
*
me_
)
{
log_private_t
*
me
=
(
void
*
)
me_
;
const
void
*
elem
;
int
i
;
if
(
0
==
log_count
(
me_
))
return
NULL
;
if
(
0
==
me
->
back
)
return
&
me
->
entries
[
me
->
size
-
1
];
return
&
me
->
entries
[
me
->
size
-
1
];
else
return
&
me
->
entries
[
me
->
back
-
1
];
return
&
me
->
entries
[
me
->
back
-
1
];
}
void
log_empty
(
log_t
*
me_
)
...
...
@@ -197,12 +195,9 @@ void log_free(log_t * me_)
void
log_mark_node_has_committed
(
log_t
*
me_
,
int
idx
)
{
log_private_t
*
me
=
(
void
*
)
me_
;
raft_entry_t
*
e
;
if
((
e
=
log_get_from_idx
(
me_
,
idx
)))
{
if
((
e
=
log_get_from_idx
(
me_
,
idx
)))
e
->
num_nodes
+=
1
;
}
}
src/raft_server.c
View file @
2a50ff78
...
...
@@ -25,15 +25,16 @@
static
void
__log
(
raft_server_t
*
me_
,
const
char
*
fmt
,
...)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
char
buf
[
1024
];
va_list
args
;
va_start
(
args
,
fmt
);
vsprintf
(
buf
,
fmt
,
args
);
#if 0 /* debugging */
raft_server_private_t* me = (void*)me_;
printf("%d: %s\n", me->nodeid, buf);
__FUNC_log(bto,src,buf);
__FUNC_log(bto,
src,
buf);
#endif
}
...
...
@@ -89,13 +90,14 @@ void raft_become_leader(raft_server_t* me_)
__log
(
me_
,
"becoming leader"
);
raft_set_state
(
me_
,
RAFT_STATE_LEADER
);
raft_set_state
(
me_
,
RAFT_STATE_LEADER
);
me
->
voted_for
=
-
1
;
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodeid
==
i
)
continue
;
if
(
me
->
nodeid
==
i
)
continue
;
raft_node_t
*
p
=
raft_get_node
(
me_
,
i
);
raft_node_set_next_idx
(
p
,
raft_get_current_idx
(
me_
)
+
1
);
raft_node_set_next_idx
(
p
,
raft_get_current_idx
(
me_
)
+
1
);
raft_send_appendentries
(
me_
,
i
);
}
}
...
...
@@ -115,9 +117,10 @@ void raft_become_candidate(raft_server_t* me_)
/* we need a random factor here to prevent simultaneous candidates */
me
->
timeout_elapsed
=
rand
()
%
500
;
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodeid
==
i
)
continue
;
if
(
me
->
nodeid
==
i
)
continue
;
raft_send_requestvote
(
me_
,
i
);
}
}
...
...
@@ -142,10 +145,8 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
{
case
RAFT_STATE_FOLLOWER
:
if
(
me
->
last_applied_idx
<
me
->
commit_idx
)
{
if
(
0
==
raft_apply_entry
(
me_
))
return
0
;
}
break
;
}
...
...
@@ -159,13 +160,9 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
me
->
timeout_elapsed
=
0
;
}
}
else
{
if
(
me
->
election_timeout
<=
me
->
timeout_elapsed
)
{
else
if
(
me
->
election_timeout
<=
me
->
timeout_elapsed
)
raft_election_start
(
me_
);
}
}
return
1
;
}
...
...
@@ -190,7 +187,7 @@ int raft_recv_appendentries_response(raft_server_t* me_,
{
int
i
;
for
(
i
=
r
->
first_idx
;
i
<=
r
->
current_idx
;
i
++
)
for
(
i
=
r
->
first_idx
;
i
<=
r
->
current_idx
;
i
++
)
log_mark_node_has_committed
(
me
->
log
,
i
);
while
(
1
)
...
...
@@ -202,14 +199,13 @@ int raft_recv_appendentries_response(raft_server_t* me_,
/* majority has this */
if
(
e
&&
me
->
num_nodes
/
2
<=
e
->
num_nodes
)
{
if
(
0
==
raft_apply_entry
(
me_
))
break
;
if
(
0
==
raft_apply_entry
(
me_
))
break
;
}
else
{
break
;
}
}
}
else
{
/* If AppendEntries fails because of log inconsistency:
...
...
@@ -217,7 +213,7 @@ int raft_recv_appendentries_response(raft_server_t* me_,
assert
(
0
<=
raft_node_get_next_idx
(
p
));
// TODO does this have test coverage?
// TODO can jump back to where node is different instead of iterating
raft_node_set_next_idx
(
p
,
raft_node_get_next_idx
(
p
)
-
1
);
raft_node_set_next_idx
(
p
,
raft_node_get_next_idx
(
p
)
-
1
);
raft_send_appendentries
(
me_
,
node
);
}
...
...
@@ -280,10 +276,8 @@ int raft_recv_appendentries(
but different terms), delete the existing entry and all that
follow it (§5.3) */
raft_entry_t
*
e2
;
if
((
e2
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
+
1
)))
{
log_delete
(
me
->
log
,
ae
->
prev_log_idx
+
1
);
}
if
((
e2
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
+
1
)))
log_delete
(
me
->
log
,
ae
->
prev_log_idx
+
1
);
}
else
{
...
...
@@ -304,7 +298,8 @@ int raft_recv_appendentries(
{
raft_set_commit_idx
(
me_
,
e
->
id
<
ae
->
leader_commit
?
e
->
id
:
ae
->
leader_commit
);
while
(
1
==
raft_apply_entry
(
me_
));
while
(
1
==
raft_apply_entry
(
me_
))
;
}
}
...
...
@@ -316,7 +311,7 @@ int raft_recv_appendentries(
int
i
;
/* append all entries to log */
for
(
i
=
0
;
i
<
ae
->
n_entries
;
i
++
)
for
(
i
=
0
;
i
<
ae
->
n_entries
;
i
++
)
{
msg_entry_t
*
cmd
;
raft_entry_t
*
c
;
...
...
@@ -354,21 +349,17 @@ int raft_recv_requestvote(raft_server_t* me_, int node, msg_requestvote_t* vr)
msg_requestvote_response_t
r
;
if
(
raft_get_current_term
(
me_
)
<
vr
->
term
)
{
me
->
voted_for
=
-
1
;
}
if
(
vr
->
term
<
raft_get_current_term
(
me_
)
||
/* we've already voted */
-
1
!=
me
->
voted_for
||
/* we have a more up-to-date log */
vr
->
last_log_idx
<
me
->
current_idx
)
{
r
.
vote_granted
=
0
;
}
else
{
raft_vote
(
me_
,
node
);
raft_vote
(
me_
,
node
);
r
.
vote_granted
=
1
;
}
...
...
@@ -450,10 +441,11 @@ int raft_recv_entry(raft_server_t* me_, int node, msg_entry_t* e)
ety
.
len
=
e
->
len
;
res
=
raft_append_entry
(
me_
,
&
ety
);
raft_send_entry_response
(
me_
,
node
,
e
->
id
,
res
);
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodeid
==
i
)
continue
;
raft_send_appendentries
(
me_
,
i
);
if
(
me
->
nodeid
==
i
)
continue
;
raft_send_appendentries
(
me_
,
i
);
}
return
0
;
}
...
...
@@ -476,7 +468,7 @@ int raft_append_entry(raft_server_t* me_, raft_entry_t* c)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
if
(
1
==
log_append_entry
(
me
->
log
,
c
))
if
(
1
==
log_append_entry
(
me
->
log
,
c
))
{
me
->
current_idx
+=
1
;
return
1
;
...
...
@@ -489,7 +481,7 @@ int raft_apply_entry(raft_server_t* me_)
raft_server_private_t
*
me
=
(
void
*
)
me_
;
raft_entry_t
*
e
;
if
(
!
(
e
=
log_get_from_idx
(
me
->
log
,
me
->
last_applied_idx
+
1
)))
if
(
!
(
e
=
log_get_from_idx
(
me
->
log
,
me
->
last_applied_idx
+
1
)))
return
0
;
__log
(
me_
,
"applying log: %d"
,
me
->
last_applied_idx
);
...
...
@@ -529,9 +521,10 @@ void raft_send_appendentries_all(raft_server_t* me_)
raft_server_private_t
*
me
=
(
void
*
)
me_
;
int
i
;
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodeid
==
i
)
continue
;
if
(
me
->
nodeid
==
i
)
continue
;
raft_send_appendentries
(
me_
,
i
);
}
}
...
...
@@ -543,12 +536,12 @@ void raft_set_configuration(raft_server_t* me_,
int
num_nodes
;
/* TODO: one memory allocation only please */
for
(
num_nodes
=
0
;
nodes
->
udata_address
;
nodes
++
)
for
(
num_nodes
=
0
;
nodes
->
udata_address
;
nodes
++
)
{
num_nodes
++
;
me
->
nodes
=
realloc
(
me
->
nodes
,
sizeof
(
raft_node_t
*
)
*
num_nodes
);
me
->
nodes
=
realloc
(
me
->
nodes
,
sizeof
(
raft_node_t
*
)
*
num_nodes
);
me
->
num_nodes
=
num_nodes
;
me
->
nodes
[
num_nodes
-
1
]
=
raft_node_new
(
nodes
->
udata_address
);
me
->
nodes
[
num_nodes
-
1
]
=
raft_node_new
(
nodes
->
udata_address
);
}
me
->
votes_for_me
=
calloc
(
num_nodes
,
sizeof
(
int
));
me
->
nodeid
=
my_idx
;
...
...
@@ -559,9 +552,10 @@ int raft_get_nvotes_for_me(raft_server_t* me_)
raft_server_private_t
*
me
=
(
void
*
)
me_
;
int
i
,
votes
;
for
(
i
=
0
,
votes
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
i
=
0
,
votes
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodeid
==
i
)
continue
;
if
(
me
->
nodeid
==
i
)
continue
;
if
(
1
==
me
->
votes_for_me
[
i
])
votes
+=
1
;
}
...
...
tests/test_log.c
View file @
2a50ff78
...
...
@@ -46,33 +46,33 @@ void TestLog_get_at_idx(CuTest * tc)
CuAssertTrue
(
tc
,
3
==
log_count
(
l
));
CuAssertTrue
(
tc
,
3
==
log_count
(
l
));
CuAssertTrue
(
tc
,
e2
.
id
==
log_get_from_idx
(
l
,
2
)
->
id
);
CuAssertTrue
(
tc
,
e2
.
id
==
log_get_from_idx
(
l
,
2
)
->
id
);
}
void
TestLog_get_at_idx_returns_null_where_out_of_bounds
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
raft_entry_t
e1
;
l
=
log_new
();
e1
.
id
=
1
;
CuAssertTrue
(
tc
,
1
==
log_append_entry
(
l
,
&
e1
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
2
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
2
));
}
void
TestLog_mark_node_has_committed_adds_nodes
(
CuTest
*
tc
)
{
void
*
l
;
raft_entry_t
e1
,
e2
,
e3
;
raft_entry_t
e1
;
l
=
log_new
();
e1
.
id
=
1
;
log_append_entry
(
l
,
&
e1
);
CuAssertTrue
(
tc
,
0
==
log_get_from_idx
(
l
,
1
)
->
num_nodes
);
CuAssertTrue
(
tc
,
0
==
log_get_from_idx
(
l
,
1
)
->
num_nodes
);
log_mark_node_has_committed
(
l
,
1
);
CuAssertTrue
(
tc
,
1
==
log_get_from_idx
(
l
,
1
)
->
num_nodes
);
CuAssertTrue
(
tc
,
1
==
log_get_from_idx
(
l
,
1
)
->
num_nodes
);
log_mark_node_has_committed
(
l
,
1
);
CuAssertTrue
(
tc
,
2
==
log_get_from_idx
(
l
,
1
)
->
num_nodes
);
CuAssertTrue
(
tc
,
2
==
log_get_from_idx
(
l
,
1
)
->
num_nodes
);
}
void
TestLog_delete
(
CuTest
*
tc
)
...
...
@@ -89,15 +89,15 @@ void TestLog_delete(CuTest * tc)
CuAssertTrue
(
tc
,
1
==
log_append_entry
(
l
,
&
e3
));
CuAssertTrue
(
tc
,
3
==
log_count
(
l
));
log_delete
(
l
,
3
);
log_delete
(
l
,
3
);
CuAssertTrue
(
tc
,
2
==
log_count
(
l
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
3
));
log_delete
(
l
,
2
);
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
3
));
log_delete
(
l
,
2
);
CuAssertTrue
(
tc
,
1
==
log_count
(
l
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
2
));
log_delete
(
l
,
1
);
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
2
));
log_delete
(
l
,
1
);
CuAssertTrue
(
tc
,
0
==
log_count
(
l
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
1
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
1
));
}
void
TestLog_delete_onwards
(
CuTest
*
tc
)
...
...
@@ -115,11 +115,11 @@ void TestLog_delete_onwards(CuTest * tc)
CuAssertTrue
(
tc
,
3
==
log_count
(
l
));
/* even 3 gets deleted */
log_delete
(
l
,
2
);
log_delete
(
l
,
2
);
CuAssertTrue
(
tc
,
1
==
log_count
(
l
));
CuAssertTrue
(
tc
,
e1
.
id
==
log_get_from_idx
(
l
,
1
)
->
id
);
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
2
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
3
));
CuAssertTrue
(
tc
,
e1
.
id
==
log_get_from_idx
(
l
,
1
)
->
id
);
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
2
));
CuAssertTrue
(
tc
,
NULL
==
log_get_from_idx
(
l
,
3
));
}
void
TestLog_peektail
(
CuTest
*
tc
)
...
...
tests/test_server.c
View file @
2a50ff78
This diff is collapsed.
Click to expand it.
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