int main() { struct event_base *base = event_base_new(); c = init_rpc(base); int inc = 2; rpc_register(c, "test1", test1, &inc); struct rpc_target dest = { HTTP, "0.0.0.0", 12321 }; init_rpc_server(c, &dest); signal(SIGINT, exit_handler); event_base_dispatch(base); return 0; }
struct server_context_t *init_raft_server(int id, const char *basedir, const char *host, int port, enum rpc_proto proto, long election_timeout, long heartbeat_timeout) { struct server_context_t *s = (struct server_context_t *)malloc( sizeof(struct server_context_t)); if(!s) { return NULL; } s->host = u_strdup(host); s->port = port; s->id = id; s->state = FOLLOWER; s->current_term = 0; s->commit_index = 0; s->commit_term = 0; s->log_last_applied = 0; s->quoram_size = 1; //TODO: read from config file s->current_votes = 0; s->basedir = u_strdup(basedir); char *logdir = path_join(basedir, RAFT_LOGDIR); s->log = init_log(logdir); if(!s->log) { deinit_raft_server(s); free(logdir); return NULL; } free(logdir); s->last_entry = get_last_entry(s->log); load_state(s); s->next_index = 0; s->match_index = 0; s->stm = init_stm(s); s->base = event_base_new(); if(!s->base) { //LOG:FATAL event loop init failed deinit_raft_server(s); return NULL; } s->timer_el = event_new(s->base, -1, EV_PERSIST, election_timeout_callback, s); s->timer_hb = event_new(s->base, -1, EV_PERSIST, heartbeat_timeout_callback, s); s->election_timeout_ = election_timeout; s->election_timeout = time_in_timeval(election_timeout); s->heartbeat_timeout_ = heartbeat_timeout; s->heartbeat_timeout = time_in_timeval(heartbeat_timeout); if(!s->timer_el || !s->timer_hb || !s->election_timeout || !s->heartbeat_timeout) { //LOG:FATAL timer creation failed deinit_raft_server(s); return NULL; } s->last_heartbeat_at = 0; //initially just add election timer and add heartbeat timer later //when this server elected as the leader if(event_add(s->timer_el, s->election_timeout)) { //LOG:FATAL timer event registration failed deinit_raft_server(s); return NULL; } s->rpc_s = init_rpc(s->base); s->rpc_c = init_rpc(s->base); if(!s->rpc_s || !s->rpc_c) { //LOG:FATAL RPC init failed deinit_raft_server(s); return NULL; } struct rpc_target *listen_dest = (struct rpc_target *) malloc(sizeof(struct rpc_target)); if(!listen_dest) { deinit_raft_server(s); return NULL; } listen_dest->proto = HTTP; listen_dest->host = s->host; listen_dest->port = s->port; int res = 0; res |= init_rpc_server(s->rpc_s, listen_dest); res |= init_rpc_client(s->rpc_c); if(res) { //LOG:FATAL rpc server init failed deinit_raft_server(s); return NULL; } free(listen_dest); res = 0; res |= rpc_register(s->rpc_s, APPEND_ENTRIES_RPC, handle_append_entries, s); res |= rpc_register(s->rpc_s, REQUEST_VOTE_RPC, handle_request_vote, s); if(res) { //LOG:FATAL method registration failed deinit_raft_server(s); return NULL; } s->current_leader = -1; return s; }
void init_tank_io_twi() { init_rpc_server(TANK_IO_ADDRESS); init_twi_frequency(); twi_rpc_client_init((TWIBuffer) { twi_io_buffer_2, sizeof(twi_io_buffer_2) }); }