/* * 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(¤t->sigmask_lock, flags); recalc_sigpending(current); spin_unlock_irqrestore(¤t->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; }
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; }