void deinit_raft_server(struct server_context_t *s) { if(s->peers){ for(int i = 0; i < s->quoram_size; i++) { if(s->peers[i]) { if(s->peers[i]->dest) { free(s->peers[i]->dest); } free(s->peers[i]); } } free(s->peers); } if(s->last_heartbeat_at) { free(s->last_heartbeat_at); } if(s->next_index) { free(s->next_index); } if(s->match_index) { free(s->match_index); } if(s->rpc_s) { deinit_rpc(s->rpc_s); } if(s->rpc_c) { deinit_rpc(s->rpc_c); } if(s->timer_el) { event_free(s->timer_el); } if(s->timer_hb) { event_free(s->timer_hb); } if(s->election_timeout) { free(s->election_timeout); } if(s->heartbeat_timeout) { free(s->heartbeat_timeout); } if(s->log) { deinit_log(s->log); } if(s->stm) { deinit_stm(s->stm); } if(s->base) { event_base_free(s->base); } if(s->host) { free(s->host); } if(s->basedir) { free(s->basedir); } free(s); }
/* * SIGINT signal handler * * @signo tells you signal useful when this function * is used as signal handler for multiple signals * */ void pyke_shutdown(int signo) { if(flag) { LOGI("Closing server socket. Exiting cleanly. Signo %d\n\n\n", signo); pyke_http_close(&gHttp); deinit_log(); flag = 0; } }
struct p_log *init_log(const char *logdir) { struct p_log *l = (struct p_log *)malloc(sizeof(struct p_log)); char *_logdir = u_strdup(logdir); if(!l || !_logdir) { if(l) free(l); return NULL; } l->logdir = _logdir; l->head = l->tail = NULL; if(read_log_entries(l, 0)) { return l; } deinit_log(l); return NULL; }
int main(void) { struct p_log *l = init_log("/home/swapnil/tmp/test_searaft"); if(l) { #ifdef RUN_WRITE_TEST for(int i = 0; i < 100; i++) { if(!append_log_entry(l, 1, i+1, u_strdup("test"), 5)) { printf("failed: log writing failed for %d\n", i+1); return 1; } } #else struct log_entry_t *le = get_last_entry(l); if(le) { if(le->term == 1 && le->index == 100 && le->bufsize == 5) { if(!le->buffer || 0 != strcmp(le->buffer, "test")) { printf("failed: incorrect buffer in log entry\n"); } } else { printf("failed: incorrect log entry %d\n", le->index); } } else { printf("failed: cant read log entry\n"); } le = get_log_entry_at(l, 25); if(le) { if(le->term == 1 && le->index == 25 && le->bufsize == 5) { if(!le->buffer || 0 != strcmp(le->buffer, "test")) { printf("failed: incorrect buffer in log entry\n"); } } else { printf("failed: incorrect log entry\n"); } } else { printf("failed: cant read log entry at index\n"); } if(!append_log_entry(l, 1, 75, u_strdup("test"), 5)) { printf("failed: log writing failed for %d\n", 75); return 1; } struct log_entry_t **entries = (struct log_entry_t **)malloc(sizeof(struct log_entry_t *)*25); for(int i = 0; i < 25; i++) { entries[i] = (struct log_entry_t *)malloc(sizeof(struct log_entry_t)); entries[i]->term = 1; entries[i]->index = 76 + i; entries[i]->buffer = u_strdup("test"); entries[i]->bufsize = 5; } le = append_log_entries(l, entries, 25); if(le) { if(le->term == 1 && le->index == 100 && le->bufsize == 5) { if(!le->buffer || 0 != strcmp(le->buffer, "test")) { printf("failed: incorrect buffer in log entry\n"); } } else { printf("failed: incorrect log entry %d\n", le->index); } } else { printf("failed: cant read log entry at index\n"); } #endif deinit_log(l); } else { printf("failed: cant read log directory\n"); } return 0; }