Exemple #1
0
/*
 * Register an RPC service with the local portmapper.
 * To unregister a service, call this routine with 
 * proto and port == 0.
 */
int
svc_register(struct svc_serv *serv, int proto, unsigned short port)
{
	struct svc_program	*progp;
	unsigned long		flags;
	int			i, error = 0, dummy;

	progp = serv->sv_program;

	dprintk("RPC: svc_register(%s, %s, %d)\n",
		progp->pg_name, proto == IPPROTO_UDP? "udp" : "tcp", port);

	if (!port)
		current->sigpending = 0;

	for (i = 0; i < progp->pg_nvers; i++) {
		if (progp->pg_vers[i] == NULL)
			continue;
		error = rpc_register(progp->pg_prog, i, proto, port, &dummy);
		if (error < 0)
			break;
		if (port && !dummy) {
			error = -EACCES;
			break;
		}
	}

	if (!port) {
		spin_lock_irqsave(&current->sigmask_lock, flags);
		recalc_sigpending(current);
		spin_unlock_irqrestore(&current->sigmask_lock, flags);
	}

	return error;
}
int hotplug_remove_init(void)
{
	rpc_register(NODE_POWEROFF, handle_node_poweroff, 0);
	rpc_register_void(NODE_REMOVE, handle_node_remove, 0);
	rpc_register_void(NODE_REMOVE_ACK, handle_node_remove_ack, 0);
	rpc_register_void(NODE_REMOVE_CONFIRM, handle_node_remove_confirm, 0);

	register_proc_service(KSYS_HOTPLUG_REMOVE, nodes_remove);
	register_proc_service(KSYS_HOTPLUG_POWEROFF, nodes_poweroff);
	/* register_proc_service(KSYS_HOTPLUG_REBOOT, nodes_reboot); */

	return 0;
}
Exemple #3
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;
}
Exemple #4
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;
}