Beispiel #1
0
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;
}
Beispiel #2
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) });
}