Unverified Commit 75926627 authored by Ozan Tezcan's avatar Ozan Tezcan Committed by GitHub
Browse files

Free memory on raft_destroy() and raft_log_free() (#166)

Free memory on raft_destroy() and raft_log_free()
parent b3542734
...@@ -148,17 +148,16 @@ int raft_log_append_entry(raft_log_t *me, raft_entry_t *ety) ...@@ -148,17 +148,16 @@ int raft_log_append_entry(raft_log_t *me, raft_entry_t *ety)
return e; return e;
} }
me->entries[me->back] = ety;
if (me->cb.log_offer) { if (me->cb.log_offer) {
void *udata = raft_get_udata(me->raft); 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) { if (e != 0) {
return e; return e;
} }
} }
me->entries[me->back] = ety;
me->count++; me->count++;
me->back++; me->back++;
me->back = me->back % me->size; me->back = me->back % me->size;
...@@ -237,7 +236,7 @@ static int log_delete(raft_log_t *me, raft_index_t idx) ...@@ -237,7 +236,7 @@ static int log_delete(raft_log_t *me, raft_index_t idx)
} }
raft_entry_release(me->entries[back]); raft_entry_release(me->entries[back]);
me->entries[back] = NULL;
me->back = back; me->back = back;
me->count--; me->count--;
} }
...@@ -300,6 +299,16 @@ void raft_log_empty(raft_log_t *me) ...@@ -300,6 +299,16 @@ void raft_log_empty(raft_log_t *me)
void raft_log_free(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->entries);
raft_free(me); raft_free(me);
} }
...@@ -353,8 +362,12 @@ static void log_reset(void *log, raft_index_t first_idx, raft_term_t term) ...@@ -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) static int log_append(void *log, raft_entry_t *entry)
{ {
int e = raft_log_append_entry(log, entry);
if (e == 0) {
raft_entry_hold(entry); raft_entry_hold(entry);
return raft_log_append_entry(log, entry); }
return e;
} }
static raft_entry_t *log_get(void *log, raft_index_t idx) static raft_entry_t *log_get(void *log, raft_index_t idx)
......
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
#define __attribute__(a) #define __attribute__(a)
#endif #endif
static void pop_read_queue(raft_server_t *me, int can_read);
void *(*raft_malloc)(size_t) = malloc; void *(*raft_malloc)(size_t) = malloc;
void *(*raft_calloc)(size_t, size_t) = calloc; void *(*raft_calloc)(size_t, size_t) = calloc;
void *(*raft_realloc)(void *, size_t) = realloc; 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) ...@@ -96,25 +98,33 @@ int raft_clear_incoming_snapshot(raft_server_t* me, raft_index_t new_idx)
return e; 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)); raft_server_t *me = raft_calloc(1, sizeof(*me));
if (!me) if (!me) {
return NULL; return NULL;
}
me->current_term = 0; raft_init(me);
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_randomize_election_timeout(me);
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) {
...@@ -122,12 +132,6 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg) ...@@ -122,12 +132,6 @@ raft_server_t* raft_new_with_log(const raft_log_impl_t *log_impl, void *log_arg)
return NULL; 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; return me;
} }
...@@ -152,27 +156,47 @@ void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* udata) ...@@ -152,27 +156,47 @@ void raft_set_callbacks(raft_server_t* me, raft_cbs_t* funcs, void* udata)
me->udata = 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); 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); raft_free(me);
} }
void raft_clear(raft_server_t* me) void raft_clear(raft_server_t *me)
{ {
me->current_term = 0; while (me->read_queue_head) {
me->voted_for = RAFT_NODE_ID_NONE; pop_read_queue(me, 0);
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;
me->log_impl->reset(me->log, 1, 1); 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) 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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment