/*****************************************************************************\ * terminate message hander thread \*****************************************************************************/ extern void term_msg_thread(void) { pthread_mutex_lock(&thread_flag_mutex); if (thread_running) { int fd; slurm_addr_t addr; thread_shutdown = true; /* Open and close a connection to the listening port. * Allows slurm_accept_msg_conn() to return in * _msg_thread() so that it can check the thread_shutdown * flag. */ slurm_set_addr(&addr, sched_port, "localhost"); fd = slurm_open_stream(&addr); if (fd != -1) { /* we don't care if the open failed */ slurm_close_stream(fd); } debug2("waiting for dynalloc thread to exit"); pthread_join(msg_thread_id, NULL); msg_thread_id = 0; thread_shutdown = false; thread_running = false; debug2("join of dynalloc thread successful"); } pthread_mutex_unlock(&thread_flag_mutex); }
/* * send_slurmctld_register_req - request register from slurmctld * IN host: control host of cluster * IN port: control port of cluster * IN rpc_version: rpc version of cluster * RET: error code */ static int _send_slurmctld_register_req(slurmdb_cluster_rec_t *cluster_rec) { slurm_addr_t ctld_address; slurm_fd_t fd; int rc = SLURM_SUCCESS; slurm_set_addr_char(&ctld_address, cluster_rec->control_port, cluster_rec->control_host); fd = slurm_open_msg_conn(&ctld_address); if (fd < 0) { rc = SLURM_ERROR; } else { slurm_msg_t out_msg; slurm_msg_t_init(&out_msg); out_msg.msg_type = ACCOUNTING_REGISTER_CTLD; out_msg.flags = SLURM_GLOBAL_AUTH_KEY; out_msg.protocol_version = slurmdbd_translate_rpc(cluster_rec->rpc_version); slurm_send_node_msg(fd, &out_msg); /* We probably need to add matching recv_msg function * for an arbitray fd or should these be fire * and forget? For this, that we can probably * forget about it */ slurm_close_stream(fd); } return rc; }
/* * cluster_first_reg - ask for controller to send nodes in a down state * and jobs pending or running on first registration. * * IN host: controller host * IN port: controller port * IN rpc_version: controller rpc version * RET: error code */ extern int cluster_first_reg(char *host, uint16_t port, uint16_t rpc_version) { slurm_addr_t ctld_address; slurm_fd_t fd; int rc = SLURM_SUCCESS; info("First time to register cluster requesting " "running jobs and system information."); slurm_set_addr_char(&ctld_address, port, host); fd = slurm_open_msg_conn(&ctld_address); if (fd < 0) { error("can not open socket back to slurmctld " "%s(%u): %m", host, port); rc = SLURM_ERROR; } else { slurm_msg_t out_msg; accounting_update_msg_t update; /* We have to put this update message here so we can tell the sender to send the correct RPC version. */ memset(&update, 0, sizeof(accounting_update_msg_t)); update.rpc_version = rpc_version; slurm_msg_t_init(&out_msg); out_msg.msg_type = ACCOUNTING_FIRST_REG; out_msg.flags = SLURM_GLOBAL_AUTH_KEY; out_msg.data = &update; slurm_send_node_msg(fd, &out_msg); /* We probably need to add matching recv_msg function * for an arbitray fd or should these be fire * and forget? For this, that we can probably * forget about it */ slurm_close_stream(fd); } return rc; }