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
ba31349d
"vscode:/vscode.git/clone" did not exist on "4faddf18ca8ca3adb93cf1e4e620be9eaf0f6bf4"
Unverified
Commit
ba31349d
authored
Aug 19, 2021
by
Ozan Tezcan
Committed by
GitHub
Aug 19, 2021
Browse files
Code refactor (#39)
code refactor
parent
676c73d2
Changes
7
Hide whitespace changes
Inline
Side-by-side
include/raft.h
View file @
ba31349d
...
@@ -30,7 +30,7 @@ typedef enum {
...
@@ -30,7 +30,7 @@ typedef enum {
#define RAFT_REQUESTVOTE_ERR_GRANTED 1
#define RAFT_REQUESTVOTE_ERR_GRANTED 1
#define RAFT_REQUESTVOTE_ERR_NOT_GRANTED 0
#define RAFT_REQUESTVOTE_ERR_NOT_GRANTED 0
#define RAFT_REQUESTVOTE_ERR_UNKNOWN_NODE -1
#define RAFT_REQUESTVOTE_ERR_UNKNOWN_NODE
(
-1
)
typedef
enum
{
typedef
enum
{
RAFT_STATE_NONE
,
RAFT_STATE_NONE
,
...
@@ -628,7 +628,7 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
...
@@ -628,7 +628,7 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
/** De-initialise Raft server.
/** De-initialise Raft server.
* Frees all memory */
* Frees all memory */
void
raft_
free
(
raft_server_t
*
me
);
void
raft_
destroy
(
raft_server_t
*
me
_
);
/** De-initialise Raft server. */
/** De-initialise Raft server. */
void
raft_clear
(
raft_server_t
*
me
);
void
raft_clear
(
raft_server_t
*
me
);
...
@@ -660,8 +660,6 @@ void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* user_data);
...
@@ -660,8 +660,6 @@ void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* user_data);
* NULL if the node already exists */
* NULL if the node already exists */
raft_node_t
*
raft_add_node
(
raft_server_t
*
me
,
void
*
user_data
,
raft_node_id_t
id
,
int
is_self
);
raft_node_t
*
raft_add_node
(
raft_server_t
*
me
,
void
*
user_data
,
raft_node_id_t
id
,
int
is_self
);
#define raft_add_peer raft_add_node
/** Add a node which does not participate in voting.
/** Add a node which does not participate in voting.
* If a node already exists the call will fail.
* If a node already exists the call will fail.
* Parameters are identical to raft_add_node
* Parameters are identical to raft_add_node
...
@@ -846,6 +844,13 @@ void* raft_node_get_udata(raft_node_t* me);
...
@@ -846,6 +844,13 @@ void* raft_node_get_udata(raft_node_t* me);
* Set this node's user data */
* Set this node's user data */
void
raft_node_set_udata
(
raft_node_t
*
me
,
void
*
user_data
);
void
raft_node_set_udata
(
raft_node_t
*
me
,
void
*
user_data
);
/**
* After sending the snapshot, user can set the next index for the node
*
* @param[in] node node
* @param[in] idx next entry index */
void
raft_node_set_next_idx
(
raft_node_t
*
me
,
raft_index_t
idx
);
/**
/**
* @param[in] idx The entry's index
* @param[in] idx The entry's index
* @return entry from index */
* @return entry from index */
...
@@ -854,13 +859,13 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me, raft_index_t idx);
...
@@ -854,13 +859,13 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me, raft_index_t idx);
/**
/**
* @param[in] node The node's ID
* @param[in] node The node's ID
* @return node pointed to by node ID */
* @return node pointed to by node ID */
raft_node_t
*
raft_get_node
(
raft_server_t
*
me_
,
const
raft_node_id_t
id
);
raft_node_t
*
raft_get_node
(
raft_server_t
*
me_
,
raft_node_id_t
id
);
/**
/**
* Used for iterating through nodes
* Used for iterating through nodes
* @param[in] node The node's idx
* @param[in] node The node's idx
* @return node pointed to by node idx */
* @return node pointed to by node idx */
raft_node_t
*
raft_get_node_from_idx
(
raft_server_t
*
me_
,
const
raft_index_t
idx
);
raft_node_t
*
raft_get_node_from_idx
(
raft_server_t
*
me_
,
raft_index_t
idx
);
/**
/**
* @return number of votes this server has received this election */
* @return number of votes this server has received this election */
...
@@ -896,14 +901,14 @@ int raft_vote(raft_server_t* me_, raft_node_t* node);
...
@@ -896,14 +901,14 @@ int raft_vote(raft_server_t* me_, raft_node_t* node);
* @param[in] nodeid The server to vote for by nodeid
* @param[in] nodeid The server to vote for by nodeid
* @return
* @return
* 0 on success */
* 0 on success */
int
raft_vote_for_nodeid
(
raft_server_t
*
me_
,
const
raft_node_id_t
nodeid
);
int
raft_vote_for_nodeid
(
raft_server_t
*
me_
,
raft_node_id_t
nodeid
);
/** Set the current term.
/** Set the current term.
* This should be used to reload persistent state, ie. the current_term field.
* This should be used to reload persistent state, ie. the current_term field.
* @param[in] term The new current term
* @param[in] term The new current term
* @return
* @return
* 0 on success */
* 0 on success */
int
raft_set_current_term
(
raft_server_t
*
me
,
const
raft_term_t
term
);
int
raft_set_current_term
(
raft_server_t
*
me
,
raft_term_t
term
);
/** Set the commit idx.
/** Set the commit idx.
* This should be used to reload persistent state, ie. the commit_idx field.
* This should be used to reload persistent state, ie. the commit_idx field.
...
...
include/raft_log.h
View file @
ba31349d
...
@@ -43,7 +43,7 @@ int log_poll(log_t * me_, void** etyp);
...
@@ -43,7 +43,7 @@ int log_poll(log_t * me_, void** etyp);
/** Get an array of entries from this index onwards.
/** Get an array of entries from this index onwards.
* This is used for batching.
* This is used for batching.
*/
*/
raft_entry_t
**
log_get_from_idx
(
log_t
*
me_
,
raft_index_t
idx
,
int
*
n_etys
);
raft_entry_t
**
log_get_from_idx
(
log_t
*
me_
,
raft_index_t
idx
,
long
*
n_etys
);
raft_entry_t
*
log_get_at_idx
(
log_t
*
me_
,
raft_index_t
idx
);
raft_entry_t
*
log_get_at_idx
(
log_t
*
me_
,
raft_index_t
idx
);
...
...
include/raft_private.h
View file @
ba31349d
...
@@ -134,29 +134,17 @@ int raft_send_appendentries_all(raft_server_t* me_);
...
@@ -134,29 +134,17 @@ int raft_send_appendentries_all(raft_server_t* me_);
* @return 1 if entry committed, 0 otherwise */
* @return 1 if entry committed, 0 otherwise */
int
raft_apply_entry
(
raft_server_t
*
me_
);
int
raft_apply_entry
(
raft_server_t
*
me_
);
/**
* Appends entry using the current term.
* Note: we make the assumption that current term is up-to-date
* @return 0 if unsuccessful */
int
raft_append_entry
(
raft_server_t
*
me_
,
raft_entry_t
*
c
);
void
raft_set_last_applied_idx
(
raft_server_t
*
me
,
raft_index_t
idx
);
void
raft_set_last_applied_idx
(
raft_server_t
*
me
,
raft_index_t
idx
);
void
raft_set_state
(
raft_server_t
*
me_
,
int
state
);
void
raft_set_state
(
raft_server_t
*
me_
,
int
state
);
int
raft_get_state
(
raft_server_t
*
me_
);
raft_node_t
*
raft_node_new
(
void
*
udata
,
raft_node_id_t
id
);
raft_node_t
*
raft_node_new
(
void
*
udata
,
raft_node_id_t
id
);
void
raft_node_free
(
raft_node_t
*
me_
);
void
raft_node_free
(
raft_node_t
*
me_
);
void
raft_node_set_
next
_idx
(
raft_node_t
*
node
,
raft_index_t
nextI
dx
);
void
raft_node_set_
match
_idx
(
raft_node_t
*
node
,
raft_index_t
i
dx
);
void
raft_node_set_match_idx
(
raft_node_t
*
node
,
raft_index_t
matchIdx
);
void
raft_node_vote_for_me
(
raft_node_t
*
me_
,
int
vote
);
raft_index_t
raft_node_get_match_idx
(
raft_node_t
*
me_
);
void
raft_node_vote_for_me
(
raft_node_t
*
me_
,
const
int
vote
);
int
raft_node_has_vote_for_me
(
raft_node_t
*
me_
);
int
raft_node_has_vote_for_me
(
raft_node_t
*
me_
);
...
@@ -164,32 +152,18 @@ void raft_node_set_has_sufficient_logs(raft_node_t* me_);
...
@@ -164,32 +152,18 @@ void raft_node_set_has_sufficient_logs(raft_node_t* me_);
int
raft_is_single_node_voting_cluster
(
raft_server_t
*
me_
);
int
raft_is_single_node_voting_cluster
(
raft_server_t
*
me_
);
int
raft_votes_is_majority
(
const
int
nnodes
,
const
int
nvotes
);
int
raft_votes_is_majority
(
int
nnodes
,
int
nvotes
);
void
raft_handle_append_cfg_change
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
const
raft_index_t
idx
);
void
raft_handle_remove_cfg_change
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
const
raft_index_t
idx
);
raft_index_t
raft_get_num_snapshottable_logs
(
raft_server_t
*
me_
);
raft_index_t
raft_get_num_snapshottable_logs
(
raft_server_t
*
me_
);
int
raft_node_is_active
(
raft_node_t
*
me_
);
void
raft_node_set_voting_committed
(
raft_node_t
*
me_
,
int
voting
);
void
raft_node_set_addition_committed
(
raft_node_t
*
me_
,
int
committed
);
void
raft_node_set_last_ack
(
raft_node_t
*
me_
,
raft_msg_id_t
msgid
,
raft_term_t
term
);
void
raft_node_set_last_ack
(
raft_node_t
*
me_
,
raft_msg_id_t
msgid
,
raft_term_t
term
);
raft_msg_id_t
raft_node_get_last_acked_msgid
(
raft_node_t
*
me_
);
raft_msg_id_t
raft_node_get_last_acked_msgid
(
raft_node_t
*
me_
);
raft_term_t
raft_node_get_last_acked_term
(
raft_node_t
*
me_
);
void
raft_process_read_queue
(
raft_server_t
*
me_
);
/* Heap functions */
/* Heap functions */
extern
void
*
(
*
__
raft_malloc
)(
size_t
size
);
extern
void
*
(
*
raft_malloc
)(
size_t
size
);
extern
void
*
(
*
__
raft_calloc
)(
size_t
nmemb
,
size_t
size
);
extern
void
*
(
*
raft_calloc
)(
size_t
nmemb
,
size_t
size
);
extern
void
*
(
*
__
raft_realloc
)(
void
*
ptr
,
size_t
size
);
extern
void
*
(
*
raft_realloc
)(
void
*
ptr
,
size_t
size
);
extern
void
(
*
__
raft_free
)(
void
*
ptr
);
extern
void
(
*
raft_free
)(
void
*
ptr
);
#endif
/* RAFT_PRIVATE_H_ */
#endif
/* RAFT_PRIVATE_H_ */
src/raft_log.c
View file @
ba31349d
...
@@ -8,9 +8,7 @@
...
@@ -8,9 +8,7 @@
* @author Willem Thiart himself@willemthiart.com
* @author Willem Thiart himself@willemthiart.com
*/
*/
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <assert.h>
#include "raft.h"
#include "raft.h"
...
@@ -55,7 +53,7 @@ static int __ensurecapacity(log_private_t * me)
...
@@ -55,7 +53,7 @@ static int __ensurecapacity(log_private_t * me)
if
(
me
->
count
<
me
->
size
)
if
(
me
->
count
<
me
->
size
)
return
0
;
return
0
;
temp
=
(
raft_entry_t
**
)
__
raft_calloc
(
1
,
sizeof
(
raft_entry_t
*
)
*
me
->
size
*
2
);
temp
=
raft_calloc
(
1
,
sizeof
(
raft_entry_t
*
)
*
me
->
size
*
2
);
if
(
!
temp
)
if
(
!
temp
)
return
RAFT_ERR_NOMEM
;
return
RAFT_ERR_NOMEM
;
...
@@ -67,7 +65,7 @@ static int __ensurecapacity(log_private_t * me)
...
@@ -67,7 +65,7 @@ static int __ensurecapacity(log_private_t * me)
}
}
/* clean up old entries */
/* clean up old entries */
__
raft_free
(
me
->
entries
);
raft_free
(
me
->
entries
);
me
->
size
*=
2
;
me
->
size
*=
2
;
me
->
entries
=
temp
;
me
->
entries
=
temp
;
...
@@ -89,14 +87,14 @@ int log_load_from_snapshot(log_t *me_, raft_index_t idx, raft_term_t term)
...
@@ -89,14 +87,14 @@ int log_load_from_snapshot(log_t *me_, raft_index_t idx, raft_term_t term)
log_t
*
log_alloc
(
raft_index_t
initial_size
)
log_t
*
log_alloc
(
raft_index_t
initial_size
)
{
{
log_private_t
*
me
=
(
log_private_t
*
)
__
raft_calloc
(
1
,
sizeof
(
log_private_t
));
log_private_t
*
me
=
raft_calloc
(
1
,
sizeof
(
log_private_t
));
if
(
!
me
)
if
(
!
me
)
return
NULL
;
return
NULL
;
me
->
size
=
initial_size
;
me
->
size
=
initial_size
;
log_clear
((
log_t
*
)
me
);
log_clear
((
log_t
*
)
me
);
me
->
entries
=
(
raft_entry_t
**
)
__
raft_calloc
(
1
,
sizeof
(
raft_entry_t
*
)
*
me
->
size
);
me
->
entries
=
raft_calloc
(
1
,
sizeof
(
raft_entry_t
*
)
*
me
->
size
);
if
(
!
me
->
entries
)
{
if
(
!
me
->
entries
)
{
__
raft_free
(
me
);
raft_free
(
me
);
return
NULL
;
return
NULL
;
}
}
return
(
log_t
*
)
me
;
return
(
log_t
*
)
me
;
...
@@ -167,7 +165,7 @@ int log_append_entry(log_t* me_, raft_entry_t* ety)
...
@@ -167,7 +165,7 @@ int log_append_entry(log_t* me_, raft_entry_t* ety)
return
0
;
return
0
;
}
}
raft_entry_t
**
log_get_from_idx
(
log_t
*
me_
,
raft_index_t
idx
,
int
*
n_etys
)
raft_entry_t
**
log_get_from_idx
(
log_t
*
me_
,
raft_index_t
idx
,
long
*
n_etys
)
{
{
log_private_t
*
me
=
(
log_private_t
*
)
me_
;
log_private_t
*
me
=
(
log_private_t
*
)
me_
;
raft_index_t
i
;
raft_index_t
i
;
...
@@ -185,14 +183,12 @@ raft_entry_t** log_get_from_idx(log_t* me_, raft_index_t idx, int *n_etys)
...
@@ -185,14 +183,12 @@ raft_entry_t** log_get_from_idx(log_t* me_, raft_index_t idx, int *n_etys)
i
=
(
me
->
front
+
idx
-
me
->
base
)
%
me
->
size
;
i
=
(
me
->
front
+
idx
-
me
->
base
)
%
me
->
size
;
int
logs_till_end_of_log
;
/* log entries until the end of the log */
if
(
i
<
me
->
back
)
if
(
i
<
me
->
back
)
logs_till_end_of_log
=
me
->
back
-
i
;
*
n_etys
=
me
->
back
-
i
;
else
else
logs_till_end_of_log
=
me
->
size
-
i
;
*
n_etys
=
me
->
size
-
i
;
*
n_etys
=
logs_till_end_of_log
;
return
&
me
->
entries
[
i
];
return
&
me
->
entries
[
i
];
}
}
...
@@ -312,8 +308,8 @@ void log_free(log_t * me_)
...
@@ -312,8 +308,8 @@ void log_free(log_t * me_)
{
{
log_private_t
*
me
=
(
log_private_t
*
)
me_
;
log_private_t
*
me
=
(
log_private_t
*
)
me_
;
__
raft_free
(
me
->
entries
);
raft_free
(
me
->
entries
);
__
raft_free
(
me
);
raft_free
(
me
);
}
}
raft_index_t
log_get_current_idx
(
log_t
*
me_
)
raft_index_t
log_get_current_idx
(
log_t
*
me_
)
...
@@ -378,7 +374,7 @@ static raft_entry_t *__log_get(void *log, raft_index_t idx)
...
@@ -378,7 +374,7 @@ static raft_entry_t *__log_get(void *log, raft_index_t idx)
static
int
__log_get_batch
(
void
*
log
,
raft_index_t
idx
,
int
entries_n
,
raft_entry_t
**
entries
)
static
int
__log_get_batch
(
void
*
log
,
raft_index_t
idx
,
int
entries_n
,
raft_entry_t
**
entries
)
{
{
int
n
,
i
;
long
n
,
i
;
raft_entry_t
**
r
=
log_get_from_idx
(
log
,
idx
,
&
n
);
raft_entry_t
**
r
=
log_get_from_idx
(
log
,
idx
,
&
n
);
if
(
!
r
||
n
<
1
)
{
if
(
!
r
||
n
<
1
)
{
...
@@ -392,7 +388,7 @@ static int __log_get_batch(void *log, raft_index_t idx, int entries_n, raft_entr
...
@@ -392,7 +388,7 @@ static int __log_get_batch(void *log, raft_index_t idx, int entries_n, raft_entr
entries
[
i
]
=
r
[
i
];
entries
[
i
]
=
r
[
i
];
raft_entry_hold
(
entries
[
i
]);
raft_entry_hold
(
entries
[
i
]);
}
}
return
n
;
return
(
int
)
n
;
}
}
static
int
__log_pop
(
void
*
log
,
raft_index_t
from_idx
,
func_entry_notify_f
cb
,
void
*
cb_arg
)
static
int
__log_pop
(
void
*
log
,
raft_index_t
from_idx
,
func_entry_notify_f
cb
,
void
*
cb_arg
)
...
...
src/raft_node.c
View file @
ba31349d
...
@@ -9,9 +9,7 @@
...
@@ -9,9 +9,7 @@
* @version 0.1
* @version 0.1
*/
*/
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <assert.h>
#include "raft.h"
#include "raft.h"
...
@@ -43,9 +41,11 @@ typedef struct
...
@@ -43,9 +41,11 @@ typedef struct
raft_node_t
*
raft_node_new
(
void
*
udata
,
raft_node_id_t
id
)
raft_node_t
*
raft_node_new
(
void
*
udata
,
raft_node_id_t
id
)
{
{
raft_node_private_t
*
me
;
raft_node_private_t
*
me
;
me
=
(
raft_node_private_t
*
)
__raft_calloc
(
1
,
sizeof
(
raft_node_private_t
));
me
=
raft_calloc
(
1
,
sizeof
(
raft_node_private_t
));
if
(
!
me
)
if
(
!
me
)
return
NULL
;
return
NULL
;
me
->
udata
=
udata
;
me
->
udata
=
udata
;
me
->
next_idx
=
1
;
me
->
next_idx
=
1
;
me
->
match_idx
=
0
;
me
->
match_idx
=
0
;
...
@@ -56,7 +56,7 @@ raft_node_t* raft_node_new(void* udata, raft_node_id_t id)
...
@@ -56,7 +56,7 @@ raft_node_t* raft_node_new(void* udata, raft_node_id_t id)
void
raft_node_free
(
raft_node_t
*
me_
)
void
raft_node_free
(
raft_node_t
*
me_
)
{
{
__
raft_free
(
me_
);
raft_free
(
me_
);
}
}
raft_index_t
raft_node_get_next_idx
(
raft_node_t
*
me_
)
raft_index_t
raft_node_get_next_idx
(
raft_node_t
*
me_
)
...
@@ -65,11 +65,11 @@ raft_index_t raft_node_get_next_idx(raft_node_t* me_)
...
@@ -65,11 +65,11 @@ raft_index_t raft_node_get_next_idx(raft_node_t* me_)
return
me
->
next_idx
;
return
me
->
next_idx
;
}
}
void
raft_node_set_next_idx
(
raft_node_t
*
me_
,
raft_index_t
nextI
dx
)
void
raft_node_set_next_idx
(
raft_node_t
*
me_
,
raft_index_t
i
dx
)
{
{
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
/* log index begins at 1 */
/* log index begins at 1 */
me
->
next_idx
=
nextI
dx
<
1
?
1
:
nextI
dx
;
me
->
next_idx
=
i
dx
<
1
?
1
:
i
dx
;
}
}
raft_index_t
raft_node_get_match_idx
(
raft_node_t
*
me_
)
raft_index_t
raft_node_get_match_idx
(
raft_node_t
*
me_
)
...
@@ -78,10 +78,10 @@ raft_index_t raft_node_get_match_idx(raft_node_t* me_)
...
@@ -78,10 +78,10 @@ raft_index_t raft_node_get_match_idx(raft_node_t* me_)
return
me
->
match_idx
;
return
me
->
match_idx
;
}
}
void
raft_node_set_match_idx
(
raft_node_t
*
me_
,
raft_index_t
matchI
dx
)
void
raft_node_set_match_idx
(
raft_node_t
*
me_
,
raft_index_t
i
dx
)
{
{
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
me
->
match_idx
=
matchI
dx
;
me
->
match_idx
=
i
dx
;
}
}
void
*
raft_node_get_udata
(
raft_node_t
*
me_
)
void
*
raft_node_get_udata
(
raft_node_t
*
me_
)
...
@@ -207,9 +207,3 @@ raft_msg_id_t raft_node_get_last_acked_msgid(raft_node_t* me_)
...
@@ -207,9 +207,3 @@ raft_msg_id_t raft_node_get_last_acked_msgid(raft_node_t* me_)
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
return
me
->
last_acked_msgid
;
return
me
->
last_acked_msgid
;
}
}
raft_term_t
raft_node_get_last_acked_term
(
raft_node_t
*
me_
)
{
raft_node_private_t
*
me
=
(
raft_node_private_t
*
)
me_
;
return
me
->
last_acked_term
;
}
src/raft_server.c
View file @
ba31349d
...
@@ -19,27 +19,31 @@
...
@@ -19,27 +19,31 @@
#include "raft_private.h"
#include "raft_private.h"
#ifndef min
#ifndef min
#define min(a, b) ((a) < (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#endif
#endif
#ifndef max
#ifndef max
#define max(a, b) ((a) < (b) ? (b) : (a))
#define max(a, b) ((a) < (b) ? (b) : (a))
#endif
#endif
void
*
(
*
__raft_malloc
)(
size_t
)
=
malloc
;
#ifndef __GNUC__
void
*
(
*
__raft_calloc
)(
size_t
,
size_t
)
=
calloc
;
#define __attribute__(a)
void
*
(
*
__raft_realloc
)(
void
*
,
size_t
)
=
realloc
;
#endif
void
(
*
__raft_free
)(
void
*
)
=
free
;
void
*
(
*
raft_malloc
)(
size_t
)
=
malloc
;
void
*
(
*
raft_calloc
)(
size_t
,
size_t
)
=
calloc
;
void
*
(
*
raft_realloc
)(
void
*
,
size_t
)
=
realloc
;
void
(
*
raft_free
)(
void
*
)
=
free
;
void
raft_set_heap_functions
(
void
*
(
*
_malloc
)(
size_t
),
void
raft_set_heap_functions
(
void
*
(
*
_malloc
)(
size_t
),
void
*
(
*
_calloc
)(
size_t
,
size_t
),
void
*
(
*
_calloc
)(
size_t
,
size_t
),
void
*
(
*
_realloc
)(
void
*
,
size_t
),
void
*
(
*
_realloc
)(
void
*
,
size_t
),
void
(
*
_free
)(
void
*
))
void
(
*
_free
)(
void
*
))
{
{
__
raft_malloc
=
_malloc
;
raft_malloc
=
_malloc
;
__
raft_calloc
=
_calloc
;
raft_calloc
=
_calloc
;
__
raft_realloc
=
_realloc
;
raft_realloc
=
_realloc
;
__
raft_free
=
_free
;
raft_free
=
_free
;
}
}
static
void
raft_log
(
raft_server_t
*
me_
,
raft_node_t
*
node
,
const
char
*
fmt
,
...)
__attribute__
((
format
(
printf
,
3
,
4
)));
static
void
raft_log
(
raft_server_t
*
me_
,
raft_node_t
*
node
,
const
char
*
fmt
,
...)
__attribute__
((
format
(
printf
,
3
,
4
)));
...
@@ -83,7 +87,7 @@ void raft_update_quorum_meta(raft_server_t* me_, raft_msg_id_t id)
...
@@ -83,7 +87,7 @@ void raft_update_quorum_meta(raft_server_t* me_, raft_msg_id_t id)
raft_server_t
*
raft_new_with_log
(
const
raft_log_impl_t
*
log_impl
,
void
*
log_arg
)
raft_server_t
*
raft_new_with_log
(
const
raft_log_impl_t
*
log_impl
,
void
*
log_arg
)
{
{
raft_server_private_t
*
me
=
__
raft_calloc
(
1
,
sizeof
(
raft_server_private_t
));
raft_server_private_t
*
me
=
raft_calloc
(
1
,
sizeof
(
raft_server_private_t
));
if
(
!
me
)
if
(
!
me
)
return
NULL
;
return
NULL
;
...
@@ -99,7 +103,7 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
...
@@ -99,7 +103,7 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
me
->
log_impl
=
log_impl
;
me
->
log_impl
=
log_impl
;
me
->
log
=
me
->
log_impl
->
init
(
me
,
log_arg
);
me
->
log
=
me
->
log_impl
->
init
(
me
,
log_arg
);
if
(
!
me
->
log
)
{
if
(
!
me
->
log
)
{
__
raft_free
(
me
);
raft_free
(
me
);
return
NULL
;
return
NULL
;
}
}
...
@@ -113,8 +117,6 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
...
@@ -113,8 +117,6 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
return
(
raft_server_t
*
)
me
;
return
(
raft_server_t
*
)
me
;
}
}
extern
raft_log_impl_t
log_internal_impl
;
raft_server_t
*
raft_new
(
void
)
raft_server_t
*
raft_new
(
void
)
{
{
return
raft_new_with_log
(
&
raft_log_internal_impl
,
NULL
);
return
raft_new_with_log
(
&
raft_log_internal_impl
,
NULL
);
...
@@ -128,12 +130,12 @@ void raft_set_callbacks(raft_server_t* me_, raft_cbs_t* funcs, void* udata)
...
@@ -128,12 +130,12 @@ void raft_set_callbacks(raft_server_t* me_, raft_cbs_t* funcs, void* udata)
me
->
udata
=
udata
;
me
->
udata
=
udata
;
}
}
void
raft_
free
(
raft_server_t
*
me_
)
void
raft_
destroy
(
raft_server_t
*
me_
)
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
me
->
log_impl
->
free
(
me
->
log
);
me
->
log_impl
->
free
(
me
->
log
);
__
raft_free
(
me_
);
raft_free
(
me_
);
}
}
void
raft_clear
(
raft_server_t
*
me_
)
void
raft_clear
(
raft_server_t
*
me_
)
...
@@ -154,6 +156,185 @@ void raft_clear(raft_server_t* me_)
...
@@ -154,6 +156,185 @@ void raft_clear(raft_server_t* me_)
me
->
log_impl
->
reset
(
me
->
log
,
1
,
1
);
me
->
log_impl
->
reset
(
me
->
log
,
1
,
1
);
}
}
raft_node_t
*
raft_add_node_internal
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
/* set to voting if node already exists */
raft_node_t
*
node
=
raft_get_node
(
me_
,
id
);
if
(
node
)
{
if
(
!
raft_node_is_voting
(
node
))
{
raft_node_set_voting
(
node
,
1
);
return
node
;
}
else
/* we shouldn't add a node twice */
return
NULL
;
}
node
=
raft_node_new
(
udata
,
id
);
if
(
!
node
)
return
NULL
;
void
*
p
=
raft_realloc
(
me
->
nodes
,
sizeof
(
void
*
)
*
(
me
->
num_nodes
+
1
));
if
(
!
p
)
{
raft_node_free
(
node
);
return
NULL
;
}
me
->
num_nodes
++
;
me
->
nodes
=
p
;
me
->
nodes
[
me
->
num_nodes
-
1
]
=
node
;
if
(
is_self
)
me
->
node
=
me
->
nodes
[
me
->
num_nodes
-
1
];
node
=
me
->
nodes
[
me
->
num_nodes
-
1
];
if
(
me
->
cb
.
notify_membership_event
)
me
->
cb
.
notify_membership_event
(
me_
,
raft_get_udata
(
me_
),
node
,
ety
,
RAFT_MEMBERSHIP_ADD
);
return
node
;
}
static
raft_node_t
*
raft_add_non_voting_node_internal
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
if
(
raft_get_node
(
me_
,
id
))
return
NULL
;
raft_node_t
*
node
=
raft_add_node_internal
(
me_
,
ety
,
udata
,
id
,
is_self
);
if
(
!
node
)
return
NULL
;
raft_node_set_voting
(
node
,
0
);
return
node
;
}
raft_node_t
*
raft_add_node
(
raft_server_t
*
me_
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
return
raft_add_node_internal
(
me_
,
NULL
,
udata
,
id
,
is_self
);
}
raft_node_t
*
raft_add_non_voting_node
(
raft_server_t
*
me_
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
return
raft_add_non_voting_node_internal
(
me_
,
NULL
,
udata
,
id
,
is_self
);
}
void
raft_remove_node
(
raft_server_t
*
me_
,
raft_node_t
*
node
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
me
->
cb
.
notify_membership_event
)
me
->
cb
.
notify_membership_event
(
me_
,
raft_get_udata
(
me_
),
node
,
NULL
,
RAFT_MEMBERSHIP_REMOVE
);
assert
(
node
);
int
i
,
found
=
0
;
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodes
[
i
]
==
node
)
{
found
=
1
;
break
;
}
}
assert
(
found
);
memmove
(
&
me
->
nodes
[
i
],
&
me
->
nodes
[
i
+
1
],
sizeof
(
*
me
->
nodes
)
*
(
me
->
num_nodes
-
i
-
1
));
me
->
num_nodes
--
;
/* if we are removing the current leader, have to reset it, as this data is now stale */
raft_node_t
*
current_leader_node
=
raft_get_current_leader_node
(
me_
);
if
(
node
==
current_leader_node
)
{
me
->
current_leader
=
NULL
;
}
raft_node_free
(
node
);
}
void
raft_handle_append_cfg_change
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
raft_index_t
idx
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
!
raft_entry_is_cfg_change
(
ety
))
return
;
if
(
!
me
->
cb
.
log_get_node_id
)
return
;
void
*
udata
=
raft_get_udata
(
me_
);
raft_node_id_t
node_id
=
me
->
cb
.
log_get_node_id
(
me_
,
udata
,
ety
,
idx
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
int
is_self
=
node_id
==
raft_get_nodeid
(
me_
);
switch
(
ety
->
type
)
{
case
RAFT_LOGTYPE_ADD_NONVOTING_NODE
:
if
(
!
is_self
)
{
if
(
node
&&
!
raft_node_is_active
(
node
))
{
raft_node_set_active
(
node
,
1
);
}
else
if
(
!
node
)
{
node
=
raft_add_non_voting_node_internal
(
me_
,
ety
,
NULL
,
node_id
,
is_self
);
assert
(
node
);
}
}
break
;
case
RAFT_LOGTYPE_ADD_NODE
:
node
=
raft_add_node_internal
(
me_
,
ety
,
NULL
,
node_id
,
is_self
);
assert
(
node
);
assert
(
raft_node_is_voting
(
node
));
break
;
case
RAFT_LOGTYPE_REMOVE_NODE
:
if
(
node
)
{
raft_node_set_active
(
node
,
0
);
}
break
;
default:
assert
(
0
);
}
}
void
raft_handle_remove_cfg_change
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
const
raft_index_t
idx
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
!
raft_entry_is_cfg_change
(
ety
))
return
;
if
(
!
me
->
cb
.
log_get_node_id
)
return
;
void
*
udata
=
raft_get_udata
(
me_
);
raft_node_id_t
node_id
=
me
->
cb
.
log_get_node_id
(
me_
,
udata
,
ety
,
idx
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
switch
(
ety
->
type
)
{
case
RAFT_LOGTYPE_REMOVE_NODE
:
raft_node_set_active
(
node
,
1
);
break
;
case
RAFT_LOGTYPE_ADD_NONVOTING_NODE
:
assert
(
node_id
!=
raft_get_nodeid
(
me_
));
raft_remove_node
(
me_
,
node
);
break
;
case
RAFT_LOGTYPE_ADD_NODE
:
raft_node_set_voting
(
node
,
0
);
break
;
default:
assert
(
0
);
break
;
}
}
int
raft_delete_entry_from_idx
(
raft_server_t
*
me_
,
raft_index_t
idx
)
int
raft_delete_entry_from_idx
(
raft_server_t
*
me_
,
raft_index_t
idx
)
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
...
@@ -489,10 +670,10 @@ int raft_recv_appendentries_response(raft_server_t* me_,
...
@@ -489,10 +670,10 @@ int raft_recv_appendentries_response(raft_server_t* me_,
int
votes
=
raft_node_is_voting
(
me
->
node
)
?
1
:
0
;
int
votes
=
raft_node_is_voting
(
me
->
node
)
?
1
:
0
;
for
(
int
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
for
(
int
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
{
raft_node_t
*
node
=
me
->
nodes
[
i
];
raft_node_t
*
follower
=
me
->
nodes
[
i
];
if
(
me
->
node
!=
node
&&
if
(
me
->
node
!=
follower
&&
raft_node_is_voting
(
node
)
&&
raft_node_is_voting
(
follower
)
&&
point
<=
raft_node_get_match_idx
(
node
))
point
<=
raft_node_get_match_idx
(
follower
))
{
{
votes
++
;
votes
++
;
}
}
...
@@ -675,7 +856,7 @@ int raft_already_voted(raft_server_t* me_)
...
@@ -675,7 +856,7 @@ int raft_already_voted(raft_server_t* me_)
return
((
raft_server_private_t
*
)
me_
)
->
voted_for
!=
-
1
;
return
((
raft_server_private_t
*
)
me_
)
->
voted_for
!=
-
1
;
}
}
static
int
_
_should_grant_vote
(
raft_server_t
*
me_
,
msg_requestvote_t
*
vr
)
static
int
raft
_should_grant_vote
(
raft_server_t
*
me_
,
msg_requestvote_t
*
vr
)
{
{
if
(
!
raft_node_is_voting
(
raft_get_my_node
(
me_
)))
if
(
!
raft_node_is_voting
(
raft_get_my_node
(
me_
)))
return
0
;
return
0
;
...
@@ -735,7 +916,7 @@ int raft_recv_requestvote(raft_server_t* me_,
...
@@ -735,7 +916,7 @@ int raft_recv_requestvote(raft_server_t* me_,
me
->
current_leader
=
NULL
;
me
->
current_leader
=
NULL
;
}
}
if
(
_
_should_grant_vote
(
me_
,
vr
))
if
(
raft
_should_grant_vote
(
me_
,
vr
))
{
{
/* It shouldn't be possible for a leader or candidate to grant a vote
/* It shouldn't be possible for a leader or candidate to grant a vote
* Both states would have voted for themselves */
* Both states would have voted for themselves */
...
@@ -749,7 +930,6 @@ int raft_recv_requestvote(raft_server_t* me_,
...
@@ -749,7 +930,6 @@ int raft_recv_requestvote(raft_server_t* me_,
/* must be in an election. */
/* must be in an election. */
me
->
current_leader
=
NULL
;
me
->
current_leader
=
NULL
;
me
->
timeout_elapsed
=
0
;
me
->
timeout_elapsed
=
0
;
}
}
else
else
...
@@ -796,11 +976,12 @@ int raft_recv_requestvote_response(raft_server_t* me_,
...
@@ -796,11 +976,12 @@ int raft_recv_requestvote_response(raft_server_t* me_,
r
->
vote_granted
==
1
?
"granted"
:
r
->
vote_granted
==
1
?
"granted"
:
r
->
vote_granted
==
0
?
"not granted"
:
"unknown"
);
r
->
vote_granted
==
0
?
"not granted"
:
"unknown"
);
if
(
!
raft_is_candidate
(
me_
))
if
(
!
raft_is_candidate
(
me_
)
||
raft_get_current_term
(
me_
)
>
r
->
term
)
{
{
return
0
;
return
0
;
}
}
else
if
(
raft_get_current_term
(
me_
)
<
r
->
term
)
if
(
raft_get_current_term
(
me_
)
<
r
->
term
)
{
{
int
e
=
raft_set_current_term
(
me_
,
r
->
term
);
int
e
=
raft_set_current_term
(
me_
,
r
->
term
);
if
(
0
!=
e
)
if
(
0
!=
e
)
...
@@ -809,13 +990,6 @@ int raft_recv_requestvote_response(raft_server_t* me_,
...
@@ -809,13 +990,6 @@ int raft_recv_requestvote_response(raft_server_t* me_,
me
->
current_leader
=
NULL
;
me
->
current_leader
=
NULL
;
return
0
;
return
0
;
}
}
else
if
(
raft_get_current_term
(
me_
)
!=
r
->
term
)
{
/* The node who voted for us would have obtained our term.
* Therefore this is an old message we should ignore.
* This happens if the network is pretty choppy. */
return
0
;
}
raft_log
(
me_
,
node
,
"node responded to requestvote status:%s ct:%ld rt:%ld"
,
raft_log
(
me_
,
node
,
"node responded to requestvote status:%s ct:%ld rt:%ld"
,
r
->
vote_granted
==
1
?
"granted"
:
r
->
vote_granted
==
1
?
"granted"
:
...
@@ -1029,12 +1203,12 @@ raft_entry_t** raft_get_entries_from_idx(raft_server_t* me_, raft_index_t idx, i
...
@@ -1029,12 +1203,12 @@ raft_entry_t** raft_get_entries_from_idx(raft_server_t* me_, raft_index_t idx, i
}
}
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
in
t
size
=
raft_get_current_idx
(
me_
)
-
idx
+
1
;
raft_index_
t
size
=
raft_get_current_idx
(
me_
)
-
idx
+
1
;
raft_entry_t
**
e
=
__
raft_malloc
(
size
*
sizeof
(
raft_entry_t
*
));
raft_entry_t
**
e
=
raft_malloc
(
size
*
sizeof
(
raft_entry_t
*
));
int
n
=
me
->
log_impl
->
get_batch
(
me
->
log
,
idx
,
size
,
e
);
int
n
=
me
->
log_impl
->
get_batch
(
me
->
log
,
idx
,
(
int
)
size
,
e
);
if
(
n
<
1
)
{
if
(
n
<
1
)
{
__
raft_free
(
e
);
raft_free
(
e
);
*
n_etys
=
0
;
*
n_etys
=
0
;
return
NULL
;
return
NULL
;
}
}
...
@@ -1103,7 +1277,7 @@ int raft_send_appendentries(raft_server_t* me_, raft_node_t* node)
...
@@ -1103,7 +1277,7 @@ int raft_send_appendentries(raft_server_t* me_, raft_node_t* node)
int
res
=
me
->
cb
.
send_appendentries
(
me_
,
me
->
udata
,
node
,
&
ae
);
int
res
=
me
->
cb
.
send_appendentries
(
me_
,
me
->
udata
,
node
,
&
ae
);
raft_entry_release_list
(
ae
.
entries
,
ae
.
n_entries
);
raft_entry_release_list
(
ae
.
entries
,
ae
.
n_entries
);
__
raft_free
(
ae
.
entries
);
raft_free
(
ae
.
entries
);
return
res
;
return
res
;
}
}
...
@@ -1128,100 +1302,6 @@ int raft_send_appendentries_all(raft_server_t* me_)
...
@@ -1128,100 +1302,6 @@ int raft_send_appendentries_all(raft_server_t* me_)
return
ret
;
return
ret
;
}
}
raft_node_t
*
raft_add_node_internal
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
/* set to voting if node already exists */
raft_node_t
*
node
=
raft_get_node
(
me_
,
id
);
if
(
node
)
{
if
(
!
raft_node_is_voting
(
node
))
{
raft_node_set_voting
(
node
,
1
);
return
node
;
}
else
/* we shouldn't add a node twice */
return
NULL
;
}
node
=
raft_node_new
(
udata
,
id
);
if
(
!
node
)
return
NULL
;
void
*
p
=
__raft_realloc
(
me
->
nodes
,
sizeof
(
void
*
)
*
(
me
->
num_nodes
+
1
));
if
(
!
p
)
{
raft_node_free
(
node
);
return
NULL
;
}
me
->
num_nodes
++
;
me
->
nodes
=
p
;
me
->
nodes
[
me
->
num_nodes
-
1
]
=
node
;
if
(
is_self
)
me
->
node
=
me
->
nodes
[
me
->
num_nodes
-
1
];
node
=
me
->
nodes
[
me
->
num_nodes
-
1
];
if
(
me
->
cb
.
notify_membership_event
)
me
->
cb
.
notify_membership_event
(
me_
,
raft_get_udata
(
me_
),
node
,
ety
,
RAFT_MEMBERSHIP_ADD
);
return
node
;
}
raft_node_t
*
raft_add_node
(
raft_server_t
*
me_
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
return
raft_add_node_internal
(
me_
,
NULL
,
udata
,
id
,
is_self
);
}
static
raft_node_t
*
raft_add_non_voting_node_internal
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
if
(
raft_get_node
(
me_
,
id
))
return
NULL
;
raft_node_t
*
node
=
raft_add_node_internal
(
me_
,
ety
,
udata
,
id
,
is_self
);
if
(
!
node
)
return
NULL
;
raft_node_set_voting
(
node
,
0
);
return
node
;
}
raft_node_t
*
raft_add_non_voting_node
(
raft_server_t
*
me_
,
void
*
udata
,
raft_node_id_t
id
,
int
is_self
)
{
return
raft_add_non_voting_node_internal
(
me_
,
NULL
,
udata
,
id
,
is_self
);
}
void
raft_remove_node
(
raft_server_t
*
me_
,
raft_node_t
*
node
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
me
->
cb
.
notify_membership_event
)
me
->
cb
.
notify_membership_event
(
me_
,
raft_get_udata
(
me_
),
node
,
NULL
,
RAFT_MEMBERSHIP_REMOVE
);
assert
(
node
);
int
i
,
found
=
0
;
for
(
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
if
(
me
->
nodes
[
i
]
==
node
)
{
found
=
1
;
break
;
}
}
assert
(
found
);
memmove
(
&
me
->
nodes
[
i
],
&
me
->
nodes
[
i
+
1
],
sizeof
(
*
me
->
nodes
)
*
(
me
->
num_nodes
-
i
-
1
));
me
->
num_nodes
--
;
/* if we are removing the current leader, have to reset it, as this data is now stale */
raft_node_t
*
current_leader_node
=
raft_get_current_leader_node
(
me_
);
if
(
node
==
current_leader_node
)
{
me
->
current_leader
=
NULL
;
}
raft_node_free
(
node
);
}
int
raft_get_nvotes_for_me
(
raft_server_t
*
me_
)
int
raft_get_nvotes_for_me
(
raft_server_t
*
me_
)
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
...
@@ -1305,99 +1385,6 @@ int raft_entry_is_cfg_change(raft_entry_t* ety)
...
@@ -1305,99 +1385,6 @@ int raft_entry_is_cfg_change(raft_entry_t* ety)
RAFT_LOGTYPE_REMOVE_NODE
==
ety
->
type
);
RAFT_LOGTYPE_REMOVE_NODE
==
ety
->
type
);
}
}
void
raft_handle_append_cfg_change
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
raft_index_t
idx
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
!
raft_entry_is_cfg_change
(
ety
))
return
;
if
(
!
me
->
cb
.
log_get_node_id
)
return
;
raft_node_id_t
node_id
=
me
->
cb
.
log_get_node_id
(
me_
,
raft_get_udata
(
me_
),
ety
,
idx
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
int
is_self
=
node_id
==
raft_get_nodeid
(
me_
);
switch
(
ety
->
type
)
{
case
RAFT_LOGTYPE_ADD_NONVOTING_NODE
:
if
(
!
is_self
)
{
if
(
node
&&
!
raft_node_is_active
(
node
))
{
raft_node_set_active
(
node
,
1
);
}
else
if
(
!
node
)
{
node
=
raft_add_non_voting_node_internal
(
me_
,
ety
,
NULL
,
node_id
,
is_self
);
assert
(
node
);
}
}
break
;
case
RAFT_LOGTYPE_ADD_NODE
:
node
=
raft_add_node_internal
(
me_
,
ety
,
NULL
,
node_id
,
is_self
);
assert
(
node
);
assert
(
raft_node_is_voting
(
node
));
break
;
case
RAFT_LOGTYPE_REMOVE_NODE
:
if
(
node
)
{
raft_node_set_active
(
node
,
0
);
}
break
;
default:
assert
(
0
);
}
}
void
raft_handle_remove_cfg_change
(
raft_server_t
*
me_
,
raft_entry_t
*
ety
,
const
raft_index_t
idx
)
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
if
(
!
raft_entry_is_cfg_change
(
ety
))
return
;
if
(
!
me
->
cb
.
log_get_node_id
)
return
;
raft_node_id_t
node_id
=
me
->
cb
.
log_get_node_id
(
me_
,
raft_get_udata
(
me_
),
ety
,
idx
);
switch
(
ety
->
type
)
{
case
RAFT_LOGTYPE_REMOVE_NODE
:
{
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
raft_node_set_active
(
node
,
1
);
}
break
;
case
RAFT_LOGTYPE_ADD_NONVOTING_NODE
:
{
int
is_self
=
node_id
==
raft_get_nodeid
(
me_
);
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
raft_remove_node
(
me_
,
node
);
if
(
is_self
)
assert
(
0
);
}
break
;
case
RAFT_LOGTYPE_ADD_NODE
:
{
raft_node_t
*
node
=
raft_get_node
(
me_
,
node_id
);
raft_node_set_voting
(
node
,
0
);
}
break
;
default:
assert
(
0
);
break
;
}
}
int
raft_poll_entry
(
raft_server_t
*
me_
)
int
raft_poll_entry
(
raft_server_t
*
me_
)
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
...
@@ -1450,7 +1437,7 @@ int raft_begin_snapshot(raft_server_t *me_, int flags)
...
@@ -1450,7 +1437,7 @@ int raft_begin_snapshot(raft_server_t *me_, int flags)
return
-
1
;
return
-
1
;
raft_index_t
snapshot_target
=
raft_get_commit_idx
(
me_
);
raft_index_t
snapshot_target
=
raft_get_commit_idx
(
me_
);
if
(
!
snapshot_target
||
snapshot_target
==
0
)
if
(
!
snapshot_target
)
return
-
1
;
return
-
1
;
raft_entry_t
*
ety
=
raft_get_entry_from_idx
(
me_
,
snapshot_target
);
raft_entry_t
*
ety
=
raft_get_entry_from_idx
(
me_
,
snapshot_target
);
...
@@ -1632,7 +1619,7 @@ void *raft_get_log(raft_server_t *me_)
...
@@ -1632,7 +1619,7 @@ void *raft_get_log(raft_server_t *me_)
raft_entry_t
*
raft_entry_new
(
unsigned
int
data_len
)
raft_entry_t
*
raft_entry_new
(
unsigned
int
data_len
)
{
{
raft_entry_t
*
ety
=
__
raft_calloc
(
1
,
sizeof
(
raft_entry_t
)
+
data_len
);
raft_entry_t
*
ety
=
raft_calloc
(
1
,
sizeof
(
raft_entry_t
)
+
data_len
);
ety
->
data_len
=
data_len
;
ety
->
data_len
=
data_len
;
ety
->
refs
=
1
;
ety
->
refs
=
1
;
...
@@ -1654,7 +1641,7 @@ void raft_entry_release(raft_entry_t *ety)
...
@@ -1654,7 +1641,7 @@ void raft_entry_release(raft_entry_t *ety)
if
(
ety
->
free_func
)
{
if
(
ety
->
free_func
)
{
ety
->
free_func
(
ety
);
ety
->
free_func
(
ety
);
}
else
{
}
else
{
__
raft_free
(
ety
);
raft_free
(
ety
);
}
}
}
}
}
}
...
@@ -1672,7 +1659,7 @@ void raft_queue_read_request(raft_server_t* me_, func_read_request_callback_f cb
...
@@ -1672,7 +1659,7 @@ void raft_queue_read_request(raft_server_t* me_, func_read_request_callback_f cb
{
{
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_server_private_t
*
me
=
(
raft_server_private_t
*
)
me_
;
raft_read_request_t
*
req
=
__
raft_malloc
(
sizeof
(
raft_read_request_t
));
raft_read_request_t
*
req
=
raft_malloc
(
sizeof
(
raft_read_request_t
));
req
->
read_idx
=
raft_get_current_idx
(
me_
);
req
->
read_idx
=
raft_get_current_idx
(
me_
);
req
->
read_term
=
raft_get_current_term
(
me_
);
req
->
read_term
=
raft_get_current_term
(
me_
);
...
@@ -1706,7 +1693,7 @@ static void pop_read_queue(raft_server_private_t *me, int can_read)
...
@@ -1706,7 +1693,7 @@ static void pop_read_queue(raft_server_private_t *me, int can_read)
me
->
read_queue_tail
=
NULL
;
me
->
read_queue_tail
=
NULL
;
}
}
__
raft_free
(
p
);
raft_free
(
p
);
}
}
void
raft_process_read_queue
(
raft_server_t
*
me_
)
void
raft_process_read_queue
(
raft_server_t
*
me_
)
...
...
tests/test_log.c
View file @
ba31349d
...
@@ -511,7 +511,7 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc)
...
@@ -511,7 +511,7 @@ void TestLog_get_from_idx_with_base_off_by_one(CuTest * tc)
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
CuAssertIntEquals
(
tc
,
1
,
log_count
(
l
));
/* get off-by-one index */
/* get off-by-one index */
int
n_etys
;
long
n_etys
;
CuAssertPtrEquals
(
tc
,
log_get_from_idx
(
l
,
1
,
&
n_etys
),
NULL
);
CuAssertPtrEquals
(
tc
,
log_get_from_idx
(
l
,
1
,
&
n_etys
),
NULL
);
CuAssertIntEquals
(
tc
,
n_etys
,
0
);
CuAssertIntEquals
(
tc
,
n_etys
,
0
);
...
...
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