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
75926627
Unverified
Commit
75926627
authored
Jun 20, 2023
by
Ozan Tezcan
Committed by
GitHub
Jun 20, 2023
Browse files
Free memory on raft_destroy() and raft_log_free() (#166)
Free memory on raft_destroy() and raft_log_free()
parent
b3542734
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/raft_log.c
View file @
75926627
...
...
@@ -148,17 +148,16 @@ int raft_log_append_entry(raft_log_t *me, raft_entry_t *ety)
return
e
;
}
me
->
entries
[
me
->
back
]
=
ety
;
if
(
me
->
cb
.
log_offer
)
{
void
*
udata
=
raft_get_udata
(
me
->
raft
);
e
=
me
->
cb
.
log_offer
(
me
->
raft
,
udata
,
me
->
entries
[
me
->
back
]
,
idx
);
e
=
me
->
cb
.
log_offer
(
me
->
raft
,
udata
,
ety
,
idx
);
if
(
e
!=
0
)
{
return
e
;
}
}
me
->
entries
[
me
->
back
]
=
ety
;
me
->
count
++
;
me
->
back
++
;
me
->
back
=
me
->
back
%
me
->
size
;
...
...
@@ -237,7 +236,7 @@ static int log_delete(raft_log_t *me, raft_index_t idx)
}
raft_entry_release
(
me
->
entries
[
back
]);
me
->
entries
[
back
]
=
NULL
;
me
->
back
=
back
;
me
->
count
--
;
}
...
...
@@ -300,6 +299,16 @@ void raft_log_empty(raft_log_t *me)
void
raft_log_free
(
raft_log_t
*
me
)
{
if
(
!
me
)
{
return
;
}
for
(
raft_index_t
i
=
0
;
i
<
me
->
size
;
i
++
)
{
raft_entry_t
*
ety
=
me
->
entries
[
i
];
if
(
ety
)
{
raft_entry_release
(
ety
);
}
}
raft_free
(
me
->
entries
);
raft_free
(
me
);
}
...
...
@@ -353,8 +362,12 @@ static void log_reset(void *log, raft_index_t first_idx, raft_term_t term)
static
int
log_append
(
void
*
log
,
raft_entry_t
*
entry
)
{
raft_entry_hold
(
entry
);
return
raft_log_append_entry
(
log
,
entry
);
int
e
=
raft_log_append_entry
(
log
,
entry
);
if
(
e
==
0
)
{
raft_entry_hold
(
entry
);
}
return
e
;
}
static
raft_entry_t
*
log_get
(
void
*
log
,
raft_index_t
idx
)
...
...
src/raft_server.c
View file @
75926627
...
...
@@ -31,6 +31,8 @@
#define __attribute__(a)
#endif
static
void
pop_read_queue
(
raft_server_t
*
me
,
int
can_read
);
void
*
(
*
raft_malloc
)(
size_t
)
=
malloc
;
void
*
(
*
raft_calloc
)(
size_t
,
size_t
)
=
calloc
;
void
*
(
*
raft_realloc
)(
void
*
,
size_t
)
=
realloc
;
...
...
@@ -96,25 +98,33 @@ int raft_clear_incoming_snapshot(raft_server_t* me, raft_index_t new_idx)
return
e
;
}
raft_server_t
*
raft_new_with_log
(
const
raft_log_impl_t
*
log_impl
,
void
*
log_arg
)
static
void
raft_init
(
raft_server_t
*
me
)
{
*
me
=
(
raft_server_t
){
.
state
=
RAFT_STATE_FOLLOWER
,
.
request_timeout
=
200
,
.
election_timeout
=
1000
,
.
voted_for
=
RAFT_NODE_ID_NONE
,
.
leader_id
=
RAFT_NODE_ID_NONE
,
.
node_transferring_leader_to
=
RAFT_NODE_ID_NONE
,
.
voting_cfg_change_log_idx
=
-
1
,
.
auto_flush
=
1
,
.
exec_deadline
=
LLONG_MAX
,
};
raft_update_quorum_meta
(
me
,
me
->
msg_id
);
raft_randomize_election_timeout
(
me
);
}
raft_server_t
*
raft_new_with_log
(
const
raft_log_impl_t
*
log_impl
,
void
*
log_arg
)
{
raft_server_t
*
me
=
raft_calloc
(
1
,
sizeof
(
*
me
));
if
(
!
me
)
if
(
!
me
)
{
return
NULL
;
}
me
->
current_term
=
0
;
me
->
voted_for
=
RAFT_NODE_ID_NONE
;
me
->
timeout_elapsed
=
0
;
me
->
request_timeout
=
200
;
me
->
election_timeout
=
1000
;
me
->
node_transferring_leader_to
=
RAFT_NODE_ID_NONE
;
me
->
auto_flush
=
1
;
me
->
exec_deadline
=
LLONG_MAX
;
me
->
msg_id
=
0
;
raft_update_quorum_meta
(
me
,
me
->
msg_id
);
raft_init
(
me
);
raft_randomize_election_timeout
(
me
);
me
->
log_impl
=
log_impl
;
me
->
log
=
me
->
log_impl
->
init
(
me
,
log_arg
);
if
(
!
me
->
log
)
{
...
...
@@ -122,12 +132,6 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
return
NULL
;
}
me
->
voting_cfg_change_log_idx
=
-
1
;
raft_set_state
(
me
,
RAFT_STATE_FOLLOWER
);
me
->
leader_id
=
RAFT_NODE_ID_NONE
;
me
->
snapshot_in_progress
=
0
;
return
me
;
}
...
...
@@ -152,27 +156,47 @@ void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* udata)
me
->
udata
=
udata
;
}
void
raft_destroy
(
raft_server_t
*
me
)
void
raft_destroy
(
raft_server_t
*
me
)
{
if
(
!
me
)
{
return
;
}
while
(
me
->
read_queue_head
)
{
pop_read_queue
(
me
,
0
);
}
me
->
log_impl
->
free
(
me
->
log
);
for
(
int
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
raft_free
(
me
->
nodes
[
i
]);
}
raft_free
(
me
->
nodes
);
raft_free
(
me
);
}
void
raft_clear
(
raft_server_t
*
me
)
void
raft_clear
(
raft_server_t
*
me
)
{
me
->
current_term
=
0
;
me
->
voted_for
=
RAFT_NODE_ID_NONE
;
me
->
timeout_elapsed
=
0
;
raft_randomize_election_timeout
(
me
);
me
->
voting_cfg_change_log_idx
=
-
1
;
raft_set_state
(
me
,
RAFT_STATE_FOLLOWER
);
me
->
leader_id
=
RAFT_NODE_ID_NONE
;
me
->
commit_idx
=
0
;
me
->
last_applied_idx
=
0
;
me
->
last_applied_term
=
0
;
me
->
num_nodes
=
0
;
me
->
node
=
NULL
;
while
(
me
->
read_queue_head
)
{
pop_read_queue
(
me
,
0
);
}
me
->
log_impl
->
reset
(
me
->
log
,
1
,
1
);
for
(
int
i
=
0
;
i
<
me
->
num_nodes
;
i
++
)
{
raft_free
(
me
->
nodes
[
i
]);
}
raft_free
(
me
->
nodes
);
/* Re-initialize variables excluding log implementation as currently there
* is no way to set log impl without creating a new raft_server_t. */
const
struct
raft_log_impl
*
log_impl
=
me
->
log_impl
;
void
*
log
=
me
->
log
;
raft_init
(
me
);
me
->
log_impl
=
log_impl
;
me
->
log
=
log
;
}
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
,
int
voting
)
...
...
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