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 unpack_slurmdbd_msg(slurmdbd_msg_t *resp, uint16_t rpc_version, Buf buffer) { int rc = SLURM_SUCCESS; slurm_msg_t msg; safe_unpack16(&resp->msg_type, buffer); if (rpc_version < SLURM_MIN_PROTOCOL_VERSION) { error("slurmdbd: Invalid message version=%hu, type:%hu", rpc_version, resp->msg_type); return SLURM_ERROR; } switch (resp->msg_type) { case PERSIST_RC: slurm_msg_t_init(&msg); msg.protocol_version = rpc_version; msg.msg_type = resp->msg_type; rc = unpack_msg(&msg, buffer); resp->data = msg.data; break; case REQUEST_PERSIST_INIT: resp->data = xmalloc(sizeof(slurm_msg_t)); slurm_msg_t_init(resp->data); rc = slurm_unpack_received_msg( (slurm_msg_t *)resp->data, 0, buffer); break; case DBD_ADD_ACCOUNTS: case DBD_ADD_TRES: case DBD_ADD_ASSOCS: case DBD_ADD_CLUSTERS: case DBD_ADD_FEDERATIONS: case DBD_ADD_RES: case DBD_ADD_USERS: case DBD_GOT_ACCOUNTS: case DBD_GOT_TRES: case DBD_GOT_ASSOCS: case DBD_GOT_CLUSTERS: case DBD_GOT_EVENTS: case DBD_GOT_FEDERATIONS: case DBD_GOT_JOBS: case DBD_GOT_LIST: case DBD_GOT_PROBS: case DBD_ADD_QOS: case DBD_GOT_QOS: case DBD_GOT_RESVS: case DBD_GOT_RES: case DBD_ADD_WCKEYS: case DBD_GOT_WCKEYS: case DBD_GOT_TXN: case DBD_GOT_USERS: case DBD_GOT_CONFIG: case DBD_SEND_MULT_JOB_START: case DBD_GOT_MULT_JOB_START: case DBD_SEND_MULT_MSG: case DBD_GOT_MULT_MSG: case DBD_FIX_RUNAWAY_JOB: rc = slurmdbd_unpack_list_msg( (dbd_list_msg_t **)&resp->data, rpc_version, resp->msg_type, buffer); break; case DBD_ADD_ACCOUNT_COORDS: case DBD_REMOVE_ACCOUNT_COORDS: rc = _unpack_acct_coord_msg( (dbd_acct_coord_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_ARCHIVE_LOAD: rc = slurmdb_unpack_archive_rec( &resp->data, rpc_version, buffer); break; case DBD_CLUSTER_TRES: case DBD_FLUSH_JOBS: rc = _unpack_cluster_tres_msg( (dbd_cluster_tres_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_GET_ACCOUNTS: case DBD_GET_TRES: case DBD_GET_ASSOCS: case DBD_GET_CLUSTERS: case DBD_GET_EVENTS: case DBD_GET_FEDERATIONS: case DBD_GET_JOBS_COND: case DBD_GET_PROBS: case DBD_GET_QOS: case DBD_GET_RESVS: case DBD_GET_RES: case DBD_GET_TXN: case DBD_GET_USERS: case DBD_GET_WCKEYS: case DBD_REMOVE_ACCOUNTS: case DBD_REMOVE_ASSOCS: case DBD_REMOVE_CLUSTERS: case DBD_REMOVE_FEDERATIONS: case DBD_REMOVE_QOS: case DBD_REMOVE_RES: case DBD_REMOVE_WCKEYS: case DBD_REMOVE_USERS: case DBD_ARCHIVE_DUMP: rc = _unpack_cond_msg( (dbd_cond_msg_t **)&resp->data, rpc_version, resp->msg_type, buffer); break; case DBD_GET_ASSOC_USAGE: case DBD_GOT_ASSOC_USAGE: case DBD_GET_CLUSTER_USAGE: case DBD_GOT_CLUSTER_USAGE: case DBD_GET_WCKEY_USAGE: case DBD_GOT_WCKEY_USAGE: rc = slurmdbd_unpack_usage_msg( (dbd_usage_msg_t **)&resp->data, rpc_version, resp->msg_type, buffer); break; case DBD_FINI: rc = slurmdbd_unpack_fini_msg((dbd_fini_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_JOB_COMPLETE: rc = _unpack_job_complete_msg( (dbd_job_comp_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_JOB_START: rc = _unpack_job_start_msg( &resp->data, rpc_version, buffer); break; case DBD_ID_RC: rc = slurmdbd_unpack_id_rc_msg( &resp->data, rpc_version, buffer); break; case DBD_JOB_SUSPEND: rc = _unpack_job_suspend_msg( (dbd_job_suspend_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_MODIFY_ACCOUNTS: case DBD_MODIFY_ASSOCS: case DBD_MODIFY_CLUSTERS: case DBD_MODIFY_FEDERATIONS: case DBD_MODIFY_JOB: case DBD_MODIFY_QOS: case DBD_MODIFY_RES: case DBD_MODIFY_USERS: rc = _unpack_modify_msg( (dbd_modify_msg_t **)&resp->data, rpc_version, resp->msg_type, buffer); break; case DBD_NODE_STATE: rc = _unpack_node_state_msg( (dbd_node_state_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_STEP_COMPLETE: rc = _unpack_step_complete_msg( (dbd_step_comp_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_STEP_START: rc = _unpack_step_start_msg( (dbd_step_start_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_REGISTER_CTLD: rc = _unpack_register_ctld_msg( (dbd_register_ctld_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_ROLL_USAGE: rc = _unpack_roll_usage_msg( (dbd_roll_usage_msg_t **)&resp->data, rpc_version, buffer); break; case DBD_ADD_RESV: case DBD_REMOVE_RESV: case DBD_MODIFY_RESV: rc = _unpack_rec_msg( (dbd_rec_msg_t **)&resp->data, rpc_version, resp->msg_type, buffer); break; case DBD_GET_CONFIG: rc = _unpack_config_name( (char **)&resp->data, rpc_version, buffer); break; case DBD_RECONFIG: case DBD_GET_STATS: case DBD_CLEAR_STATS: case DBD_SHUTDOWN: /* No message to unpack */ break; case DBD_GOT_STATS: rc = slurmdb_unpack_stats_msg( (void **)&resp->data, rpc_version, buffer); break; default: error("slurmdbd: Invalid message type unpack %u(%s)", resp->msg_type, slurmdbd_msg_type_2_str(resp->msg_type, 1)); return SLURM_ERROR; } return rc; unpack_error: return SLURM_ERROR; }