static int _handle_mult_rc_ret(void) { Buf buffer; uint16_t msg_type; persist_rc_msg_t *msg = NULL; dbd_list_msg_t *list_msg = NULL; int rc = SLURM_ERROR; Buf out_buf = NULL; buffer = slurm_persist_recv_msg(slurmdbd_conn); if (buffer == NULL) return rc; safe_unpack16(&msg_type, buffer); switch (msg_type) { case DBD_GOT_MULT_MSG: if (slurmdbd_unpack_list_msg( &list_msg, slurmdbd_conn->version, DBD_GOT_MULT_MSG, buffer) != SLURM_SUCCESS) { error("slurmdbd: unpack message error"); break; } slurm_mutex_lock(&agent_lock); if (agent_list) { ListIterator itr = list_iterator_create(list_msg->my_list); while ((out_buf = list_next(itr))) { Buf b; if ((rc = _unpack_return_code( slurmdbd_conn->version, out_buf)) != SLURM_SUCCESS) break; if ((b = list_dequeue(agent_list))) { free_buf(b); } else { error("slurmdbd: DBD_GOT_MULT_MSG " "unpack message error"); } } list_iterator_destroy(itr); } slurm_mutex_unlock(&agent_lock); slurmdbd_free_list_msg(list_msg); break; case PERSIST_RC: if (slurm_persist_unpack_rc_msg( &msg, buffer, slurmdbd_conn->version) == SLURM_SUCCESS) { rc = msg->rc; if (rc != SLURM_SUCCESS) { if (msg->ret_info == DBD_REGISTER_CTLD && slurm_get_accounting_storage_enforce()) { error("slurmdbd: PERSIST_RC is %d from " "%s(%u): %s", rc, slurmdbd_msg_type_2_str( msg->ret_info, 1), msg->ret_info, msg->comment); fatal("You need to add this cluster " "to accounting if you want to " "enforce associations, or no " "jobs will ever run."); } else debug("slurmdbd: PERSIST_RC is %d from " "%s(%u): %s", rc, slurmdbd_msg_type_2_str( msg->ret_info, 1), msg->ret_info, msg->comment); } slurm_persist_free_rc_msg(msg); } else error("slurmdbd: unpack message error"); break; default: error("slurmdbd: bad message type %d != PERSIST_RC", msg_type); } unpack_error: free_buf(buffer); return rc; }
extern int slurmdbd_unpack_list_msg(dbd_list_msg_t **msg, uint16_t rpc_version, slurmdbd_msg_type_t type, Buf buffer) { dbd_list_msg_t *msg_ptr = NULL; int (*my_function) (void **object, uint16_t rpc_version, Buf buffer); void (*my_destroy) (void *object); switch (type) { case DBD_ADD_ACCOUNTS: case DBD_GOT_ACCOUNTS: my_function = slurmdb_unpack_account_rec; my_destroy = slurmdb_destroy_account_rec; break; case DBD_ADD_TRES: case DBD_GOT_TRES: my_function = slurmdb_unpack_tres_rec; my_destroy = slurmdb_destroy_tres_rec; break; case DBD_ADD_ASSOCS: case DBD_GOT_ASSOCS: case DBD_GOT_PROBS: my_function = slurmdb_unpack_assoc_rec; my_destroy = slurmdb_destroy_assoc_rec; break; case DBD_ADD_CLUSTERS: case DBD_GOT_CLUSTERS: my_function = slurmdb_unpack_cluster_rec; my_destroy = slurmdb_destroy_cluster_rec; break; case DBD_ADD_FEDERATIONS: case DBD_GOT_FEDERATIONS: my_function = slurmdb_unpack_federation_rec; my_destroy = slurmdb_destroy_federation_rec; break; case DBD_GOT_CONFIG: my_function = unpack_config_key_pair; my_destroy = destroy_config_key_pair; break; case DBD_GOT_JOBS: case DBD_FIX_RUNAWAY_JOB: my_function = slurmdb_unpack_job_rec; my_destroy = slurmdb_destroy_job_rec; break; case DBD_GOT_LIST: my_function = _slurmdbd_unpackstr; my_destroy = slurm_destroy_char; break; case DBD_ADD_QOS: case DBD_GOT_QOS: my_function = slurmdb_unpack_qos_rec; my_destroy = slurmdb_destroy_qos_rec; break; case DBD_GOT_RESVS: my_function = slurmdb_unpack_reservation_rec; my_destroy = slurmdb_destroy_reservation_rec; break; case DBD_ADD_RES: case DBD_GOT_RES: my_function = slurmdb_unpack_res_rec; my_destroy = slurmdb_destroy_res_rec; break; case DBD_ADD_WCKEYS: case DBD_GOT_WCKEYS: my_function = slurmdb_unpack_wckey_rec; my_destroy = slurmdb_destroy_wckey_rec; break; case DBD_ADD_USERS: case DBD_GOT_USERS: my_function = slurmdb_unpack_user_rec; my_destroy = slurmdb_destroy_user_rec; break; case DBD_GOT_TXN: my_function = slurmdb_unpack_txn_rec; my_destroy = slurmdb_destroy_txn_rec; break; case DBD_GOT_EVENTS: my_function = slurmdb_unpack_event_rec; my_destroy = slurmdb_destroy_event_rec; break; case DBD_SEND_MULT_JOB_START: my_function = _unpack_job_start_msg; my_destroy = slurmdbd_free_job_start_msg; break; case DBD_GOT_MULT_JOB_START: my_function = slurmdbd_unpack_id_rc_msg; my_destroy = slurmdbd_free_id_rc_msg; break; case DBD_SEND_MULT_MSG: case DBD_GOT_MULT_MSG: my_function = _unpack_buffer; my_destroy = slurmdbd_free_buffer; break; default: fatal("%s: Unknown unpack type", __func__); return SLURM_ERROR; } msg_ptr = xmalloc(sizeof(dbd_list_msg_t)); *msg = msg_ptr; if (slurm_unpack_list(&msg_ptr->my_list, my_function, my_destroy, buffer, rpc_version) != SLURM_SUCCESS) goto unpack_error; safe_unpack32(&msg_ptr->return_code, buffer); return SLURM_SUCCESS; unpack_error: slurmdbd_free_list_msg(msg_ptr); *msg = NULL; return SLURM_ERROR; }