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
1b2a7e22
Commit
1b2a7e22
authored
Feb 02, 2015
by
Willem Thiart
Browse files
Made AppendEntries easier
parent
5e9e46ec
Changes
8
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
1b2a7e22
...
...
@@ -155,20 +155,6 @@ typedef int (
msg_appendentries_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
* @param node The peer's ID that we are sending this message to
* @return 0 on error */
typedef
int
(
*
func_send_appendentries_response_f
)
(
raft_server_t
*
raft
,
void
*
udata
,
int
node
,
msg_appendentries_response_t
*
msg
);
/**
* @param raft The Raft server making this callback
* @param udata User data that is passed from Raft server
...
...
@@ -230,7 +216,6 @@ typedef struct
func_send_requestvote_f
send_requestvote
;
func_send_requestvote_response_f
send_requestvote_response
;
func_send_appendentries_f
send_appendentries
;
func_send_appendentries_response_f
send_appendentries_response
;
func_send_entries_f
send_entries
;
func_send_entries_response_f
send_entries_response
;
func_log_f
log
;
...
...
@@ -302,9 +287,11 @@ int raft_periodic(raft_server_t* me, int msec_elapsed);
* Receive an appendentries message
* @param node Index of the node who sent us this message
* @param ae The appendentries message
* @param[out] r The resulting response
* @return 0 on error */
int
raft_recv_appendentries
(
raft_server_t
*
me
,
int
node
,
msg_appendentries_t
*
ae
);
msg_appendentries_t
*
ae
,
msg_appendentries_response_t
*
r
);
/**
* Receive a response from an appendentries message we sent
...
...
src/raft_log.c
View file @
1b2a7e22
/**
* Copyright (c) 2013, Willem-Hendrik Thiart
* Use of this source code is governed by a BSD-style license that can be
...
...
@@ -38,9 +37,7 @@ typedef struct
raft_entry_t
*
entries
;
}
log_private_t
;
static
void
__ensurecapacity
(
log_private_t
*
me
)
static
void
__ensurecapacity
(
log_private_t
*
me
)
{
int
i
,
j
;
raft_entry_t
*
temp
;
...
...
@@ -68,9 +65,7 @@ static void __ensurecapacity(
log_t
*
log_new
()
{
log_private_t
*
me
;
me
=
calloc
(
1
,
sizeof
(
log_private_t
));
log_private_t
*
me
=
calloc
(
1
,
sizeof
(
log_private_t
));
me
->
size
=
INITIAL_CAPACITY
;
me
->
count
=
0
;
me
->
back
=
in
(
me
)
->
front
=
0
;
...
...
@@ -113,8 +108,7 @@ raft_entry_t* log_get_from_idx(log_t* me_, int idx)
int
log_count
(
log_t
*
me_
)
{
log_private_t
*
me
=
(
void
*
)
me_
;
return
me
->
count
;
return
((
log_private_t
*
)
me_
)
->
count
;
}
void
log_delete
(
log_t
*
me_
,
int
idx
)
...
...
@@ -200,4 +194,3 @@ void log_mark_node_has_committed(log_t* me_, int idx)
if
((
e
=
log_get_from_idx
(
me_
,
idx
)))
e
->
num_nodes
+=
1
;
}
src/raft_node.c
View file @
1b2a7e22
/**
* Copyright (c) 2013, Willem-Hendrik Thiart
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
* found in the LICENSE file.
*
* @file
* @brief Representation of a peer
...
...
@@ -17,7 +16,8 @@
#include "raft.h"
typedef
struct
{
typedef
struct
{
void
*
udata
;
int
next_idx
;
}
raft_node_private_t
;
...
...
@@ -25,7 +25,7 @@ typedef struct {
raft_node_t
*
raft_node_new
(
void
*
udata
)
{
raft_node_private_t
*
me
;
me
=
calloc
(
1
,
sizeof
(
raft_node_private_t
));
me
=
calloc
(
1
,
sizeof
(
raft_node_private_t
));
me
->
udata
=
udata
;
return
(
void
*
)
me
;
}
...
...
src/raft_server.c
View file @
1b2a7e22
/**
* Copyright (c) 2013, Willem-Hendrik Thiart
* Use of this source code is governed by a BSD-style license that can be
...
...
@@ -22,7 +21,6 @@
#include "raft_log.h"
#include "raft_private.h"
static
void
__log
(
raft_server_t
*
me_
,
const
char
*
fmt
,
...)
{
char
buf
[
1024
];
...
...
@@ -223,16 +221,17 @@ int raft_recv_appendentries_response(raft_server_t* me_,
int
raft_recv_appendentries
(
raft_server_t
*
me_
,
const
int
node
,
msg_appendentries_t
*
ae
)
msg_appendentries_t
*
ae
,
msg_appendentries_response_t
*
r
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
msg_appendentries_response_t
r
;
me
->
timeout_elapsed
=
0
;
__log
(
me_
,
"received appendentries from: %d"
,
node
);
r
.
term
=
me
->
current_term
;
r
->
term
=
me
->
current_term
;
/* we've found a leader who is legitimate */
if
(
raft_is_leader
(
me_
)
&&
me
->
current_term
<=
ae
->
term
)
...
...
@@ -242,8 +241,8 @@ int raft_recv_appendentries(
if
(
ae
->
term
<
me
->
current_term
)
{
__log
(
me_
,
"AE term is less than current term"
);
r
.
success
=
0
;
goto
done
;
r
->
success
=
0
;
return
1
;
}
#if 0
...
...
@@ -251,8 +250,8 @@ int raft_recv_appendentries(
ae->prev_log_idx < raft_get_current_idx(me_))
{
__log(me_, "AE prev_idx is less than current idx");
r
.
success = 0;
goto done
;
r
->
success = 0;
return 1
;
}
#endif
...
...
@@ -263,13 +262,13 @@ int raft_recv_appendentries(
if
((
e
=
raft_get_entry_from_idx
(
me_
,
ae
->
prev_log_idx
)))
{
/* 2. Reply false if log doesn
t contain an entry at prevLogIndex
/* 2. Reply false if log doesn
'
t contain an entry at prevLogIndex
whose term matches prevLogTerm (§5.3) */
if
(
e
->
term
!=
ae
->
prev_log_term
)
{
__log
(
me_
,
"AE term doesn't match prev_idx"
);
r
.
success
=
0
;
goto
done
;
r
->
success
=
0
;
return
1
;
}
/* 3. If an existing entry conflicts with a new one (same index
...
...
@@ -282,9 +281,8 @@ int raft_recv_appendentries(
else
{
__log
(
me_
,
"AE no log at prev_idx"
);
r
.
success
=
0
;
goto
done
;
//assert(0);
r
->
success
=
0
;
return
1
;
}
}
...
...
@@ -328,18 +326,14 @@ int raft_recv_appendentries(
if
(
0
==
raft_append_entry
(
me_
,
c
))
{
__log
(
me_
,
"AE failure; couldn't append entry"
);
r
.
success
=
0
;
goto
done
;
r
->
success
=
0
;
return
1
;
}
}
r
.
success
=
1
;
r
.
current_idx
=
raft_get_current_idx
(
me_
);
r
.
first_idx
=
ae
->
prev_log_idx
+
1
;
done:
if
(
me
->
cb
.
send_appendentries_response
)
me
->
cb
.
send_appendentries_response
(
me_
,
me
->
udata
,
node
,
&
r
);
r
->
success
=
1
;
r
->
current_idx
=
raft_get_current_idx
(
me_
);
r
->
first_idx
=
ae
->
prev_log_idx
+
1
;
return
1
;
}
...
...
@@ -571,29 +565,3 @@ void raft_vote(raft_server_t* me_, int node)
raft_server_private_t
*
me
=
(
void
*
)
me_
;
me
->
voted_for
=
node
;
}
raft_node_t
*
raft_get_node
(
raft_server_t
*
me_
,
int
nodeid
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
if
(
nodeid
<
0
||
me
->
num_nodes
<=
nodeid
)
return
NULL
;
return
me
->
nodes
[
nodeid
];
}
int
raft_is_follower
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
}
int
raft_is_leader
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_LEADER
;
}
int
raft_is_candidate
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_CANDIDATE
;
}
/*--------------------------------------------------------------79-characters-*/
src/raft_server_properties.c
View file @
1b2a7e22
/**
* Copyright (c) 2013, Willem-Hendrik Thiart
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
* found in the LICENSE file.
*
* @file
* @author Willem Thiart himself@willemthiart.com
...
...
@@ -53,7 +52,6 @@ int raft_get_num_nodes(raft_server_t* me_)
return
((
raft_server_private_t
*
)
me_
)
->
num_nodes
;
}
int
raft_get_timeout_elapsed
(
raft_server_t
*
me_
)
{
return
((
raft_server_private_t
*
)
me_
)
->
timeout_elapsed
;
...
...
@@ -130,3 +128,26 @@ int raft_get_state(raft_server_t* me_)
return
((
raft_server_private_t
*
)
me_
)
->
state
;
}
raft_node_t
*
raft_get_node
(
raft_server_t
*
me_
,
int
nodeid
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
if
(
nodeid
<
0
||
me
->
num_nodes
<=
nodeid
)
return
NULL
;
return
me
->
nodes
[
nodeid
];
}
int
raft_is_follower
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_FOLLOWER
;
}
int
raft_is_leader
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_LEADER
;
}
int
raft_is_candidate
(
raft_server_t
*
me_
)
{
return
raft_get_state
(
me_
)
==
RAFT_STATE_CANDIDATE
;
}
tests/mock_send_functions.c
View file @
1b2a7e22
...
...
@@ -16,13 +16,15 @@
#include "raft.h"
typedef
struct
{
typedef
struct
{
void
*
outbox
;
void
*
inbox
;
void
*
raft
;
}
sender_t
;
typedef
struct
{
typedef
struct
{
void
*
data
;
int
len
;
/* what type of message is it? */
...
...
@@ -40,43 +42,14 @@ void senders_new()
__nsenders
=
0
;
}
#if 0
int sender_send(raft_server_t* raft,
void* udata,
int peer,
raft_message_type_e type,
const unsigned char* data,
int len)
{
sender_t* me = udata;
msg_t* m;
m = malloc(sizeof(msg_t));
m->type = type;
m->len = len;
m->data = malloc(len);
m->sender = raft_get_nodeid(raft);
memcpy(m->data,data,len);
llqueue_offer(me->outbox,m);
if (__nsenders > peer)
{
llqueue_offer(__senders[peer]->inbox, m);
}
return 0;
}
#endif
int
__append_msg
(
static
int
__append_msg
(
sender_t
*
me
,
void
*
data
,
int
type
,
int
len
,
int
peer
,
raft_server_t
*
raft
)
)
{
msg_t
*
m
;
m
=
malloc
(
sizeof
(
msg_t
));
...
...
@@ -84,71 +57,72 @@ int __append_msg(
m
->
len
=
len
;
m
->
data
=
malloc
(
len
);
m
->
sender
=
raft_get_nodeid
(
raft
);
memcpy
(
m
->
data
,
data
,
len
);
llqueue_offer
(
me
->
outbox
,
m
);
memcpy
(
m
->
data
,
data
,
len
);
llqueue_offer
(
me
->
outbox
,
m
);
if
(
__nsenders
>
peer
)
{
llqueue_offer
(
__senders
[
peer
]
->
inbox
,
m
);
}
return
1
;
}
int
sender_requestvote
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_requestvote_t
*
msg
)
void
*
udata
,
int
peer
,
msg_requestvote_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_REQUESTVOTE
,
sizeof
(
*
msg
),
peer
,
raft
);
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_REQUESTVOTE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_requestvote_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_requestvote_response_t
*
msg
)
void
*
udata
,
int
peer
,
msg_requestvote_response_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_REQUESTVOTE_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_REQUESTVOTE_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_appendentries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_t
*
msg
)
void
*
udata
,
int
peer
,
msg_appendentries_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES
,
sizeof
(
*
msg
),
peer
,
raft
);
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_appendentries_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_appendentries_response_t
*
msg
)
void
*
udata
,
int
peer
,
msg_appendentries_response_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_APPENDENTRIES_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_entries
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_entry_t
*
msg
)
void
*
udata
,
int
peer
,
msg_entry_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_ENTRY
,
sizeof
(
*
msg
),
peer
,
raft
);
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_ENTRY
,
sizeof
(
*
msg
),
peer
,
raft
);
}
int
sender_entries_response
(
raft_server_t
*
raft
,
void
*
udata
,
int
peer
,
msg_entry_response_t
*
msg
)
void
*
udata
,
int
peer
,
msg_entry_response_t
*
msg
)
{
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_ENTRY_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
return
__append_msg
(
udata
,
msg
,
RAFT_MSG_ENTRY_RESPONSE
,
sizeof
(
*
msg
),
peer
,
raft
);
}
void
*
sender_new
(
void
*
address
)
{
sender_t
*
me
;
me
=
malloc
(
sizeof
(
sender_t
));
sender_t
*
me
=
malloc
(
sizeof
(
sender_t
));
me
->
outbox
=
llqueue_new
();
me
->
inbox
=
llqueue_new
();
__senders
=
realloc
(
__senders
,
sizeof
(
sender_t
*
)
*
(
++
__nsenders
));
__senders
[
__nsenders
-
1
]
=
me
;
__senders
=
realloc
(
__senders
,
sizeof
(
sender_t
*
)
*
(
++
__nsenders
));
__senders
[
__nsenders
-
1
]
=
me
;
return
me
;
}
void
*
sender_poll_msg_data
(
void
*
s
)
{
sender_t
*
me
=
s
;
msg_t
*
msg
;
msg
=
llqueue_poll
(
me
->
outbox
);
msg_t
*
msg
=
llqueue_poll
(
me
->
outbox
);
return
NULL
!=
msg
?
msg
->
data
:
NULL
;
}
...
...
@@ -174,26 +148,31 @@ void sender_poll_msgs(void* s)
{
switch
(
m
->
type
)
{
case
RAFT_MSG_APPENDENTRIES
:
raft_recv_appendentries
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_APPENDENTRIES_RESPONSE
:
raft_recv_appendentries_response
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_REQUESTVOTE
:
raft_recv_requestvote
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_REQUESTVOTE_RESPONSE
:
raft_recv_requestvote_response
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_ENTRY
:
raft_recv_entry
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_ENTRY_RESPONSE
:
//raft_recv_entry_response(me->raft, m->sender, m->data);
break
;
case
RAFT_MSG_APPENDENTRIES
:
{
msg_appendentries_response_t
response
;
raft_recv_appendentries
(
me
->
raft
,
m
->
sender
,
m
->
data
,
&
response
);
__append_msg
(
me
,
&
response
,
RAFT_MSG_APPENDENTRIES_RESPONSE
,
sizeof
(
response
),
m
->
sender
,
me
->
raft
);
}
break
;
case
RAFT_MSG_APPENDENTRIES_RESPONSE
:
raft_recv_appendentries_response
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_REQUESTVOTE
:
raft_recv_requestvote
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_REQUESTVOTE_RESPONSE
:
raft_recv_requestvote_response
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_ENTRY
:
raft_recv_entry
(
me
->
raft
,
m
->
sender
,
m
->
data
);
break
;
case
RAFT_MSG_ENTRY_RESPONSE
:
#if 0
raft_recv_entry_response(me->raft, m->sender, m->data);
#endif
break
;
}
}
}
tests/test_scenario.c
View file @
1b2a7e22
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
...
...
@@ -14,56 +13,58 @@
void
TestRaft_scenario_leader_appears
(
CuTest
*
tc
)
{
int
i
,
j
;
int
i
,
j
;
raft_server_t
*
r
[
3
];
void
*
sender
[
3
];
raft_node_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),(
void
*
)
3
},
{(
-
1
),
NULL
}};
{
(
-
1
),
(
void
*
)
1
},
{
(
-
1
),
(
void
*
)
2
},
{
(
-
1
),
(
void
*
)
3
},
{
(
-
1
),
NULL
}
};
senders_new
();
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
{
r
[
j
]
=
raft_new
();
sender
[
j
]
=
sender_new
(
cfg
[
j
].
udata_address
);
sender_set_raft
(
sender
[
j
],
r
[
j
]);
raft_set_election_timeout
(
r
[
j
],
500
);
raft_set_configuration
(
r
[
j
],
cfg
,
j
);
raft_set_callbacks
(
r
[
j
],
&
((
raft_cbs_t
)
{
.
send_requestvote
=
sender_requestvote
,
.
send_requestvote_response
=
sender_requestvote_response
,
.
send_appendentries
=
sender_appendentries
,
.
send_appendentries_response
=
sender_appendentries_response
,
.
send_entries
=
sender_entries
,
.
send_entries_response
=
sender_entries_response
,
.
log
=
NULL
}),
sender
[
j
]);
raft_set_configuration
(
r
[
j
],
cfg
,
j
);
raft_set_callbacks
(
r
[
j
],
&
((
raft_cbs_t
)
{
.
send_requestvote
=
sender_requestvote
,
.
send_requestvote_response
=
sender_requestvote_response
,
.
send_appendentries
=
sender_appendentries
,
.
send_entries
=
sender_entries
,
.
send_entries_response
=
sender_entries_response
,
.
log
=
NULL
}),
sender
[
j
]);
}
for
(
i
=
0
;
i
<
20
;
i
++
)
for
(
i
=
0
;
i
<
20
;
i
++
)
{
one_more_time:
one_more_time:
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
sender_poll_msgs
(
sender
[
j
]);
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
if
(
sender_msgs_available
(
sender
[
j
]))
goto
one_more_time
;
goto
one_more_time
;
for
(
j
=
0
;
j
<
3
;
j
++
)
for
(
j
=
0
;
j
<
3
;
j
++
)
raft_periodic
(
r
[
j
],
100
);
}
int
leaders
=
0
;
for
(
j
=
0
;
j
<
3
;
j
++
)
{
for
(
j
=
0
;
j
<
3
;
j
++
)
if
(
raft_is_leader
(
r
[
j
]))
leaders
+=
1
;
}
CuAssertTrue
(
tc
,
0
!=
leaders
);
CuAssertTrue
(
tc
,
1
==
leaders
);
...
...
tests/test_server.c
View file @
1b2a7e22
...
...
@@ -531,11 +531,10 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
aer
;
/* 2 nodes */
raft_node_configuration_t
cfg
[]
=
{
...
...
@@ -556,12 +555,10 @@ TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(
/* higher current term */
raft_set_current_term
(
r
,
5
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
/* response is false */
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
0
==
aer
->
success
);
CuAssertTrue
(
tc
,
0
==
aer
.
success
);
}
/* TODO: check if test case is needed */
...
...
@@ -572,10 +569,9 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
void
*
r
;
void
*
sender
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
aer
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -601,10 +597,8 @@ TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(
ae
.
term
=
2
;
/* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries
(
r
,
1
,
&
ae
);
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
1
==
aer
->
success
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
/* term has been updated */
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
}
...
...
@@ -615,6 +609,7 @@ void TestRaft_follower_doesnt_log_after_appendentry_if_no_entries_are_specified(
void
*
r
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
/* 2 nodes */
raft_node_configuration_t
cfg
[]
=
{
...
...
@@ -639,7 +634,7 @@ void TestRaft_follower_doesnt_log_after_appendentry_if_no_entries_are_specified(
ae
.
leader_commit
=
5
;
ae
.
n_entries
=
0
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
}
...
...
@@ -649,11 +644,10 @@ void TestRaft_follower_increases_log_after_appendentry(CuTest * tc)
void
*
sender
;
msg_appendentries_t
ae
;
msg_entry_t
ety
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
aer
;
char
*
str
=
"aaa"
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -689,10 +683,8 @@ void TestRaft_follower_increases_log_after_appendentry(CuTest * tc)
ae
.
entries
=
&
ety
;
ae
.
n_entries
=
1
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
1
==
aer
->
success
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
}
...
...
@@ -706,7 +698,6 @@ TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_
msg_entry_t
ety
;
char
*
str
=
"aaa"
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
/* 2 nodes */
...
...
@@ -717,7 +708,7 @@ TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_
};
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
aer
;
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
...
...
@@ -745,12 +736,10 @@ TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_
ae
.
n_entries
=
1
;
/* trigger reply */
raft_recv_appendentries
(
r
,
1
,
&
ae
);
aer
=
sender_poll_msg_data
(
sender
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
/* reply is false */
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
0
==
aer
->
success
);
CuAssertTrue
(
tc
,
0
==
aer
.
success
);
}
/* 5.3 */
...
...
@@ -761,11 +750,10 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
void
*
r
;
void
*
sender
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
aer
;
raft_entry_t
*
ety_appended
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -821,10 +809,8 @@ TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
ae
.
entries
=
&
mety
;
ae
.
n_entries
=
1
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
1
==
aer
->
success
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
NULL
!=
(
ety_appended
=
raft_get_entry_from_idx
(
r
,
1
)));
CuAssertTrue
(
tc
,
!
strncmp
(
ety_appended
->
data
,
str1
,
3
));
...
...
@@ -836,7 +822,6 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -855,6 +840,8 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
ae
.
prev_log_idx
=
0
;
...
...
@@ -866,12 +853,9 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
e
[
1
].
id
=
2
;
ae
.
entries
=
e
;
ae
.
n_entries
=
2
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
msg_appendentries_response_t
*
aer
;
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
1
==
aer
->
success
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
CuAssertTrue
(
tc
,
2
==
raft_get_log_count
(
r
));
}
...
...
@@ -883,7 +867,6 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -900,6 +883,8 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
ae
.
prev_log_idx
=
0
;
...
...
@@ -913,7 +898,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
e
[
3
].
id
=
4
;
ae
.
entries
=
e
;
ae
.
n_entries
=
4
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
/* receive an appendentry with commit */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
...
@@ -922,12 +907,9 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(
ae
.
prev_log_idx
=
4
;
ae
.
leader_commit
=
5
;
/* receipt of appendentries changes commit idx */
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
msg_appendentries_response_t
*
aer
;
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
1
==
aer
->
success
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
/* set to 4 because commitIDX is lower */
CuAssertTrue
(
tc
,
4
==
raft_get_commit_idx
(
r
));
}
...
...
@@ -938,7 +920,6 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
void
*
r
;
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
...
...
@@ -955,6 +936,8 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
raft_set_callbacks
(
r
,
&
funcs
,
sender
);
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
ae
.
prev_log_idx
=
0
;
...
...
@@ -968,7 +951,7 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
e
[
3
].
id
=
4
;
ae
.
entries
=
e
;
ae
.
n_entries
=
4
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
/* receive an appendentry with commit */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
...
@@ -977,12 +960,9 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_LeaderCommit(
ae
.
prev_log_idx
=
3
;
ae
.
leader_commit
=
3
;
/* receipt of appendentries changes commit idx */
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
msg_appendentries_response_t
*
aer
;
aer
=
sender_poll_msg_data
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
aer
);
CuAssertTrue
(
tc
,
1
==
aer
->
success
);
CuAssertTrue
(
tc
,
1
==
aer
.
success
);
/* set to 3 because leaderCommit is lower */
CuAssertTrue
(
tc
,
3
==
raft_get_commit_idx
(
r
));
}
...
...
@@ -1122,9 +1102,11 @@ void TestRaft_follower_receiving_appendentries_resets_election_timeout(
raft_periodic
(
r
,
900
);
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
0
==
raft_get_timeout_elapsed
(
r
));
}
...
...
@@ -1358,9 +1340,11 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(
/* receive recent appendentries */
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
...
...
@@ -1383,6 +1367,7 @@ TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follow
};
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
...
...
@@ -1404,7 +1389,7 @@ TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follow
ae
.
prev_log_term
=
1
;
/* appendentry from invalid leader doesn't make candidate become follower */
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
raft_is_candidate
(
r
));
}
...
...
@@ -1690,7 +1675,6 @@ TestRaft_leader_increase_commit_idx_when_majority_have_entry_and_atleast_one_new
void
*
sender
;
raft_cbs_t
funcs
=
{
.
send_appendentries
=
sender_appendentries
,
.
send_appendentries_response
=
sender_appendentries_response
,
.
log
=
NULL
};
msg_appendentries_response_t
aer
;
...
...
@@ -1777,6 +1761,7 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(
};
msg_appendentries_t
ae
;
msg_appendentries_response_t
aer
;
sender
=
sender_new
(
NULL
);
r
=
raft_new
();
...
...
@@ -1791,7 +1776,7 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(
ae
.
term
=
5
;
ae
.
prev_log_idx
=
6
;
ae
.
prev_log_term
=
5
;
raft_recv_appendentries
(
r
,
1
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
,
&
aer
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
...
...
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