| /****************************************************************************\ |
| * slurmdbd_pack.c - functions to pack SlurmDBD RPCs |
| ***************************************************************************** |
| * Copyright (C) SchedMD LLC. |
| * Copyright (C) 2008-2010 Lawrence Livermore National Security. |
| * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| * Written by Morris Jette <jette1@llnl.gov> |
| * CODE-OCEC-09-009. All rights reserved. |
| * |
| * This file is part of Slurm, a resource management program. |
| * For details, see <https://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * Slurm is free software; you can redistribute it and/or modify it under |
| * the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * Slurm is distributed in the hope that it will be useful, but WITHOUT ANY |
| * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| * details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with Slurm; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| |
| #include "src/interfaces/hash.h" |
| #include "src/interfaces/jobacct_gather.h" |
| #include "src/common/slurm_protocol_pack.h" |
| #include "src/common/slurmdb_pack.h" |
| #include "src/common/slurmdbd_defs.h" |
| #include "src/common/slurmdbd_pack.h" |
| #include "src/common/xmalloc.h" |
| #include "src/common/xstring.h" |
| |
| /* |
| * Define slurm-specific aliases for use by plugins, see slurm_xlator.h |
| * for details. |
| */ |
| strong_alias(pack_slurmdbd_msg, slurm_pack_slurmdbd_msg); |
| strong_alias(unpack_slurmdbd_msg, slurm_unpack_slurmdbd_msg); |
| strong_alias(slurmdbd_pack_fini_msg, slurm_slurmdbd_pack_fini_msg); |
| |
| |
| static int _unpack_config_name(char **object, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| char *config_name; |
| |
| safe_unpackstr(&config_name, buffer); |
| *object = config_name; |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| *object = NULL; |
| return SLURM_ERROR; |
| } |
| |
| /****************************************************************************\ |
| * Pack and unpack data structures |
| \****************************************************************************/ |
| static void _pack_acct_coord_msg(dbd_acct_coord_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| char *acct = NULL; |
| list_itr_t *itr = NULL; |
| uint32_t count = 0; |
| |
| if (msg->acct_list) |
| count = list_count(msg->acct_list); |
| |
| pack32(count, buffer); |
| if (count) { |
| itr = list_iterator_create(msg->acct_list); |
| while ((acct = list_next(itr))) { |
| packstr(acct, buffer); |
| } |
| list_iterator_destroy(itr); |
| } |
| |
| slurmdb_pack_user_cond(msg->cond, rpc_version, buffer); |
| } |
| |
| static int _unpack_acct_coord_msg(dbd_acct_coord_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| int i; |
| char *acct = NULL; |
| uint32_t count = 0; |
| dbd_acct_coord_msg_t *msg_ptr = xmalloc(sizeof(dbd_acct_coord_msg_t)); |
| *msg = msg_ptr; |
| |
| safe_unpack32(&count, buffer); |
| if (count) { |
| msg_ptr->acct_list = list_create(xfree_ptr); |
| for(i=0; i<count; i++) { |
| safe_unpackstr(&acct, buffer); |
| list_append(msg_ptr->acct_list, acct); |
| } |
| } |
| |
| if (slurmdb_unpack_user_cond((void *)&msg_ptr->cond, |
| rpc_version, buffer) |
| == SLURM_ERROR) |
| goto unpack_error; |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_acct_coord_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_cluster_tres_msg(dbd_cluster_tres_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| packstr(msg->cluster_nodes, buffer); |
| pack_time(msg->event_time, buffer); |
| packstr(msg->tres_str, buffer); |
| } |
| } |
| |
| static int _unpack_cluster_tres_msg(dbd_cluster_tres_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_cluster_tres_msg_t *msg_ptr; |
| |
| msg_ptr = xmalloc(sizeof(dbd_cluster_tres_msg_t)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->cluster_nodes, buffer); |
| safe_unpack_time(&msg_ptr->event_time, buffer); |
| safe_unpackstr(&msg_ptr->tres_str, buffer); |
| } |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_cluster_tres_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_rec_msg(dbd_rec_msg_t *msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| void (*my_function) (void *object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_ADD_RESV: |
| case DBD_REMOVE_RESV: |
| case DBD_MODIFY_RESV: |
| my_function = slurmdb_pack_reservation_rec; |
| break; |
| default: |
| fatal("Unknown pack type"); |
| return; |
| } |
| |
| (*(my_function))(msg->rec, rpc_version, buffer); |
| } |
| |
| static int _unpack_rec_msg(dbd_rec_msg_t **msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| dbd_rec_msg_t *msg_ptr = NULL; |
| int (*my_function) (void **object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_ADD_RESV: |
| case DBD_REMOVE_RESV: |
| case DBD_MODIFY_RESV: |
| my_function = slurmdb_unpack_reservation_rec; |
| break; |
| default: |
| fatal("%s: Unknown unpack type", __func__); |
| return SLURM_ERROR; |
| } |
| |
| msg_ptr = xmalloc(sizeof(dbd_rec_msg_t)); |
| *msg = msg_ptr; |
| |
| if ((*(my_function))(&msg_ptr->rec, rpc_version, buffer) == SLURM_ERROR) |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_rec_msg(msg_ptr, type); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_cond_msg(dbd_cond_msg_t *msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| void (*my_function) (void *object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_GET_ACCOUNTS: |
| case DBD_REMOVE_ACCOUNTS: |
| my_function = slurmdb_pack_account_cond; |
| break; |
| case DBD_GET_TRES: |
| my_function = slurmdb_pack_tres_cond; |
| break; |
| case DBD_GET_ASSOCS: |
| case DBD_GET_PROBS: |
| case DBD_REMOVE_ASSOCS: |
| my_function = slurmdb_pack_assoc_cond; |
| break; |
| case DBD_GET_CLUSTERS: |
| case DBD_REMOVE_CLUSTERS: |
| my_function = slurmdb_pack_cluster_cond; |
| break; |
| case DBD_GET_FEDERATIONS: |
| case DBD_REMOVE_FEDERATIONS: |
| my_function = slurmdb_pack_federation_cond; |
| break; |
| case DBD_GET_JOBS_COND: |
| my_function = slurmdb_pack_job_cond; |
| break; |
| case DBD_GET_QOS: |
| case DBD_REMOVE_QOS: |
| my_function = slurmdb_pack_qos_cond; |
| break; |
| case DBD_GET_RES: |
| case DBD_REMOVE_RES: |
| my_function = slurmdb_pack_res_cond; |
| break; |
| case DBD_GET_WCKEYS: |
| case DBD_REMOVE_WCKEYS: |
| my_function = slurmdb_pack_wckey_cond; |
| break; |
| case DBD_GET_USERS: |
| case DBD_REMOVE_USERS: |
| my_function = slurmdb_pack_user_cond; |
| break; |
| case DBD_GET_TXN: |
| my_function = slurmdb_pack_txn_cond; |
| break; |
| case DBD_ARCHIVE_DUMP: |
| my_function = slurmdb_pack_archive_cond; |
| break; |
| case DBD_GET_RESVS: |
| my_function = slurmdb_pack_reservation_cond; |
| break; |
| case DBD_GET_EVENTS: |
| my_function = slurmdb_pack_event_cond; |
| break; |
| case DBD_GET_INSTANCES: |
| my_function = slurmdb_pack_instance_cond; |
| break; |
| default: |
| fatal("Unknown pack type"); |
| return; |
| } |
| |
| (*(my_function))(msg->cond, rpc_version, buffer); |
| } |
| |
| static int _unpack_cond_msg(dbd_cond_msg_t **msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| dbd_cond_msg_t *msg_ptr = NULL; |
| int (*my_function) (void **object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_GET_ACCOUNTS: |
| case DBD_REMOVE_ACCOUNTS: |
| my_function = slurmdb_unpack_account_cond; |
| break; |
| case DBD_GET_TRES: |
| my_function = slurmdb_unpack_tres_cond; |
| break; |
| case DBD_GET_ASSOCS: |
| case DBD_GET_PROBS: |
| case DBD_REMOVE_ASSOCS: |
| my_function = slurmdb_unpack_assoc_cond; |
| break; |
| case DBD_GET_CLUSTERS: |
| case DBD_REMOVE_CLUSTERS: |
| my_function = slurmdb_unpack_cluster_cond; |
| break; |
| case DBD_GET_FEDERATIONS: |
| case DBD_REMOVE_FEDERATIONS: |
| my_function = slurmdb_unpack_federation_cond; |
| break; |
| case DBD_GET_JOBS_COND: |
| my_function = slurmdb_unpack_job_cond; |
| break; |
| case DBD_GET_QOS: |
| case DBD_REMOVE_QOS: |
| my_function = slurmdb_unpack_qos_cond; |
| break; |
| case DBD_GET_RES: |
| case DBD_REMOVE_RES: |
| my_function = slurmdb_unpack_res_cond; |
| break; |
| case DBD_GET_WCKEYS: |
| case DBD_REMOVE_WCKEYS: |
| my_function = slurmdb_unpack_wckey_cond; |
| break; |
| case DBD_GET_USERS: |
| case DBD_REMOVE_USERS: |
| my_function = slurmdb_unpack_user_cond; |
| break; |
| case DBD_GET_TXN: |
| my_function = slurmdb_unpack_txn_cond; |
| break; |
| case DBD_ARCHIVE_DUMP: |
| my_function = slurmdb_unpack_archive_cond; |
| break; |
| case DBD_GET_RESVS: |
| my_function = slurmdb_unpack_reservation_cond; |
| break; |
| case DBD_GET_EVENTS: |
| my_function = slurmdb_unpack_event_cond; |
| break; |
| case DBD_GET_INSTANCES: |
| my_function = slurmdb_unpack_instance_cond; |
| break; |
| default: |
| fatal("%s: Unknown unpack type", __func__); |
| return SLURM_ERROR; |
| } |
| |
| msg_ptr = xmalloc(sizeof(dbd_cond_msg_t)); |
| *msg = msg_ptr; |
| |
| if ((*(my_function))(&msg_ptr->cond, rpc_version, buffer) == |
| SLURM_ERROR) |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_cond_msg(msg_ptr, type); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_job_complete_msg(dbd_job_comp_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| packstr(msg->admin_comment, buffer); |
| pack32(msg->assoc_id, buffer); |
| packstr(msg->comment, buffer); |
| pack64(msg->db_index, buffer); |
| pack32(msg->derived_ec, buffer); |
| pack_time(msg->end_time, buffer); |
| pack32(msg->exit_code, buffer); |
| packstr(msg->extra, buffer); |
| packstr(msg->failed_node, buffer); |
| pack32(msg->job_id, buffer); |
| pack32(msg->job_state, buffer); |
| packstr(msg->nodes, buffer); |
| pack32(msg->req_uid, buffer); |
| pack_time(msg->start_time, buffer); |
| pack_time(msg->submit_time, buffer); |
| packstr(msg->system_comment, buffer); |
| packstr(msg->tres_alloc_str, buffer); |
| } |
| } |
| |
| static int _unpack_job_complete_msg(dbd_job_comp_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_job_comp_msg_t *msg_ptr = xmalloc(sizeof(dbd_job_comp_msg_t)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->admin_comment, buffer); |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpackstr(&msg_ptr->comment, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpack32(&msg_ptr->derived_ec, buffer); |
| safe_unpack_time(&msg_ptr->end_time, buffer); |
| safe_unpack32(&msg_ptr->exit_code, buffer); |
| safe_unpackstr(&msg_ptr->extra, buffer); |
| safe_unpackstr(&msg_ptr->failed_node, buffer); |
| safe_unpack32(&msg_ptr->job_id, buffer); |
| safe_unpack32(&msg_ptr->job_state, buffer); |
| safe_unpackstr(&msg_ptr->nodes, buffer); |
| safe_unpack32(&msg_ptr->req_uid, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpack_time(&msg_ptr->submit_time, buffer); |
| safe_unpackstr(&msg_ptr->system_comment, buffer); |
| safe_unpackstr(&msg_ptr->tres_alloc_str, buffer); |
| } else |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_job_complete_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_job_start_msg(void *in, uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_job_start_msg_t *msg = (dbd_job_start_msg_t *)in; |
| |
| /* |
| * Generate node_inx outside of locks -- not _setup_job_start_msg(). |
| * See slurmdbd/acct_storage_p_node_inx() for need to |
| * use_create_node_inx(). |
| * |
| * msg->node_inx shouldn't be set when it's being packed for the |
| * first time. |
| * |
| * msg->node_inx will be set if messages were loaded from state |
| * with a different major version. See _load_dbd_state() which |
| * unpacks and packs the message at the current protocol |
| * version. |
| */ |
| if (!msg->node_inx) |
| msg->node_inx = acct_storage_g_node_inx(NULL, msg->nodes); |
| |
| if (rpc_version >= SLURM_25_05_PROTOCOL_VERSION) { |
| packstr(msg->account, buffer); |
| pack32(msg->alloc_nodes, buffer); |
| pack32(msg->array_job_id, buffer); |
| pack32(msg->array_max_tasks, buffer); |
| pack32(msg->array_task_id, buffer); |
| packstr(msg->array_task_str, buffer); |
| pack32(msg->array_task_pending, buffer); |
| pack32(msg->assoc_id, buffer); |
| packstr(msg->constraints, buffer); |
| packstr(msg->container, buffer); |
| pack32(msg->db_flags, buffer); |
| pack64(msg->db_index, buffer); |
| pack_time(msg->eligible_time, buffer); |
| pack32(msg->gid, buffer); |
| packstr(msg->gres_used, buffer); |
| pack32(msg->job_id, buffer); |
| pack32(msg->job_state, buffer); |
| pack32(msg->state_reason_prev, buffer); |
| packstr(msg->licenses, buffer); |
| packstr(msg->mcs_label, buffer); |
| packstr(msg->name, buffer); |
| packstr(msg->nodes, buffer); |
| packstr(msg->node_inx, buffer); |
| pack32(msg->het_job_id, buffer); |
| pack32(msg->het_job_offset, buffer); |
| packstr(msg->partition, buffer); |
| pack32(msg->priority, buffer); |
| pack32(msg->qos_id, buffer); |
| packstr(msg->qos_req, buffer); |
| pack32(msg->req_cpus, buffer); |
| pack64(msg->req_mem, buffer); |
| pack16(msg->restart_cnt, buffer); |
| pack32(msg->resv_id, buffer); |
| packstr(msg->resv_req, buffer); |
| pack16(msg->segment_size, buffer); |
| pack_time(msg->start_time, buffer); |
| packstr(msg->std_err, buffer); |
| packstr(msg->std_in, buffer); |
| packstr(msg->std_out, buffer); |
| packstr(msg->submit_line, buffer); |
| pack_time(msg->submit_time, buffer); |
| pack32(msg->timelimit, buffer); |
| packstr(msg->tres_alloc_str, buffer); |
| packstr(msg->tres_req_str, buffer); |
| pack32(msg->uid, buffer); |
| packstr(msg->wckey, buffer); |
| packstr(msg->work_dir, buffer); |
| packstr(msg->env_hash, buffer); |
| packstr(msg->script_hash, buffer); |
| } else if (rpc_version >= SLURM_24_11_PROTOCOL_VERSION) { |
| packstr(msg->account, buffer); |
| pack32(msg->alloc_nodes, buffer); |
| pack32(msg->array_job_id, buffer); |
| pack32(msg->array_max_tasks, buffer); |
| pack32(msg->array_task_id, buffer); |
| packstr(msg->array_task_str, buffer); |
| pack32(msg->array_task_pending, buffer); |
| pack32(msg->assoc_id, buffer); |
| packstr(msg->constraints, buffer); |
| packstr(msg->container, buffer); |
| pack32(msg->db_flags, buffer); |
| pack64(msg->db_index, buffer); |
| pack_time(msg->eligible_time, buffer); |
| pack32(msg->gid, buffer); |
| packstr(msg->gres_used, buffer); |
| pack32(msg->job_id, buffer); |
| pack32(msg->job_state, buffer); |
| pack32(msg->state_reason_prev, buffer); |
| packstr(msg->licenses, buffer); |
| packstr(msg->mcs_label, buffer); |
| packstr(msg->name, buffer); |
| packstr(msg->nodes, buffer); |
| packstr(msg->node_inx, buffer); |
| pack32(msg->het_job_id, buffer); |
| pack32(msg->het_job_offset, buffer); |
| packstr(msg->partition, buffer); |
| pack32(msg->priority, buffer); |
| pack32(msg->qos_id, buffer); |
| packstr(msg->qos_req, buffer); |
| pack32(msg->req_cpus, buffer); |
| pack64(msg->req_mem, buffer); |
| pack16(msg->restart_cnt, buffer); |
| pack32(msg->resv_id, buffer); |
| pack_time(msg->start_time, buffer); |
| packstr(msg->std_err, buffer); |
| packstr(msg->std_in, buffer); |
| packstr(msg->std_out, buffer); |
| packstr(msg->submit_line, buffer); |
| pack_time(msg->submit_time, buffer); |
| pack32(msg->timelimit, buffer); |
| packstr(msg->tres_alloc_str, buffer); |
| packstr(msg->tres_req_str, buffer); |
| pack32(msg->uid, buffer); |
| packstr(msg->wckey, buffer); |
| packstr(msg->work_dir, buffer); |
| packstr(msg->env_hash, buffer); |
| packstr(msg->script_hash, buffer); |
| } else if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| packstr(msg->account, buffer); |
| pack32(msg->alloc_nodes, buffer); |
| pack32(msg->array_job_id, buffer); |
| pack32(msg->array_max_tasks, buffer); |
| pack32(msg->array_task_id, buffer); |
| packstr(msg->array_task_str, buffer); |
| pack32(msg->array_task_pending, buffer); |
| pack32(msg->assoc_id, buffer); |
| packstr(msg->constraints, buffer); |
| packstr(msg->container, buffer); |
| pack32(msg->db_flags, buffer); |
| pack64(msg->db_index, buffer); |
| pack_time(msg->eligible_time, buffer); |
| pack32(msg->gid, buffer); |
| packstr(msg->gres_used, buffer); |
| pack32(msg->job_id, buffer); |
| pack32(msg->job_state, buffer); |
| pack32(msg->state_reason_prev, buffer); |
| packstr(msg->licenses, buffer); |
| packstr(msg->mcs_label, buffer); |
| packstr(msg->name, buffer); |
| packstr(msg->nodes, buffer); |
| packstr(msg->node_inx, buffer); |
| pack32(msg->het_job_id, buffer); |
| pack32(msg->het_job_offset, buffer); |
| packstr(msg->partition, buffer); |
| pack32(msg->priority, buffer); |
| pack32(msg->qos_id, buffer); |
| pack32(msg->req_cpus, buffer); |
| pack64(msg->req_mem, buffer); |
| pack32(msg->resv_id, buffer); |
| pack_time(msg->start_time, buffer); |
| packstr(msg->std_err, buffer); |
| packstr(msg->std_in, buffer); |
| packstr(msg->std_out, buffer); |
| packstr(msg->submit_line, buffer); |
| pack_time(msg->submit_time, buffer); |
| pack32(msg->timelimit, buffer); |
| packstr(msg->tres_alloc_str, buffer); |
| packstr(msg->tres_req_str, buffer); |
| pack32(msg->uid, buffer); |
| packstr(msg->wckey, buffer); |
| packstr(msg->work_dir, buffer); |
| packstr(msg->env_hash, buffer); |
| packstr(msg->script_hash, buffer); |
| } |
| } |
| |
| static int _unpack_job_start_msg(void **msg, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| dbd_job_start_msg_t *msg_ptr = xmalloc(sizeof(dbd_job_start_msg_t)); |
| *msg = msg_ptr; |
| |
| msg_ptr->array_job_id = 0; |
| msg_ptr->array_task_id = NO_VAL; |
| |
| if (rpc_version >= SLURM_25_05_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->account, buffer); |
| safe_unpack32(&msg_ptr->alloc_nodes, buffer); |
| safe_unpack32(&msg_ptr->array_job_id, buffer); |
| safe_unpack32(&msg_ptr->array_max_tasks, buffer); |
| safe_unpack32(&msg_ptr->array_task_id, buffer); |
| safe_unpackstr(&msg_ptr->array_task_str, buffer); |
| safe_unpack32(&msg_ptr->array_task_pending, buffer); |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpackstr(&msg_ptr->constraints, buffer); |
| safe_unpackstr(&msg_ptr->container, buffer); |
| safe_unpack32(&msg_ptr->db_flags, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpack_time(&msg_ptr->eligible_time, buffer); |
| safe_unpack32(&msg_ptr->gid, buffer); |
| safe_unpackstr(&msg_ptr->gres_used, buffer); |
| safe_unpack32(&msg_ptr->job_id, buffer); |
| safe_unpack32(&msg_ptr->job_state, buffer); |
| safe_unpack32(&msg_ptr->state_reason_prev, buffer); |
| safe_unpackstr(&msg_ptr->licenses, buffer); |
| safe_unpackstr(&msg_ptr->mcs_label, buffer); |
| safe_unpackstr(&msg_ptr->name, buffer); |
| safe_unpackstr(&msg_ptr->nodes, buffer); |
| safe_unpackstr(&msg_ptr->node_inx, buffer); |
| safe_unpack32(&msg_ptr->het_job_id, buffer); |
| safe_unpack32(&msg_ptr->het_job_offset, buffer); |
| safe_unpackstr(&msg_ptr->partition, buffer); |
| safe_unpack32(&msg_ptr->priority, buffer); |
| safe_unpack32(&msg_ptr->qos_id, buffer); |
| safe_unpackstr(&msg_ptr->qos_req, buffer); |
| safe_unpack32(&msg_ptr->req_cpus, buffer); |
| safe_unpack64(&msg_ptr->req_mem, buffer); |
| safe_unpack16(&msg_ptr->restart_cnt, buffer); |
| safe_unpack32(&msg_ptr->resv_id, buffer); |
| safe_unpackstr(&msg_ptr->resv_req, buffer); |
| safe_unpack16(&msg_ptr->segment_size, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpackstr(&msg_ptr->std_err, buffer); |
| safe_unpackstr(&msg_ptr->std_in, buffer); |
| safe_unpackstr(&msg_ptr->std_out, buffer); |
| safe_unpackstr(&msg_ptr->submit_line, buffer); |
| safe_unpack_time(&msg_ptr->submit_time, buffer); |
| safe_unpack32(&msg_ptr->timelimit, buffer); |
| safe_unpackstr(&msg_ptr->tres_alloc_str, buffer); |
| safe_unpackstr(&msg_ptr->tres_req_str, buffer); |
| safe_unpack32(&msg_ptr->uid, buffer); |
| safe_unpackstr(&msg_ptr->wckey, buffer); |
| safe_unpackstr(&msg_ptr->work_dir, buffer); |
| safe_unpackstr(&msg_ptr->env_hash, buffer); |
| safe_unpackstr(&msg_ptr->script_hash, buffer); |
| } else if (rpc_version >= SLURM_24_11_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->account, buffer); |
| safe_unpack32(&msg_ptr->alloc_nodes, buffer); |
| safe_unpack32(&msg_ptr->array_job_id, buffer); |
| safe_unpack32(&msg_ptr->array_max_tasks, buffer); |
| safe_unpack32(&msg_ptr->array_task_id, buffer); |
| safe_unpackstr(&msg_ptr->array_task_str, buffer); |
| safe_unpack32(&msg_ptr->array_task_pending, buffer); |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpackstr(&msg_ptr->constraints, buffer); |
| safe_unpackstr(&msg_ptr->container, buffer); |
| safe_unpack32(&msg_ptr->db_flags, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpack_time(&msg_ptr->eligible_time, buffer); |
| safe_unpack32(&msg_ptr->gid, buffer); |
| safe_unpackstr(&msg_ptr->gres_used, buffer); |
| safe_unpack32(&msg_ptr->job_id, buffer); |
| safe_unpack32(&msg_ptr->job_state, buffer); |
| safe_unpack32(&msg_ptr->state_reason_prev, buffer); |
| safe_unpackstr(&msg_ptr->licenses, buffer); |
| safe_unpackstr(&msg_ptr->mcs_label, buffer); |
| safe_unpackstr(&msg_ptr->name, buffer); |
| safe_unpackstr(&msg_ptr->nodes, buffer); |
| safe_unpackstr(&msg_ptr->node_inx, buffer); |
| safe_unpack32(&msg_ptr->het_job_id, buffer); |
| safe_unpack32(&msg_ptr->het_job_offset, buffer); |
| safe_unpackstr(&msg_ptr->partition, buffer); |
| safe_unpack32(&msg_ptr->priority, buffer); |
| safe_unpack32(&msg_ptr->qos_id, buffer); |
| safe_unpackstr(&msg_ptr->qos_req, buffer); |
| safe_unpack32(&msg_ptr->req_cpus, buffer); |
| safe_unpack64(&msg_ptr->req_mem, buffer); |
| safe_unpack16(&msg_ptr->restart_cnt, buffer); |
| safe_unpack32(&msg_ptr->resv_id, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpackstr(&msg_ptr->std_err, buffer); |
| safe_unpackstr(&msg_ptr->std_in, buffer); |
| safe_unpackstr(&msg_ptr->std_out, buffer); |
| safe_unpackstr(&msg_ptr->submit_line, buffer); |
| safe_unpack_time(&msg_ptr->submit_time, buffer); |
| safe_unpack32(&msg_ptr->timelimit, buffer); |
| safe_unpackstr(&msg_ptr->tres_alloc_str, buffer); |
| safe_unpackstr(&msg_ptr->tres_req_str, buffer); |
| safe_unpack32(&msg_ptr->uid, buffer); |
| safe_unpackstr(&msg_ptr->wckey, buffer); |
| safe_unpackstr(&msg_ptr->work_dir, buffer); |
| safe_unpackstr(&msg_ptr->env_hash, buffer); |
| safe_unpackstr(&msg_ptr->script_hash, buffer); |
| } else if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->account, buffer); |
| safe_unpack32(&msg_ptr->alloc_nodes, buffer); |
| safe_unpack32(&msg_ptr->array_job_id, buffer); |
| safe_unpack32(&msg_ptr->array_max_tasks, buffer); |
| safe_unpack32(&msg_ptr->array_task_id, buffer); |
| safe_unpackstr(&msg_ptr->array_task_str, buffer); |
| safe_unpack32(&msg_ptr->array_task_pending, buffer); |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpackstr(&msg_ptr->constraints, buffer); |
| safe_unpackstr(&msg_ptr->container, buffer); |
| safe_unpack32(&msg_ptr->db_flags, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| if (msg_ptr->db_index && (msg_ptr->db_index != NO_VAL64)) { |
| msg_ptr->db_flags |= SLURMDB_JOB_FLAG_START_R; |
| } |
| safe_unpack_time(&msg_ptr->eligible_time, buffer); |
| safe_unpack32(&msg_ptr->gid, buffer); |
| safe_unpackstr(&msg_ptr->gres_used, buffer); |
| safe_unpack32(&msg_ptr->job_id, buffer); |
| safe_unpack32(&msg_ptr->job_state, buffer); |
| safe_unpack32(&msg_ptr->state_reason_prev, buffer); |
| safe_unpackstr(&msg_ptr->licenses, buffer); |
| safe_unpackstr(&msg_ptr->mcs_label, buffer); |
| safe_unpackstr(&msg_ptr->name, buffer); |
| safe_unpackstr(&msg_ptr->nodes, buffer); |
| safe_unpackstr(&msg_ptr->node_inx, buffer); |
| safe_unpack32(&msg_ptr->het_job_id, buffer); |
| safe_unpack32(&msg_ptr->het_job_offset, buffer); |
| safe_unpackstr(&msg_ptr->partition, buffer); |
| safe_unpack32(&msg_ptr->priority, buffer); |
| safe_unpack32(&msg_ptr->qos_id, buffer); |
| safe_unpack32(&msg_ptr->req_cpus, buffer); |
| safe_unpack64(&msg_ptr->req_mem, buffer); |
| safe_unpack32(&msg_ptr->resv_id, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpackstr(&msg_ptr->std_err, buffer); |
| safe_unpackstr(&msg_ptr->std_in, buffer); |
| safe_unpackstr(&msg_ptr->std_out, buffer); |
| safe_unpackstr(&msg_ptr->submit_line, buffer); |
| safe_unpack_time(&msg_ptr->submit_time, buffer); |
| safe_unpack32(&msg_ptr->timelimit, buffer); |
| safe_unpackstr(&msg_ptr->tres_alloc_str, buffer); |
| safe_unpackstr(&msg_ptr->tres_req_str, buffer); |
| safe_unpack32(&msg_ptr->uid, buffer); |
| safe_unpackstr(&msg_ptr->wckey, buffer); |
| safe_unpackstr(&msg_ptr->work_dir, buffer); |
| safe_unpackstr(&msg_ptr->env_hash, buffer); |
| safe_unpackstr(&msg_ptr->script_hash, buffer); |
| } else |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_job_start_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_job_heavy_msg(void *in, uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_job_heavy_msg_t *msg = (dbd_job_heavy_msg_t *)in; |
| |
| if (msg->script_buf) |
| msg->script = msg->script_buf->head; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| packstr(msg->env, buffer); |
| packstr(msg->env_hash, buffer); |
| packstr(msg->script, buffer); |
| packstr(msg->script_hash, buffer); |
| } |
| |
| if (msg->script_buf) |
| msg->script = NULL; |
| } |
| |
| static int _unpack_job_heavy_msg(void **msg, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| dbd_job_heavy_msg_t *msg_ptr = xmalloc(sizeof(*msg_ptr)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->env, buffer); |
| safe_unpackstr(&msg_ptr->env_hash, buffer); |
| safe_unpackstr(&msg_ptr->script, buffer); |
| safe_unpackstr(&msg_ptr->script_hash, buffer); |
| } else |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_job_heavy_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| |
| } |
| |
| static void _pack_job_suspend_msg(dbd_job_suspend_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| pack32(msg->assoc_id, buffer); |
| pack64(msg->db_index, buffer); |
| pack32(msg->job_id, buffer); |
| pack32(msg->job_state, buffer); |
| pack_time(msg->submit_time, buffer); |
| pack_time(msg->suspend_time, buffer); |
| } |
| } |
| |
| static int _unpack_job_suspend_msg(dbd_job_suspend_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_job_suspend_msg_t *msg_ptr = xmalloc(sizeof(dbd_job_suspend_msg_t)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpack32(&msg_ptr->job_id, buffer); |
| safe_unpack32(&msg_ptr->job_state, buffer); |
| safe_unpack_time(&msg_ptr->submit_time, buffer); |
| safe_unpack_time(&msg_ptr->suspend_time, buffer); |
| } |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_job_suspend_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_modify_msg(dbd_modify_msg_t *msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| void (*my_cond) (void *object, uint16_t rpc_version, buf_t *buffer); |
| void (*my_rec) (void *object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_MODIFY_ACCOUNTS: |
| my_cond = slurmdb_pack_account_cond; |
| my_rec = slurmdb_pack_account_rec; |
| break; |
| case DBD_MODIFY_ASSOCS: |
| my_cond = slurmdb_pack_assoc_cond; |
| my_rec = slurmdb_pack_assoc_rec; |
| break; |
| case DBD_MODIFY_CLUSTERS: |
| my_cond = slurmdb_pack_cluster_cond; |
| my_rec = slurmdb_pack_cluster_rec; |
| break; |
| case DBD_MODIFY_FEDERATIONS: |
| my_cond = slurmdb_pack_federation_cond; |
| my_rec = slurmdb_pack_federation_rec; |
| break; |
| case DBD_MODIFY_JOB: |
| my_cond = slurmdb_pack_job_cond; |
| my_rec = slurmdb_pack_job_rec; |
| break; |
| case DBD_MODIFY_QOS: |
| my_cond = slurmdb_pack_qos_cond; |
| my_rec = slurmdb_pack_qos_rec; |
| break; |
| case DBD_MODIFY_RES: |
| my_cond = slurmdb_pack_res_cond; |
| my_rec = slurmdb_pack_res_rec; |
| break; |
| case DBD_MODIFY_USERS: |
| my_cond = slurmdb_pack_user_cond; |
| my_rec = slurmdb_pack_user_rec; |
| break; |
| case DBD_ADD_ACCOUNTS_COND: |
| my_cond = slurmdb_pack_add_assoc_cond; |
| my_rec = slurmdb_pack_account_rec; |
| break; |
| case DBD_ADD_USERS_COND: |
| my_cond = slurmdb_pack_add_assoc_cond; |
| my_rec = slurmdb_pack_user_rec; |
| break; |
| default: |
| fatal("Unknown pack type"); |
| return; |
| } |
| (*(my_cond))(msg->cond, rpc_version, buffer); |
| (*(my_rec))(msg->rec, rpc_version, buffer); |
| } |
| |
| static int _unpack_modify_msg(dbd_modify_msg_t **msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| dbd_modify_msg_t *msg_ptr = NULL; |
| int (*my_cond) (void **object, uint16_t rpc_version, buf_t *buffer); |
| int (*my_rec) (void **object, uint16_t rpc_version, buf_t *buffer); |
| |
| msg_ptr = xmalloc(sizeof(dbd_modify_msg_t)); |
| *msg = msg_ptr; |
| |
| switch (type) { |
| case DBD_MODIFY_ACCOUNTS: |
| my_cond = slurmdb_unpack_account_cond; |
| my_rec = slurmdb_unpack_account_rec; |
| break; |
| case DBD_MODIFY_ASSOCS: |
| my_cond = slurmdb_unpack_assoc_cond; |
| my_rec = slurmdb_unpack_assoc_rec; |
| break; |
| case DBD_MODIFY_CLUSTERS: |
| my_cond = slurmdb_unpack_cluster_cond; |
| my_rec = slurmdb_unpack_cluster_rec; |
| break; |
| case DBD_MODIFY_FEDERATIONS: |
| my_cond = slurmdb_unpack_federation_cond; |
| my_rec = slurmdb_unpack_federation_rec; |
| break; |
| case DBD_MODIFY_JOB: |
| my_cond = slurmdb_unpack_job_cond; |
| my_rec = slurmdb_unpack_job_rec; |
| break; |
| case DBD_MODIFY_QOS: |
| my_cond = slurmdb_unpack_qos_cond; |
| my_rec = slurmdb_unpack_qos_rec; |
| break; |
| case DBD_MODIFY_RES: |
| my_cond = slurmdb_unpack_res_cond; |
| my_rec = slurmdb_unpack_res_rec; |
| break; |
| case DBD_MODIFY_USERS: |
| my_cond = slurmdb_unpack_user_cond; |
| my_rec = slurmdb_unpack_user_rec; |
| break; |
| case DBD_ADD_ACCOUNTS_COND: |
| my_cond = slurmdb_unpack_add_assoc_cond; |
| my_rec = slurmdb_unpack_account_rec; |
| break; |
| case DBD_ADD_USERS_COND: |
| my_cond = slurmdb_unpack_add_assoc_cond; |
| my_rec = slurmdb_unpack_user_rec; |
| break; |
| default: |
| fatal("%s: Unknown unpack type", __func__); |
| return SLURM_ERROR; |
| } |
| |
| if ((*(my_cond))(&msg_ptr->cond, rpc_version, buffer) == SLURM_ERROR) |
| goto unpack_error; |
| if ((*(my_rec))(&msg_ptr->rec, rpc_version, buffer) == SLURM_ERROR) |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_modify_msg(msg_ptr, type); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_node_state_msg(dbd_node_state_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| packstr(msg->hostlist, buffer); |
| packstr(msg->extra, buffer); |
| packstr(msg->instance_id, buffer); |
| packstr(msg->instance_type, buffer); |
| packstr(msg->reason, buffer); |
| pack32(msg->reason_uid, buffer); |
| pack16(msg->new_state, buffer); |
| pack_time(msg->event_time, buffer); |
| pack32(msg->state, buffer); |
| packstr(msg->tres_str, buffer); |
| } |
| } |
| |
| static int _unpack_node_state_msg(dbd_node_state_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_node_state_msg_t *msg_ptr; |
| |
| msg_ptr = xmalloc(sizeof(dbd_node_state_msg_t)); |
| *msg = msg_ptr; |
| |
| msg_ptr->reason_uid = NO_VAL; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpackstr(&msg_ptr->hostlist, buffer); |
| safe_unpackstr(&msg_ptr->extra, buffer); |
| safe_unpackstr(&msg_ptr->instance_id, buffer); |
| safe_unpackstr(&msg_ptr->instance_type, buffer); |
| safe_unpackstr(&msg_ptr->reason, buffer); |
| safe_unpack32(&msg_ptr->reason_uid, buffer); |
| safe_unpack16(&msg_ptr->new_state, buffer); |
| safe_unpack_time(&msg_ptr->event_time, buffer); |
| safe_unpack32(&msg_ptr->state, buffer); |
| safe_unpackstr(&msg_ptr->tres_str, buffer); |
| } |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_node_state_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_register_ctld_msg(dbd_register_ctld_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_25_11_PROTOCOL_VERSION) { |
| pack16(msg->dimensions, buffer); |
| pack32(msg->flags, buffer); |
| pack16(msg->port, buffer); |
| pack32(msg->cluster_id, buffer); |
| } else if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| pack16(msg->dimensions, buffer); |
| pack32(msg->flags, buffer); |
| pack16(msg->port, buffer); |
| } |
| } |
| |
| static int _unpack_register_ctld_msg(dbd_register_ctld_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_register_ctld_msg_t *msg_ptr = xmalloc( |
| sizeof(dbd_register_ctld_msg_t)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_25_11_PROTOCOL_VERSION) { |
| safe_unpack16(&msg_ptr->dimensions, buffer); |
| safe_unpack32(&msg_ptr->flags, buffer); |
| safe_unpack16(&msg_ptr->port, buffer); |
| safe_unpack32(&msg_ptr->cluster_id, buffer); |
| } else if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpack16(&msg_ptr->dimensions, buffer); |
| safe_unpack32(&msg_ptr->flags, buffer); |
| safe_unpack16(&msg_ptr->port, buffer); |
| } |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_register_ctld_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_roll_usage_msg(dbd_roll_usage_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| pack16(msg->archive_data, buffer); |
| pack_time(msg->end, buffer); |
| pack_time(msg->start, buffer); |
| } |
| } |
| |
| static int _unpack_roll_usage_msg(dbd_roll_usage_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_roll_usage_msg_t *msg_ptr = xmalloc(sizeof(dbd_roll_usage_msg_t)); |
| |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpack16(&msg_ptr->archive_data, buffer); |
| safe_unpack_time(&msg_ptr->end, buffer); |
| safe_unpack_time(&msg_ptr->start, buffer); |
| } |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_roll_usage_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_step_complete_msg(dbd_step_comp_msg_t *msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| pack32(msg->assoc_id, buffer); |
| pack64(msg->db_index, buffer); |
| pack_time(msg->end_time, buffer); |
| pack32(msg->exit_code, buffer); |
| jobacctinfo_pack((struct jobacctinfo *)msg->jobacct, |
| rpc_version, PROTOCOL_TYPE_DBD, buffer); |
| pack_time(msg->job_submit_time, buffer); |
| packstr(msg->job_tres_alloc_str, buffer); |
| pack32(msg->req_uid, buffer); |
| pack_time(msg->start_time, buffer); |
| pack16(msg->state, buffer); |
| pack_step_id(&msg->step_id, buffer, rpc_version); |
| pack32(msg->total_tasks, buffer); |
| } |
| } |
| |
| static int _unpack_step_complete_msg(dbd_step_comp_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_step_comp_msg_t *msg_ptr = xmalloc(sizeof(dbd_step_comp_msg_t)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpack_time(&msg_ptr->end_time, buffer); |
| safe_unpack32(&msg_ptr->exit_code, buffer); |
| jobacctinfo_unpack((struct jobacctinfo **)&msg_ptr->jobacct, |
| rpc_version, PROTOCOL_TYPE_DBD, buffer, 1); |
| safe_unpack_time(&msg_ptr->job_submit_time, buffer); |
| safe_unpackstr(&msg_ptr->job_tres_alloc_str, buffer); |
| safe_unpack32(&msg_ptr->req_uid, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpack16(&msg_ptr->state, buffer); |
| if (unpack_step_id_members(&msg_ptr->step_id, buffer, |
| rpc_version) != SLURM_SUCCESS) |
| goto unpack_error; |
| safe_unpack32(&msg_ptr->total_tasks, buffer); |
| } else |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| debug2("slurmdbd_unpack_step_complete_msg:" |
| "unpack_error: size_buf(buffer) %u", |
| size_buf(buffer)); |
| slurmdbd_free_step_complete_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_step_start_msg(dbd_step_start_msg_t *msg, |
| uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| /* |
| * Generate node_inx outside of locks -- not |
| * jobacct_storage_p_step_start(). |
| * See slurmdbd/acct_storage_p_node_inx() for need to |
| * use_create_node_inx(). |
| * |
| * msg->node_inx shouldn't be set when it's being packed for the |
| * first time. |
| * |
| * msg->node_inx will be set if messages were loaded from state |
| * with a different major version. See _load_dbd_state() which |
| * unpacks and packs the message at the current protocol |
| * version. |
| */ |
| if (!msg->node_inx) |
| msg->node_inx = acct_storage_g_node_inx(NULL, msg->nodes); |
| |
| if (rpc_version >= SLURM_25_05_PROTOCOL_VERSION) { |
| pack32(msg->assoc_id, buffer); |
| pack64(msg->db_index, buffer); |
| packstr(msg->container, buffer); |
| packstr(msg->name, buffer); |
| packstr(msg->nodes, buffer); |
| packstr(msg->node_inx, buffer); |
| pack32(msg->node_cnt, buffer); |
| pack_time(msg->start_time, buffer); |
| pack_time(msg->job_submit_time, buffer); |
| pack32(msg->req_cpufreq_min, buffer); |
| pack32(msg->req_cpufreq_max, buffer); |
| pack32(msg->req_cpufreq_gov, buffer); |
| pack_step_id(&msg->step_id, buffer, rpc_version); |
| packstr(msg->cwd, buffer); |
| packstr(msg->std_err, buffer); |
| packstr(msg->std_in, buffer); |
| packstr(msg->std_out, buffer); |
| packstr(msg->submit_line, buffer); |
| pack32(msg->task_dist, buffer); |
| pack32(msg->time_limit, buffer); |
| pack32(msg->total_tasks, buffer); |
| packstr(msg->tres_alloc_str, buffer); |
| } else if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| pack32(msg->assoc_id, buffer); |
| pack64(msg->db_index, buffer); |
| packstr(msg->container, buffer); |
| packstr(msg->name, buffer); |
| packstr(msg->nodes, buffer); |
| packstr(msg->node_inx, buffer); |
| pack32(msg->node_cnt, buffer); |
| pack_time(msg->start_time, buffer); |
| pack_time(msg->job_submit_time, buffer); |
| pack32(msg->req_cpufreq_min, buffer); |
| pack32(msg->req_cpufreq_max, buffer); |
| pack32(msg->req_cpufreq_gov, buffer); |
| pack_step_id(&msg->step_id, buffer, rpc_version); |
| packstr(msg->submit_line, buffer); |
| pack32(msg->task_dist, buffer); |
| pack32(msg->total_tasks, buffer); |
| packstr(msg->tres_alloc_str, buffer); |
| } |
| |
| xfree(msg->node_inx); |
| } |
| |
| static int _unpack_step_start_msg(dbd_step_start_msg_t **msg, |
| uint16_t rpc_version, buf_t *buffer) |
| { |
| dbd_step_start_msg_t *msg_ptr = xmalloc(sizeof(dbd_step_start_msg_t)); |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_25_05_PROTOCOL_VERSION) { |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpackstr(&msg_ptr->container, buffer); |
| safe_unpackstr(&msg_ptr->name, buffer); |
| safe_unpackstr(&msg_ptr->nodes, buffer); |
| safe_unpackstr(&msg_ptr->node_inx, buffer); |
| safe_unpack32(&msg_ptr->node_cnt, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpack_time(&msg_ptr->job_submit_time, buffer); |
| safe_unpack32(&msg_ptr->req_cpufreq_min, buffer); |
| safe_unpack32(&msg_ptr->req_cpufreq_max, buffer); |
| safe_unpack32(&msg_ptr->req_cpufreq_gov, buffer); |
| if (unpack_step_id_members(&msg_ptr->step_id, buffer, |
| rpc_version) != SLURM_SUCCESS) |
| goto unpack_error; |
| safe_unpackstr(&msg_ptr->cwd, buffer); |
| safe_unpackstr(&msg_ptr->std_err, buffer); |
| safe_unpackstr(&msg_ptr->std_in, buffer); |
| safe_unpackstr(&msg_ptr->std_out, buffer); |
| safe_unpackstr(&msg_ptr->submit_line, buffer); |
| safe_unpack32(&msg_ptr->task_dist, buffer); |
| safe_unpack32(&msg_ptr->time_limit, buffer); |
| safe_unpack32(&msg_ptr->total_tasks, buffer); |
| safe_unpackstr(&msg_ptr->tres_alloc_str, buffer); |
| } else if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpack32(&msg_ptr->assoc_id, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpackstr(&msg_ptr->container, buffer); |
| safe_unpackstr(&msg_ptr->name, buffer); |
| safe_unpackstr(&msg_ptr->nodes, buffer); |
| safe_unpackstr(&msg_ptr->node_inx, buffer); |
| safe_unpack32(&msg_ptr->node_cnt, buffer); |
| safe_unpack_time(&msg_ptr->start_time, buffer); |
| safe_unpack_time(&msg_ptr->job_submit_time, buffer); |
| safe_unpack32(&msg_ptr->req_cpufreq_min, buffer); |
| safe_unpack32(&msg_ptr->req_cpufreq_max, buffer); |
| safe_unpack32(&msg_ptr->req_cpufreq_gov, buffer); |
| if (unpack_step_id_members(&msg_ptr->step_id, buffer, |
| rpc_version) != SLURM_SUCCESS) |
| goto unpack_error; |
| safe_unpackstr(&msg_ptr->submit_line, buffer); |
| safe_unpack32(&msg_ptr->task_dist, buffer); |
| safe_unpack32(&msg_ptr->total_tasks, buffer); |
| safe_unpackstr(&msg_ptr->tres_alloc_str, buffer); |
| } else |
| goto unpack_error; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| debug2("slurmdbd_unpack_step_start_msg:" |
| "unpack_error: size_buf(buffer) %u", |
| size_buf(buffer)); |
| slurmdbd_free_step_start_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| static void _pack_buffer(void *in, uint16_t rpc_version, buf_t *buffer) |
| { |
| buf_t *object = (buf_t *) in; |
| |
| packmem(get_buf_data(object), get_buf_offset(object), buffer); |
| } |
| |
| static int _unpack_buffer(void **out, uint16_t rpc_version, buf_t *buffer) |
| { |
| buf_t *out_ptr = NULL; |
| char *msg = NULL; |
| uint32_t uint32_tmp; |
| |
| safe_unpackmem_xmalloc(&msg, &uint32_tmp, buffer); |
| if (!(out_ptr = create_buf(msg, uint32_tmp))) |
| goto unpack_error; |
| *out = out_ptr; |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| xfree(msg); |
| slurmdbd_free_buffer(out_ptr); |
| *out = NULL; |
| return SLURM_ERROR; |
| |
| } |
| |
| extern void slurmdbd_pack_id_rc_msg(void *in, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| dbd_id_rc_msg_t *msg = (dbd_id_rc_msg_t *)in; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| pack32(msg->job_id, buffer); |
| pack64(msg->db_index, buffer); |
| pack64(msg->flags, buffer); |
| pack32(msg->return_code, buffer); |
| } |
| } |
| |
| extern int slurmdbd_unpack_id_rc_msg(void **msg, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| dbd_id_rc_msg_t *msg_ptr = xmalloc(sizeof(dbd_id_rc_msg_t)); |
| |
| *msg = msg_ptr; |
| |
| if (rpc_version >= SLURM_MIN_PROTOCOL_VERSION) { |
| safe_unpack32(&msg_ptr->job_id, buffer); |
| safe_unpack64(&msg_ptr->db_index, buffer); |
| safe_unpack64(&msg_ptr->flags, buffer); |
| safe_unpack32(&msg_ptr->return_code, buffer); |
| } |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_id_rc_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| extern void slurmdbd_pack_usage_msg(dbd_usage_msg_t *msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| void (*my_rec) (void *object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_GET_QOS_USAGE: |
| case DBD_GOT_QOS_USAGE: |
| case DBD_GET_ASSOC_USAGE: |
| case DBD_GOT_ASSOC_USAGE: |
| my_rec = slurmdb_pack_assoc_rec; |
| break; |
| case DBD_GET_CLUSTER_USAGE: |
| case DBD_GOT_CLUSTER_USAGE: |
| my_rec = slurmdb_pack_cluster_rec; |
| break; |
| case DBD_GET_WCKEY_USAGE: |
| case DBD_GOT_WCKEY_USAGE: |
| my_rec = slurmdb_pack_wckey_rec; |
| break; |
| default: |
| fatal("Unknown pack type"); |
| return; |
| } |
| |
| (*(my_rec))(msg->rec, rpc_version, buffer); |
| pack_time(msg->start, buffer); |
| pack_time(msg->end, buffer); |
| } |
| |
| extern int slurmdbd_unpack_usage_msg(dbd_usage_msg_t **msg, |
| uint16_t rpc_version, |
| slurmdbd_msg_type_t type, |
| buf_t *buffer) |
| { |
| dbd_usage_msg_t *msg_ptr = NULL; |
| int (*my_rec) (void **object, uint16_t rpc_version, buf_t *buffer); |
| |
| msg_ptr = xmalloc(sizeof(dbd_usage_msg_t)); |
| *msg = msg_ptr; |
| |
| switch (type) { |
| case DBD_GET_QOS_USAGE: |
| case DBD_GOT_QOS_USAGE: |
| case DBD_GET_ASSOC_USAGE: |
| case DBD_GOT_ASSOC_USAGE: |
| my_rec = slurmdb_unpack_assoc_rec; |
| break; |
| case DBD_GET_CLUSTER_USAGE: |
| case DBD_GOT_CLUSTER_USAGE: |
| my_rec = slurmdb_unpack_cluster_rec; |
| break; |
| case DBD_GET_WCKEY_USAGE: |
| case DBD_GOT_WCKEY_USAGE: |
| my_rec = slurmdb_unpack_wckey_rec; |
| break; |
| default: |
| fatal("Unknown pack type"); |
| return SLURM_ERROR; |
| } |
| |
| if ((*(my_rec))(&msg_ptr->rec, rpc_version, buffer) == SLURM_ERROR) |
| goto unpack_error; |
| |
| safe_unpack_time(&msg_ptr->start, buffer); |
| safe_unpack_time(&msg_ptr->end, buffer); |
| |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_usage_msg(msg_ptr, type); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| extern void slurmdbd_pack_fini_msg(dbd_fini_msg_t *msg, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| pack16(msg->close_conn, buffer); |
| pack16(msg->commit, buffer); |
| } |
| |
| extern int slurmdbd_unpack_fini_msg(dbd_fini_msg_t **msg, uint16_t rpc_version, |
| buf_t *buffer) |
| { |
| dbd_fini_msg_t *msg_ptr = xmalloc(sizeof(dbd_fini_msg_t)); |
| *msg = msg_ptr; |
| |
| safe_unpack16(&msg_ptr->close_conn, buffer); |
| safe_unpack16(&msg_ptr->commit, buffer); |
| |
| return SLURM_SUCCESS; |
| |
| unpack_error: |
| slurmdbd_free_fini_msg(msg_ptr); |
| *msg = NULL; |
| return SLURM_ERROR; |
| } |
| |
| extern void slurmdbd_pack_list_msg(dbd_list_msg_t *msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| int rc; |
| void (*my_function) (void *object, uint16_t rpc_version, buf_t *buffer); |
| |
| switch (type) { |
| case DBD_ADD_ACCOUNTS: |
| case DBD_GOT_ACCOUNTS: |
| my_function = slurmdb_pack_account_rec; |
| break; |
| case DBD_ADD_TRES: |
| case DBD_GOT_TRES: |
| my_function = slurmdb_pack_tres_rec; |
| break; |
| case DBD_ADD_ASSOCS: |
| case DBD_GOT_ASSOCS: |
| case DBD_GOT_PROBS: |
| my_function = slurmdb_pack_assoc_rec; |
| break; |
| case DBD_ADD_CLUSTERS: |
| case DBD_GOT_CLUSTERS: |
| my_function = slurmdb_pack_cluster_rec; |
| break; |
| case DBD_ADD_FEDERATIONS: |
| case DBD_GOT_FEDERATIONS: |
| my_function = slurmdb_pack_federation_rec; |
| break; |
| case DBD_GOT_CONFIG: |
| my_function = pack_config_key_pair; |
| break; |
| case DBD_GOT_JOBS: |
| case DBD_FIX_RUNAWAY_JOB: |
| my_function = slurmdb_pack_job_rec; |
| break; |
| case DBD_GOT_LIST: |
| my_function = packstr_func; |
| break; |
| case DBD_ADD_QOS: |
| case DBD_GOT_QOS: |
| my_function = slurmdb_pack_qos_rec; |
| break; |
| case DBD_GOT_RESVS: |
| my_function = slurmdb_pack_reservation_rec; |
| break; |
| case DBD_ADD_RES: |
| case DBD_GOT_RES: |
| my_function = slurmdb_pack_res_rec; |
| break; |
| case DBD_ADD_WCKEYS: |
| case DBD_GOT_WCKEYS: |
| my_function = slurmdb_pack_wckey_rec; |
| break; |
| case DBD_ADD_USERS: |
| case DBD_GOT_USERS: |
| my_function = slurmdb_pack_user_rec; |
| break; |
| case DBD_GOT_TXN: |
| my_function = slurmdb_pack_txn_rec; |
| break; |
| case DBD_GOT_EVENTS: |
| my_function = slurmdb_pack_event_rec; |
| break; |
| case DBD_GOT_INSTANCES: |
| my_function = slurmdb_pack_instance_rec; |
| break; |
| case DBD_SEND_MULT_JOB_START: |
| slurm_pack_list_until(msg->my_list, _pack_job_start_msg, |
| buffer, MAX_MSG_SIZE, rpc_version); |
| pack32(msg->return_code, buffer); |
| return; |
| case DBD_GOT_MULT_JOB_START: |
| my_function = slurmdbd_pack_id_rc_msg; |
| break; |
| case DBD_JOB_HEAVY: |
| my_function = _pack_job_heavy_msg; |
| break; |
| case DBD_SEND_MULT_MSG: |
| case DBD_GOT_MULT_MSG: |
| my_function = _pack_buffer; |
| break; |
| default: |
| fatal("Unknown pack type"); |
| return; |
| } |
| |
| if ((rc = slurm_pack_list(msg->my_list, my_function, |
| buffer, rpc_version)) != SLURM_SUCCESS) |
| msg->return_code = rc; |
| |
| pack32(msg->return_code, buffer); |
| } |
| |
| extern int slurmdbd_unpack_list_msg(dbd_list_msg_t **msg, uint16_t rpc_version, |
| slurmdbd_msg_type_t type, buf_t *buffer) |
| { |
| dbd_list_msg_t *msg_ptr = NULL; |
| int (*my_function) (void **object, uint16_t rpc_version, buf_t *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 = safe_unpackstr_func; |
| my_destroy = xfree_ptr; |
| 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_GOT_INSTANCES: |
| my_function = slurmdb_unpack_instance_rec; |
| my_destroy = slurmdb_destroy_instance_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_JOB_HEAVY: |
| my_function = _unpack_job_heavy_msg; |
| my_destroy = slurmdbd_free_job_heavy_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; |
| } |
| |
| extern buf_t *pack_slurmdbd_msg(persist_msg_t *req, uint16_t rpc_version) |
| { |
| buf_t *buffer; |
| |
| if (rpc_version < SLURM_MIN_PROTOCOL_VERSION) { |
| error("slurmdbd: Invalid message version=%hu, type:%s", |
| rpc_version, slurmdbd_msg_type_2_str(req->msg_type,true)); |
| return NULL; |
| } |
| |
| buffer = init_buf(MAX_DBD_MSG_LEN); |
| pack16(req->msg_type, buffer); |
| |
| switch (req->msg_type) { |
| case REQUEST_PERSIST_INIT: |
| slurm_persist_pack_init_req_msg(req->data, buffer); |
| break; |
| case PERSIST_RC: |
| slurm_persist_pack_rc_msg(req->data, buffer, rpc_version); |
| 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_GOT_RES: |
| case DBD_ADD_QOS: |
| case DBD_GOT_QOS: |
| case DBD_GOT_RESVS: |
| 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: |
| slurmdbd_pack_list_msg( |
| (dbd_list_msg_t *)req->data, rpc_version, |
| req->msg_type, buffer); |
| break; |
| case DBD_ADD_ACCOUNT_COORDS: |
| case DBD_REMOVE_ACCOUNT_COORDS: |
| _pack_acct_coord_msg( |
| (dbd_acct_coord_msg_t *)req->data, rpc_version, |
| buffer); |
| break; |
| case DBD_ARCHIVE_LOAD: |
| slurmdb_pack_archive_rec(req->data, rpc_version, buffer); |
| break; |
| case DBD_CLUSTER_TRES: |
| case DBD_FLUSH_JOBS: |
| _pack_cluster_tres_msg( |
| (dbd_cluster_tres_msg_t *)req->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_INSTANCES: |
| 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: |
| _pack_cond_msg( |
| (dbd_cond_msg_t *)req->data, rpc_version, req->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: |
| slurmdbd_pack_usage_msg( |
| (dbd_usage_msg_t *)req->data, rpc_version, |
| req->msg_type, buffer); |
| break; |
| case DBD_FINI: |
| slurmdbd_pack_fini_msg((dbd_fini_msg_t *)req->data, |
| rpc_version, buffer); |
| break; |
| case DBD_JOB_COMPLETE: |
| _pack_job_complete_msg((dbd_job_comp_msg_t *)req->data, |
| rpc_version, |
| buffer); |
| break; |
| case DBD_JOB_START: |
| _pack_job_start_msg(req->data, rpc_version, buffer); |
| break; |
| case DBD_JOB_HEAVY: |
| _pack_job_heavy_msg(req->data, rpc_version, buffer); |
| break; |
| case DBD_ID_RC: |
| slurmdbd_pack_id_rc_msg(req->data, rpc_version, buffer); |
| break; |
| case DBD_JOB_SUSPEND: |
| _pack_job_suspend_msg( |
| (dbd_job_suspend_msg_t *)req->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: |
| case DBD_ADD_ACCOUNTS_COND: |
| case DBD_ADD_USERS_COND: |
| _pack_modify_msg( |
| (dbd_modify_msg_t *)req->data, rpc_version, |
| req->msg_type, buffer); |
| break; |
| case DBD_NODE_STATE: |
| _pack_node_state_msg( |
| (dbd_node_state_msg_t *)req->data, rpc_version, |
| buffer); |
| break; |
| case DBD_STEP_COMPLETE: |
| _pack_step_complete_msg( |
| (dbd_step_comp_msg_t *)req->data, rpc_version, |
| buffer); |
| break; |
| case DBD_STEP_START: |
| _pack_step_start_msg((dbd_step_start_msg_t *)req->data, |
| rpc_version, |
| buffer); |
| break; |
| case DBD_REGISTER_CTLD: |
| _pack_register_ctld_msg( |
| (dbd_register_ctld_msg_t *)req->data, rpc_version, |
| buffer); |
| break; |
| case DBD_ROLL_USAGE: |
| _pack_roll_usage_msg((dbd_roll_usage_msg_t *)req->data, |
| rpc_version, |
| buffer); |
| break; |
| case DBD_ADD_RESV: |
| case DBD_REMOVE_RESV: |
| case DBD_MODIFY_RESV: |
| _pack_rec_msg( |
| (dbd_rec_msg_t *)req->data, rpc_version, req->msg_type, |
| buffer); |
| break; |
| case DBD_GET_CONFIG: |
| packstr((char *)req->data, buffer); |
| break; |
| case DBD_RECONFIG: |
| case DBD_GET_STATS: |
| case DBD_CLEAR_STATS: |
| case DBD_SHUTDOWN: |
| break; |
| default: |
| error("slurmdbd: Invalid message type pack %u(%s:%u)", |
| req->msg_type, |
| slurmdbd_msg_type_2_str(req->msg_type, 1), |
| req->msg_type); |
| FREE_NULL_BUFFER(buffer); |
| return NULL; |
| } |
| return buffer; |
| } |
| |
| extern int unpack_slurmdbd_msg(persist_msg_t *resp, uint16_t rpc_version, |
| buf_t *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:%s", |
| rpc_version, |
| slurmdbd_msg_type_2_str(resp->msg_type, true)); |
| 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_INSTANCES: |
| 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_INSTANCES: |
| 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_JOB_HEAVY: |
| rc = _unpack_job_heavy_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: |
| case DBD_ADD_ACCOUNTS_COND: |
| case DBD_ADD_USERS_COND: |
| 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; |
| } |