static void _connection_fini_callback(void *arg) { slurmdbd_conn_t *conn = (slurmdbd_conn_t *) arg; if (conn->conn->rem_port) { if (!shutdown_time) { slurmdb_cluster_rec_t cluster_rec; ListIterator itr; slurmdbd_conn_t *slurmdbd_conn; memset(&cluster_rec, 0, sizeof(slurmdb_cluster_rec_t)); cluster_rec.name = conn->conn->cluster_name; cluster_rec.control_host = conn->conn->rem_host; cluster_rec.control_port = conn->conn->rem_port; cluster_rec.rpc_version = conn->conn->version; cluster_rec.tres_str = conn->tres_str; debug("cluster %s has disconnected", conn->conn->cluster_name); clusteracct_storage_g_fini_ctld( conn->db_conn, &cluster_rec); slurm_mutex_lock(®istered_lock); itr = list_iterator_create(registered_clusters); while ((slurmdbd_conn = list_next(itr))) { if (conn == slurmdbd_conn) { list_delete_item(itr); break; } } list_iterator_destroy(itr); slurm_mutex_unlock(®istered_lock); } /* needs to be the last thing done */ acct_storage_g_commit(conn->db_conn, 1); } acct_storage_g_close_connection(&conn->db_conn); /* handled directly in the internal persist_conn code */ //slurm_persist_conn_members_destroy(&conn->conn); xfree(conn->tres_str); xfree(conn); }
static void _request_registrations(void *db_conn) { List cluster_list = acct_storage_g_get_clusters( db_conn, getuid(), NULL); ListIterator itr; slurmdb_cluster_rec_t *cluster_rec = NULL; if (!cluster_list) return; itr = list_iterator_create(cluster_list); while ((cluster_rec = list_next(itr))) { if (!cluster_rec->control_port || (cluster_rec->rpc_version < 9)) continue; if (_send_slurmctld_register_req(cluster_rec) != SLURM_SUCCESS) /* mark this cluster as unresponsive */ clusteracct_storage_g_fini_ctld(db_conn, cluster_rec); } list_iterator_destroy(itr); list_destroy(cluster_list); }
static void * _service_connection(void *arg) { slurmdbd_conn_t *conn = (slurmdbd_conn_t *) arg; uint32_t nw_size = 0, msg_size = 0, uid = NO_VAL; char *msg = NULL; ssize_t msg_read = 0, offset = 0; bool fini = false, first = true; Buf buffer = NULL; int rc = SLURM_SUCCESS; debug2("Opened connection %d from %s", conn->newsockfd, conn->ip); while (!fini) { if (!_fd_readable(conn->newsockfd)) break; /* problem with this socket */ msg_read = read(conn->newsockfd, &nw_size, sizeof(nw_size)); if (msg_read == 0) /* EOF */ break; if (msg_read != sizeof(nw_size)) { error("Could not read msg_size from " "connection %d(%s) uid(%d)", conn->newsockfd, conn->ip, uid); break; } msg_size = ntohl(nw_size); if ((msg_size < 2) || (msg_size > MAX_MSG_SIZE)) { error("Invalid msg_size (%u) from " "connection %d(%s) uid(%d)", msg_size, conn->newsockfd, conn->ip, uid); break; } msg = xmalloc(msg_size); offset = 0; while (msg_size > offset) { if (!_fd_readable(conn->newsockfd)) break; /* problem with this socket */ msg_read = read(conn->newsockfd, (msg + offset), (msg_size - offset)); if (msg_read <= 0) { error("read(%d): %m", conn->newsockfd); break; } offset += msg_read; } if (msg_size == offset) { rc = proc_req( conn, msg, msg_size, first, &buffer, &uid); first = false; if (rc != SLURM_SUCCESS && rc != ACCOUNTING_FIRST_REG) { error("Processing last message from " "connection %d(%s) uid(%d)", conn->newsockfd, conn->ip, uid); if (rc == ESLURM_ACCESS_DENIED || rc == SLURM_PROTOCOL_VERSION_ERROR) fini = true; } } else { buffer = make_dbd_rc_msg(conn->rpc_version, SLURM_ERROR, "Bad offset", 0); fini = true; } (void) _send_resp(conn->newsockfd, buffer); xfree(msg); } if (conn->ctld_port) { if (!shutdown_time) { slurmdb_cluster_rec_t cluster_rec; ListIterator itr; slurmdbd_conn_t *slurmdbd_conn; memset(&cluster_rec, 0, sizeof(slurmdb_cluster_rec_t)); cluster_rec.name = conn->cluster_name; cluster_rec.control_host = conn->ip; cluster_rec.control_port = conn->ctld_port; cluster_rec.cpu_count = conn->cluster_cpus; debug("cluster %s has disconnected", conn->cluster_name); clusteracct_storage_g_fini_ctld( conn->db_conn, &cluster_rec); slurm_mutex_lock(®istered_lock); itr = list_iterator_create(registered_clusters); while ((slurmdbd_conn = list_next(itr))) { if (conn == slurmdbd_conn) { list_delete_item(itr); break; } } list_iterator_destroy(itr); slurm_mutex_unlock(®istered_lock); } /* needs to be the last thing done */ acct_storage_g_commit(conn->db_conn, 1); } acct_storage_g_close_connection(&conn->db_conn); if (slurm_close(conn->newsockfd) < 0) error("close(%d): %m(%s)", conn->newsockfd, conn->ip); else debug2("Closed connection %d uid(%d)", conn->newsockfd, uid); xfree(conn->cluster_name); xfree(conn); _free_server_thread(pthread_self()); return NULL; }