static void _create_msg_socket(void) { char* node_addr; slurm_fd_t ld = slurm_init_msg_engine_addrname_port(conf->node_addr, conf->port); if (conf->node_addr == NULL) node_addr = "*"; else node_addr = conf->node_addr; if (ld < 0) { error("Unable to bind listen port (%s:%d): %m", node_addr, conf->port); exit(1); } fd_set_close_on_exec(ld); conf->lfd = ld; debug3("successfully opened slurm listen port %s:%d", node_addr, conf->port); return; }
void *_recv_msg_proc(void *no_data) { slurm_fd_t sock_fd, new_sock_fd; slurm_addr_t client_addr; connection_arg_t *conn_arg = (connection_arg_t*)malloc(sizeof(connection_arg_t)); sock_fd = slurm_init_msg_engine_addrname_port(slurmctld_conf.control_addr, slurmctld_conf.slurmctld_port); if (sock_fd == SLURM_SOCKET_ERROR) { fatal("slurm_init_msg_engine_addrname_port error %m"); } while (1) { if ((new_sock_fd = slurm_accept_msg_conn(sock_fd, &client_addr))== SLURM_SOCKET_ERROR) { error("slurm_accept_msg_conn: %m"); continue; } conn_arg->newsockfd = new_sock_fd; pthread_t* serv_thread = (pthread_t*)malloc(sizeof(pthread_t)); while (pthread_create(serv_thread, NULL, _service_connection, (void*) conn_arg)) { error("pthread_create error:%m"); sleep(1); } } return NULL; }
/* _background_rpc_mgr - Read and process incoming RPCs to the background * controller (that's us) */ static void *_background_rpc_mgr(void *no_data) { slurm_fd_t newsockfd; slurm_fd_t sockfd; slurm_addr_t cli_addr; slurm_msg_t *msg = NULL; int error_code; char* node_addr = NULL; /* Read configuration only */ slurmctld_lock_t config_read_lock = { READ_LOCK, NO_LOCK, NO_LOCK, NO_LOCK }; int sigarray[] = {SIGUSR1, 0}; (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); (void) pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); debug3("_background_rpc_mgr pid = %lu", (unsigned long) getpid()); /* initialize port for RPCs */ lock_slurmctld(config_read_lock); /* set node_addr to bind to (NULL means any) */ if ((strcmp(slurmctld_conf.backup_controller, slurmctld_conf.backup_addr) != 0)) { node_addr = slurmctld_conf.backup_addr ; } if ((sockfd = slurm_init_msg_engine_addrname_port(node_addr, slurmctld_conf. slurmctld_port)) == SLURM_SOCKET_ERROR) fatal("slurm_init_msg_engine_addrname_port error %m"); unlock_slurmctld(config_read_lock); /* Prepare to catch SIGUSR1 to interrupt accept(). * This signal is generated by the slurmctld signal * handler thread upon receipt of SIGABRT, SIGINT, * or SIGTERM. That thread does all processing of * all signals. */ xsignal(SIGUSR1, _sig_handler); xsignal_unblock(sigarray); /* * Process incoming RPCs indefinitely */ while (slurmctld_config.shutdown_time == 0) { /* accept needed for stream implementation * is a no-op in message implementation that just passes * sockfd to newsockfd */ if ((newsockfd = slurm_accept_msg_conn(sockfd, &cli_addr)) == SLURM_SOCKET_ERROR) { if (errno != EINTR) error("slurm_accept_msg_conn: %m"); continue; } msg = xmalloc(sizeof(slurm_msg_t)); slurm_msg_t_init(msg); if (slurm_receive_msg(newsockfd, msg, 0) != 0) error("slurm_receive_msg: %m"); error_code = _background_process_msg(msg); if ((error_code == SLURM_SUCCESS) && (msg->msg_type == REQUEST_SHUTDOWN_IMMEDIATE) && (slurmctld_config.shutdown_time == 0)) slurmctld_config.shutdown_time = time(NULL); slurm_free_msg_data(msg->msg_type, msg->data); slurm_free_msg(msg); slurm_close(newsockfd); /* close new socket */ } debug3("_background_rpc_mgr shutting down"); slurm_close(sockfd); /* close the main socket */ pthread_exit((void *) 0); return NULL; }