blob: 6e34c2e09a838f671ecc49c95191becb38e25276 [file] [log] [blame]
/*****************************************************************************\
* slurm_errno.c - error codes and functions for slurm
******************************************************************************
* Copyright (C) 2002-2007 The Regents of the University of California.
* Copyright (C) 2008-2010 Lawrence Livermore National Security.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Jim Garlick <garlick@llnl.gov>, et. al.
* 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.
\*****************************************************************************/
/* This implementation relies on "overloading" the libc errno by
* partitioning its domain into system (<1000) and Slurm (>=1000) values.
* API users should call slurm_strerror() to convert all errno values to
* their description strings.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "slurm/slurm_errno.h"
/*
* Each table entry needs the macro directly (to be translated into the raw
* value) alongside the text string representation. Rather than duplicate them
* - and risk them getting out of sync on a bad copy + paste - use this macro
* to construct each row.
*/
#define ERRTAB_ENTRY(_e) _e, #_e
/* Add new error values to slurm/slurm_errno.h, and their descriptions to this table */
slurm_errtab_t slurm_errtab[] = {
{ ERRTAB_ENTRY(SLURM_SUCCESS), "No error"},
{ ERRTAB_ENTRY(SLURM_ERROR), "Unspecified error"},
{ ERRTAB_ENTRY(EINPROGRESS), "Operation now in progress"},
/* General Message error codes */
{ ERRTAB_ENTRY(SLURM_UNEXPECTED_MSG_ERROR),
"Unexpected message received" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_CONNECTION_ERROR),
"Communication connection failure" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_SEND_ERROR),
"Message send failure" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_RECEIVE_ERROR),
"Message receive failure" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_SHUTDOWN_ERROR),
"Communication shutdown failure" },
{ ERRTAB_ENTRY(SLURM_PROTOCOL_VERSION_ERROR),
"Incompatible versions of client and server code" },
{ ERRTAB_ENTRY(SLURM_PROTOCOL_IO_STREAM_VERSION_ERROR),
"I/O stream version number error" },
{ ERRTAB_ENTRY(SLURM_PROTOCOL_AUTHENTICATION_ERROR),
"Protocol authentication error" },
{ ERRTAB_ENTRY(SLURM_PROTOCOL_INSANE_MSG_LENGTH),
"Insane message length" },
{ ERRTAB_ENTRY(SLURM_MPI_PLUGIN_NAME_INVALID),
"Invalid MPI plugin name" },
{ ERRTAB_ENTRY(SLURM_MPI_PLUGIN_PRELAUNCH_SETUP_FAILED),
"MPI plugin's pre-launch setup failed" },
{ ERRTAB_ENTRY(SLURM_PLUGIN_NAME_INVALID),
"Plugin initialization failed" },
{ ERRTAB_ENTRY(SLURM_UNKNOWN_FORWARD_ADDR),
"Can't find an address, check slurm.conf" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_MISSING_SOCKET_ERROR),
"Unexpected missing socket error" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_INVALID_INCOMING_FD),
"Unable to process incoming file descriptor" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_INVALID_OUTGOING_FD),
"Unable to process outgoing file descriptor" },
{ ERRTAB_ENTRY(SLURM_COMMUNICATIONS_INVALID_FD),
"Unable to process incoming and outgoing file descriptors" },
/* communication failures to/from slurmctld */
{ ERRTAB_ENTRY(SLURMCTLD_COMMUNICATIONS_CONNECTION_ERROR),
"Unable to contact slurm controller (connect failure)" },
{ ERRTAB_ENTRY(SLURMCTLD_COMMUNICATIONS_SEND_ERROR),
"Unable to contact slurm controller (send failure)" },
{ ERRTAB_ENTRY(SLURMCTLD_COMMUNICATIONS_RECEIVE_ERROR),
"Unable to contact slurm controller (receive failure)" },
{ ERRTAB_ENTRY(SLURMCTLD_COMMUNICATIONS_SHUTDOWN_ERROR),
"Unable to contact slurm controller (shutdown failure)"},
{ ERRTAB_ENTRY(SLURMCTLD_COMMUNICATIONS_BACKOFF),
"Rate limit exceeded, please retry momentarily"},
{ ERRTAB_ENTRY(SLURMCTLD_COMMUNICATIONS_HARD_DROP),
"Rate limit exceeded, please retry later"},
/* _info.c/communication layer RESPONSE_SLURM_RC message codes */
/* Not really an error */
{ ERRTAB_ENTRY(SLURM_NO_CHANGE_IN_DATA),
"Data has not changed since time specified" },
/* slurmctld error codes */
{ ERRTAB_ENTRY(ESLURM_INVALID_PARTITION_NAME),
"Invalid partition name specified" },
{ ERRTAB_ENTRY(ESLURM_DEFAULT_PARTITION_NOT_SET),
"No partition specified or system default partition" },
{ ERRTAB_ENTRY(ESLURM_ACCESS_DENIED),
"Access/permission denied" },
{ ERRTAB_ENTRY(ESLURM_JOB_MISSING_REQUIRED_PARTITION_GROUP),
"User's group not permitted to use this partition" },
{ ERRTAB_ENTRY(ESLURM_REQUESTED_NODES_NOT_IN_PARTITION),
"Requested nodes not in this partition" },
{ ERRTAB_ENTRY(ESLURM_TOO_MANY_REQUESTED_CPUS),
"More processors requested than permitted" },
{ ERRTAB_ENTRY(ESLURM_INVALID_NODE_COUNT),
"Node count specification invalid" },
{ ERRTAB_ENTRY(ESLURM_ERROR_ON_DESC_TO_RECORD_COPY),
"Unable to create job record, try again" },
{ ERRTAB_ENTRY(ESLURM_JOB_MISSING_SIZE_SPECIFICATION),
"Job size specification needs to be provided" },
{ ERRTAB_ENTRY(ESLURM_JOB_SCRIPT_MISSING),
"Job script not specified" },
{ ERRTAB_ENTRY(ESLURM_USER_ID_MISSING),
"Invalid user id" },
{ ERRTAB_ENTRY(ESLURM_DUPLICATE_JOB_ID),
"Duplicate job id" },
{ ERRTAB_ENTRY(ESLURM_PATHNAME_TOO_LONG),
"Pathname of a file, directory or other parameter too long" },
{ ERRTAB_ENTRY(ESLURM_NOT_TOP_PRIORITY),
"Immediate execution impossible, insufficient priority" },
{ ERRTAB_ENTRY(ESLURM_REQUESTED_NODE_CONFIG_UNAVAILABLE),
"Requested node configuration is not available" },
{ ERRTAB_ENTRY(ESLURM_REQUESTED_PART_CONFIG_UNAVAILABLE),
"Requested partition configuration not available now" },
{ ERRTAB_ENTRY(ESLURM_NODES_BUSY),
"Requested nodes are busy" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ID),
"Invalid job id specified" },
{ ERRTAB_ENTRY(ESLURM_INVALID_NODE_NAME),
"Invalid node name specified" },
{ ERRTAB_ENTRY(ESLURM_INVALID_CORE_CNT),
"Core count for reservation node list is not consistent!" },
{ ERRTAB_ENTRY(ESLURM_WRITING_TO_FILE),
"I/O error writing script/environment to file" },
{ ERRTAB_ENTRY(ESLURM_TRANSITION_STATE_NO_UPDATE),
"Job can not be altered now, try again later" },
{ ERRTAB_ENTRY(ESLURM_ALREADY_DONE),
"Job/step already completing or completed" },
{ ERRTAB_ENTRY(ESLURM_INTERCONNECT_FAILURE),
"Error configuring interconnect" },
{ ERRTAB_ENTRY(ESLURM_BAD_DIST),
"Task distribution specification invalid" },
{ ERRTAB_ENTRY(ESLURM_JOB_PENDING),
"Job is pending execution" },
{ ERRTAB_ENTRY(ESLURM_BAD_TASK_COUNT),
"Task count specification invalid" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_CREDENTIAL),
"Error generating job credential" },
{ ERRTAB_ENTRY(ESLURM_IN_STANDBY_MODE),
"Slurm backup controller in standby mode" },
{ ERRTAB_ENTRY(ESLURM_INVALID_NODE_STATE),
"Invalid node state specified" },
{ ERRTAB_ENTRY(ESLURM_INVALID_FEATURE),
"Invalid feature specification" },
{ ERRTAB_ENTRY(ESLURM_INVALID_AUTHTYPE_CHANGE),
"AuthType change requires restart of all Slurm daemons and "
"commands to take effect"},
{ ERRTAB_ENTRY(ESLURM_ACTIVE_FEATURE_NOT_SUBSET),
"Active features not subset of available features" },
{ ERRTAB_ENTRY(ESLURM_INVALID_CRED_TYPE_CHANGE),
"CredType change requires restart of all Slurm daemons "
"to take effect" },
{ ERRTAB_ENTRY(ESLURM_INVALID_SCHEDTYPE_CHANGE),
"SchedulerType change requires restart of the slurmctld daemon "
"to take effect" },
{ ERRTAB_ENTRY(ESLURM_INVALID_SELECTTYPE_CHANGE),
"SelectType change requires restart of the slurmctld daemon "
"to take effect" },
{ ERRTAB_ENTRY(ESLURM_INVALID_SWITCHTYPE_CHANGE),
"SwitchType change requires restart of all Slurm daemons and "
"jobs to take effect" },
{ ERRTAB_ENTRY(ESLURM_FRAGMENTATION),
"Immediate execution impossible, "
"resources too fragmented for allocation" },
{ ERRTAB_ENTRY(ESLURM_NOT_SUPPORTED),
"Requested operation not supported on this system" },
{ ERRTAB_ENTRY(ESLURM_DISABLED),
"Requested operation is presently disabled" },
{ ERRTAB_ENTRY(ESLURM_DEPENDENCY),
"Job dependency problem" },
{ ERRTAB_ENTRY(ESLURM_BATCH_ONLY),
"Only batch jobs are accepted or processed" },
{ ERRTAB_ENTRY(ESLURM_LICENSES_UNAVAILABLE),
"Licenses currently unavailable" },
{ ERRTAB_ENTRY(ESLURM_TAKEOVER_NO_HEARTBEAT),
"Unable to takeover, heartbeat file is missing" },
{ ERRTAB_ENTRY(ESLURM_JOB_HELD),
"Job is in held state, pending scheduler release" },
{ ERRTAB_ENTRY(ESLURM_INVALID_TASK_MEMORY),
"Memory required by task is not available" },
{ ERRTAB_ENTRY(ESLURM_INVALID_ACCOUNT),
"Invalid account or account/partition combination specified"},
{ ERRTAB_ENTRY(ESLURM_INVALID_PARENT_ACCOUNT),
"Invalid parent account specified" },
{ ERRTAB_ENTRY(ESLURM_SAME_PARENT_ACCOUNT),
"Account already child of parent account specified" },
{ ERRTAB_ENTRY(ESLURM_INVALID_QOS),
"Invalid qos specification" },
{ ERRTAB_ENTRY(ESLURM_INVALID_WCKEY),
"Invalid wckey specification" },
{ ERRTAB_ENTRY(ESLURM_INVALID_LICENSES),
"Invalid license specification" },
{ ERRTAB_ENTRY(ESLURM_NEED_RESTART),
"The node configuration changes that were made require restart "
"of the slurmctld daemon to take effect"},
{ ERRTAB_ENTRY(ESLURM_ACCOUNTING_POLICY),
"Job violates accounting/QOS policy (job submit limit, user's "
"size and/or time limits)"},
{ ERRTAB_ENTRY(ESLURM_INVALID_TIME_LIMIT),
"Requested time limit is invalid (missing or exceeds some limit)"},
{ ERRTAB_ENTRY(ESLURM_RESERVATION_ACCESS),
"Access denied to requested reservation" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_INVALID),
"Requested reservation is invalid" },
{ ERRTAB_ENTRY(ESLURM_INVALID_TIME_VALUE),
"Invalid time specified" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_BUSY),
"Requested reservation is in use" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_NOT_USABLE),
"Requested reservation not usable now" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_OVERLAP),
"Requested reservation overlaps with another reservation" },
{ ERRTAB_ENTRY(ESLURM_PORTS_BUSY),
"Required ports are in use" },
{ ERRTAB_ENTRY(ESLURM_PORTS_INVALID),
"Requires more ports than can be reserved" },
{ ERRTAB_ENTRY(ESLURM_PROLOG_RUNNING),
"PrologSlurmctld is still running" },
{ ERRTAB_ENTRY(ESLURM_NO_STEPS),
"Job steps can not be run on this cluster" },
{ ERRTAB_ENTRY(ESLURM_MISSING_WORK_DIR),
"Job cannot be submitted without the current working directory specified." },
{ ERRTAB_ENTRY(ESLURM_QOS_PREEMPTION_LOOP),
"QOS Preemption loop detected" },
{ ERRTAB_ENTRY(ESLURM_NODE_NOT_AVAIL),
"Required node not available (down, drained or reserved)"},
{ ERRTAB_ENTRY(ESLURM_INVALID_CPU_COUNT),
"CPU count specification invalid" },
{ ERRTAB_ENTRY(ESLURM_PARTITION_NOT_AVAIL),
"Required partition not available (inactive or drain)"},
{ ERRTAB_ENTRY(ESLURM_CIRCULAR_DEPENDENCY),
"Circular job dependency" },
{ ERRTAB_ENTRY(ESLURM_INVALID_GRES),
"Invalid generic resource (gres) specification" },
{ ERRTAB_ENTRY(ESLURM_JOB_NOT_PENDING),
"Job is no longer pending execution" },
{ ERRTAB_ENTRY(ESLURM_QOS_THRES),
"Requested account has breached requested QOS usage threshold"},
{ ERRTAB_ENTRY(ESLURM_PARTITION_IN_USE),
"Partition is in use" },
{ ERRTAB_ENTRY(ESLURM_STEP_LIMIT),
"Step limit reached for this job" },
{ ERRTAB_ENTRY(ESLURM_JOB_SUSPENDED),
"Job is current suspended, requested operation disabled" },
{ ERRTAB_ENTRY(ESLURM_CAN_NOT_START_IMMEDIATELY),
"Job can not start immediately" },
{ ERRTAB_ENTRY(ESLURM_INTERCONNECT_BUSY),
"Switch resources currently not available" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_EMPTY),
"Reservation request lacks users, groups or accounts" },
{ ERRTAB_ENTRY(ESLURM_INVALID_ARRAY),
"Invalid job array specification" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_NAME_DUP),
"Duplicate reservation name" },
{ ERRTAB_ENTRY(ESLURM_JOB_STARTED),
"Job has already started" },
{ ERRTAB_ENTRY(ESLURM_JOB_FINISHED),
"Job has already finished" },
{ ERRTAB_ENTRY(ESLURM_JOB_NOT_RUNNING),
"Job is not running"},
{ ERRTAB_ENTRY(ESLURM_JOB_NOT_PENDING_NOR_RUNNING),
"Job is not pending nor running" },
{ ERRTAB_ENTRY(ESLURM_JOB_NOT_SUSPENDED),
"Job is not suspended" },
{ ERRTAB_ENTRY(ESLURM_JOB_NOT_FINISHED),
"Job is not finished" },
{ ERRTAB_ENTRY(ESLURM_TRIGGER_DUP),
"Duplicate event trigger" },
{ ERRTAB_ENTRY(ESLURM_INTERNAL),
"Slurm internal error, contact system administrator" },
{ ERRTAB_ENTRY(ESLURM_INVALID_BURST_BUFFER_CHANGE),
"BurstBufferType change requires restart of slurmctld daemon "
"to take effect"},
{ ERRTAB_ENTRY(ESLURM_BURST_BUFFER_PERMISSION),
"Burst Buffer permission denied" },
{ ERRTAB_ENTRY(ESLURM_BURST_BUFFER_LIMIT),
"Burst Buffer resource limit exceeded" },
{ ERRTAB_ENTRY(ESLURM_INVALID_BURST_BUFFER_REQUEST),
"Burst Buffer request invalid" },
{ ERRTAB_ENTRY(ESLURM_PRIO_RESET_FAIL),
"Changes to job priority are not persistent, change nice instead" },
{ ERRTAB_ENTRY(ESLURM_CANNOT_MODIFY_CRON_JOB),
"Cannot modify scrontab jobs through scontrol" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_CONTAINER_CHANGE),
"JobContainerType change requires restart of all Slurm daemons and commands to take effect" },
{ ERRTAB_ENTRY(ESLURM_CANNOT_CANCEL_CRON_JOB),
"Cannot cancel scrontab jobs without --cron flag." },
{ ERRTAB_ENTRY(ESLURM_INVALID_MCS_LABEL),
"Invalid mcs_label specified" },
{ ERRTAB_ENTRY(ESLURM_BURST_BUFFER_WAIT),
"Waiting for burst buffer" },
{ ERRTAB_ENTRY(ESLURM_PARTITION_DOWN),
"Partition in DOWN state" },
{ ERRTAB_ENTRY(ESLURM_DUPLICATE_GRES),
"Duplicate generic resource (gres) specification" },
{ ERRTAB_ENTRY(ESLURM_RSV_ALREADY_STARTED),
"Reservation already started" },
{ ERRTAB_ENTRY(ESLURM_SUBMISSIONS_DISABLED),
"System submissions disabled" },
{ ERRTAB_ENTRY(ESLURM_NOT_HET_JOB),
"Job not heterogeneous job" },
{ ERRTAB_ENTRY(ESLURM_NOT_HET_JOB_LEADER),
"Job not heterogeneous job leader" },
{ ERRTAB_ENTRY(ESLURM_NOT_WHOLE_HET_JOB),
"Operation not permitted on individual component of heterogeneous job" },
{ ERRTAB_ENTRY(ESLURM_CORE_RESERVATION_UPDATE),
"Core-based reservation can not be updated" },
{ ERRTAB_ENTRY(ESLURM_DUPLICATE_STEP_ID),
"Duplicate job step id" },
{ ERRTAB_ENTRY(ESLURM_X11_NOT_AVAIL),
"X11 forwarding not available" },
{ ERRTAB_ENTRY(ESLURM_GROUP_ID_MISSING),
"Invalid group id" },
{ ERRTAB_ENTRY(ESLURM_BATCH_CONSTRAINT),
"Job --batch option is invalid or not a subset of --constraint" },
{ ERRTAB_ENTRY(ESLURM_INVALID_TRES),
"Invalid Trackable RESource (TRES) specification" },
{ ERRTAB_ENTRY(ESLURM_INVALID_TRES_BILLING_WEIGHTS),
"Invalid TRESBillingWeights specification" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_DEFAULTS),
"Invalid JobDefaults specification" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_MAINT),
"Job can not start due to maintenance reservation." },
{ ERRTAB_ENTRY(ESLURM_INVALID_GRES_TYPE),
"Invalid GRES specification (with and without type identification)" },
{ ERRTAB_ENTRY(ESLURM_REBOOT_IN_PROGRESS),
"Reboot already in progress" },
{ ERRTAB_ENTRY(ESLURM_MULTI_KNL_CONSTRAINT),
"Multiple KNL NUMA and/or MCDRAM constraints require use of a heterogeneous job" },
{ ERRTAB_ENTRY(ESLURM_UNSUPPORTED_GRES),
"Requested GRES option unsupported by configured SelectType plugin" },
{ ERRTAB_ENTRY(ESLURM_INVALID_NICE),
"Invalid --nice value" },
{ ERRTAB_ENTRY(ESLURM_INVALID_TIME_MIN_LIMIT),
"Invalid time-min specification (exceeds job's time or other limits)"},
{ ERRTAB_ENTRY(ESLURM_DEFER),
"Immediate execution impossible. "
"Individual job submission scheduling attempts deferred"},
{ ERRTAB_ENTRY(ESLURM_CONFIGLESS_DISABLED),
"ConfigLess mode is disabled in slurm configuration." },
{ ERRTAB_ENTRY(ESLURM_ENVIRONMENT_MISSING),
"Environment is missing in job" },
{ ERRTAB_ENTRY(ESLURM_RESERVATION_NO_SKIP),
"Reservation given is not skipable, try deleting instead"},
{ ERRTAB_ENTRY(ESLURM_RESERVATION_USER_GROUP),
"Reservations can't have users and groups specified, only one or the other"},
{ ERRTAB_ENTRY(ESLURM_PARTITION_ASSOC),
"Multiple partition job request not supported when a partition is set in the association" },
{ ERRTAB_ENTRY(ESLURM_IN_STANDBY_USE_BACKUP),
"Controller is in standby mode, try a different controller"},
{ ERRTAB_ENTRY(ESLURM_BAD_THREAD_PER_CORE),
"Cannot request more threads per core than the job allocation" },
{ ERRTAB_ENTRY(ESLURM_INVALID_PREFER),
"Invalid preferred feature specification" },
{ ERRTAB_ENTRY(ESLURM_INSUFFICIENT_GRES),
"Insufficient GRES available in allocation" },
{ ERRTAB_ENTRY(ESLURM_INVALID_CONTAINER_ID),
"Invalid container id specified" },
{ ERRTAB_ENTRY(ESLURM_EMPTY_JOB_ID),
"JobID must not be an empty string" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ID_ZERO),
"JobID can not be zero" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ID_NEGATIVE),
"JobID can not be a negative number" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ID_TOO_LARGE),
"JobID larger than acceptable range" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ID_NON_NUMERIC),
"JobID includes unexpected non-numeric characters" },
{ ERRTAB_ENTRY(ESLURM_EMPTY_JOB_ARRAY_ID),
"Job Array ID must not be an empty string" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ARRAY_ID_NEGATIVE),
"Job Array ID can not be a negative number" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ARRAY_ID_TOO_LARGE),
"Job Array ID larger than acceptable range" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_ARRAY_ID_NON_NUMERIC),
"Job Array ID includes unexpected non-numeric characters" },
{ ERRTAB_ENTRY(ESLURM_EMPTY_HET_JOB_COMP),
"HetJob component must not be an empty string" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_JOB_COMP_NEGATIVE),
"HetJob component can not be a negative number" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_JOB_COMP_TOO_LARGE),
"HetJob component larger than acceptable range" },
{ ERRTAB_ENTRY(ESLURM_EMPTY_STEP_ID),
"StepID must not be an empty string" },
{ ERRTAB_ENTRY(ESLURM_INVALID_STEP_ID_NEGATIVE),
"StepID can not be a negative number" },
{ ERRTAB_ENTRY(ESLURM_INVALID_STEP_ID_TOO_LARGE),
"StepID larger than acceptable range" },
{ ERRTAB_ENTRY(ESLURM_INVALID_STEP_ID_NON_NUMERIC),
"StepID includes unexpected non-numeric characters" },
{ ERRTAB_ENTRY(ESLURM_EMPTY_HET_STEP),
"HetStep component must not be an empty string" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_STEP_ZERO),
"HetStep component can not be zero" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_STEP_NEGATIVE),
"HetStep component can not be a negative number" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_STEP_TOO_LARGE),
"HetStep component larger than acceptable range" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_STEP_NON_NUMERIC),
"HetStep component includes unexpected non-numeric characters" },
{ ERRTAB_ENTRY(ESLURM_INVALID_HET_STEP_JOB),
"HetJob can not Het step id" },
{ ERRTAB_ENTRY(ESLURM_JOB_TIMEOUT_KILLED),
"Job killed due hitting max wall clock limit" },
{ ERRTAB_ENTRY(ESLURM_JOB_NODE_FAIL_KILLED),
"Job killed due node failure" },
{ ERRTAB_ENTRY(ESLURM_EMPTY_LIST),
"Empty list" },
{ ERRTAB_ENTRY(ESLURM_GROUP_ID_INVALID),
"Invalid group ID" },
{ ERRTAB_ENTRY(ESLURM_GROUP_ID_UNKNOWN),
"Unable to resolve group ID to group name" },
{ ERRTAB_ENTRY(ESLURM_USER_ID_INVALID),
"Invalid user ID" },
{ ERRTAB_ENTRY(ESLURM_USER_ID_UNKNOWN),
"Unable to resolve user ID to user name" },
{ ERRTAB_ENTRY(ESLURM_INVALID_ASSOC),
"Invalid or unknown association" },
{ ERRTAB_ENTRY(ESLURM_NODE_ALREADY_EXISTS),
"Node already exists in the node table" },
{ ERRTAB_ENTRY(ESLURM_NODE_TABLE_FULL),
"Unable to add node, node table is full" },
{ ERRTAB_ENTRY(ESLURM_INVALID_RELATIVE_QOS),
"Invalid QOS specification, relative QOS can only be used in a single partition per cluster." },
{ ERRTAB_ENTRY(ESLURM_INVALID_EXTRA),
"Invalid extra constraints specification" },
{ ERRTAB_ENTRY(ESLURM_JOB_SIGNAL_FAILED),
"Cannot signal job" },
{ ERRTAB_ENTRY(ESLURM_SIGNAL_JOBS_INVALID),
"Invalid signal jobs request, at least one job id or filter is required." },
{ ERRTAB_ENTRY(ESLURM_RES_CORES_PER_GPU_UNIQUE),
"RestrictedCoresPerGPU: Not enough unique cores per GPU" },
{ ERRTAB_ENTRY(ESLURM_RES_CORES_PER_GPU_TOPO),
"RestrictedCoresPerGPU: Missing core topology for GPUs" },
{ ERRTAB_ENTRY(ESLURM_RES_CORES_PER_GPU_NO),
"RestrictedCoresPerGPU: No GPUs configured on node" },
{ ERRTAB_ENTRY(ESLURM_MAX_POWERED_NODES),
"Max powered up nodes reached" },
{ ERRTAB_ENTRY(ESLURM_REQUESTED_TOPO_CONFIG_UNAVAILABLE),
"Requested topology configuration is not available" },
{ ERRTAB_ENTRY(ESLURM_PREEMPTION_REQUIRED),
"Preemption is required but is disabled on this system" },
{ ERRTAB_ENTRY(ESLURM_INVALID_NODE_STATE_TRANSITION),
"Invalid node state transition" },
{ ERRTAB_ENTRY(ESLURM_INVALID_JOB_STATE),
"Invalid job state" },
/* SPANK errors */
{ ERRTAB_ENTRY(ESPANK_ERROR),
"Generic error" },
{ ERRTAB_ENTRY(ESPANK_BAD_ARG),
"Bad argument" },
{ ERRTAB_ENTRY(ESPANK_NOT_TASK),
"Not in task context" },
{ ERRTAB_ENTRY(ESPANK_ENV_EXISTS),
"Environment variable exists" },
{ ERRTAB_ENTRY(ESPANK_ENV_NOEXIST),
"No such environment variable" },
{ ERRTAB_ENTRY(ESPANK_NOSPACE),
"Buffer too small" },
{ ERRTAB_ENTRY(ESPANK_NOT_REMOTE),
"Valid only in remote context" },
{ ERRTAB_ENTRY(ESPANK_NOEXIST),
"Id/PID does not exist on this node" },
{ ERRTAB_ENTRY(ESPANK_NOT_EXECD),
"Lookup by PID requested, but no tasks running" },
{ ERRTAB_ENTRY(ESPANK_NOT_AVAIL),
"Item not available from this callback" },
{ ERRTAB_ENTRY(ESPANK_NOT_LOCAL),
"Valid only in local or allocator context" },
{ ERRTAB_ENTRY(ESPANK_NODE_FAILURE),
"Spank plugin failure, node failed" },
{ ERRTAB_ENTRY(ESPANK_JOB_FAILURE),
"Spank plugin failure, job failed" },
/* slurmd error codes */
{ ERRTAB_ENTRY(ESLURMD_KILL_TASK_FAILED),
"Kill task failed" },
{ ERRTAB_ENTRY(ESLURMD_INVALID_ACCT_FREQ),
"Invalid accounting frequency requested" },
{ ERRTAB_ENTRY(ESLURMD_INVALID_JOB_CREDENTIAL),
"Invalid job credential" },
{ ERRTAB_ENTRY(ESLURMD_CREDENTIAL_REVOKED),
"Job credential revoked" },
{ ERRTAB_ENTRY(ESLURMD_CREDENTIAL_EXPIRED),
"Job credential expired" },
{ ERRTAB_ENTRY(ESLURMD_CREDENTIAL_REPLAYED),
"Job credential replayed" },
{ ERRTAB_ENTRY(ESLURMD_CREATE_BATCH_DIR_ERROR),
"Slurmd could not create a batch directory or file" },
{ ERRTAB_ENTRY(ESLURMD_SETUP_ENVIRONMENT_ERROR),
"Slurmd could not set up environment for batch job" },
{ ERRTAB_ENTRY(ESLURMD_SET_UID_OR_GID_ERROR),
"Slurmd could not set UID or GID" },
{ ERRTAB_ENTRY(ESLURMD_EXECVE_FAILED),
"Slurmd could not execve job" },
{ ERRTAB_ENTRY(ESLURMD_IO_ERROR),
"Slurmd could not connect IO" },
{ ERRTAB_ENTRY(ESLURMD_PROLOG_FAILED),
"Job prolog failed" },
{ ERRTAB_ENTRY(ESLURMD_EPILOG_FAILED),
"Job epilog failed" },
{ ERRTAB_ENTRY(ESLURMD_TOOMANYSTEPS),
"Too many job steps on node" },
{ ERRTAB_ENTRY(ESLURMD_STEP_EXISTS),
"Job step already exists" },
{ ERRTAB_ENTRY(ESLURMD_STEP_NOTRUNNING),
"Job step not running" },
{ ERRTAB_ENTRY(ESLURMD_STEP_SUSPENDED),
"Job step is suspended" },
{ ERRTAB_ENTRY(ESLURMD_STEP_NOTSUSPENDED),
"Job step is not currently suspended" },
{ ERRTAB_ENTRY(ESLURMD_INVALID_SOCKET_NAME_LEN),
"Unix socket name exceeded maximum length" },
{ ERRTAB_ENTRY(ESLURMD_CONTAINER_RUNTIME_INVALID),
"Container runtime not configured or invalid" },
{ ERRTAB_ENTRY(ESLURMD_CPU_BIND_ERROR),
"Unable to satisfy cpu bind request" },
{ ERRTAB_ENTRY(ESLURMD_CPU_LAYOUT_ERROR),
"Unable to layout tasks on given cpus" },
{ ERRTAB_ENTRY(ESLURMD_STEPD_PROXY_FAILED),
"Unable to proxy slurmstepd message" },
/* socket specific Slurm communications error */
{ ERRTAB_ENTRY(ESLURM_PROTOCOL_INCOMPLETE_PACKET),
"Header lengths are longer than data received" },
{ ERRTAB_ENTRY(SLURM_PROTOCOL_SOCKET_IMPL_TIMEOUT),
"Socket timed out on send/recv operation" },
{ ERRTAB_ENTRY(SLURM_PROTOCOL_SOCKET_ZERO_BYTES_SENT),
"Zero Bytes were transmitted or received" },
/* slurm_auth errors */
{ ERRTAB_ENTRY(ESLURM_AUTH_CRED_INVALID),
"Invalid authentication credential" },
{ ERRTAB_ENTRY(ESLURM_AUTH_EXPIRED),
"Authentication credential expired" },
{ ERRTAB_ENTRY(ESLURM_AUTH_BADARG),
"Bad argument to plugin function" },
{ ERRTAB_ENTRY(ESLURM_AUTH_UNPACK),
"Cannot unpack credential" },
{ ERRTAB_ENTRY(ESLURM_AUTH_SKIP),
"Authentication does not apply to request" },
{ ERRTAB_ENTRY(ESLURM_AUTH_UNABLE_TO_GENERATE_TOKEN),
"Token Generation failed." },
/* accounting errors */
{ ERRTAB_ENTRY(ESLURM_DB_CONNECTION),
"Unable to connect to database" },
{ ERRTAB_ENTRY(ESLURM_JOBS_RUNNING_ON_ASSOC),
"Job(s) active, cancel job(s) before remove" },
{ ERRTAB_ENTRY(ESLURM_CLUSTER_DELETED),
"Cluster deleted, commit/rollback immediately" },
{ ERRTAB_ENTRY(ESLURM_ONE_CHANGE),
"Can only change one at a time" },
{ ERRTAB_ENTRY(ESLURM_BAD_NAME),
"Unacceptable name given. (No '.' in name allowed)" },
{ ERRTAB_ENTRY(ESLURM_OVER_ALLOCATE),
"You can not allocate more than 100% of a resource" },
{ ERRTAB_ENTRY(ESLURM_RESULT_TOO_LARGE),
"Query result exceeds size limit" },
{ ERRTAB_ENTRY(ESLURM_DB_QUERY_TOO_WIDE),
"Too wide of a date range in query" },
{ ERRTAB_ENTRY(ESLURM_DB_CONNECTION_INVALID),
"Database connection reference is invalid" },
{ ERRTAB_ENTRY(ESLURM_NO_REMOVE_DEFAULT_ACCOUNT),
"You can not remove the default account of a user" },
{ ERRTAB_ENTRY(ESLURM_BAD_SQL),
"There is something internally wrong with the SQL needed for this. Please consult the slurmdbd log for more info." },
{ ERRTAB_ENTRY(ESLURM_NO_REMOVE_DEFAULT_QOS),
"This request would make it so some associations would not have access to their default qos." },
{ ERRTAB_ENTRY(ESLURM_COORD_NO_INCREASE_JOB_LIMIT),
"Coordinators can not increase job limits beyond the parent ones" },
{ ERRTAB_ENTRY(ESLURM_NO_RPC_STATS), "No RPC stats are available" },
/* Federation Errors */
{ ERRTAB_ENTRY(ESLURM_FED_CLUSTER_MAX_CNT),
"Too many clusters in federation" },
{ ERRTAB_ENTRY(ESLURM_FED_CLUSTER_MULTIPLE_ASSIGNMENT),
"Clusters can only be assigned to one federation" },
{ ERRTAB_ENTRY(ESLURM_INVALID_CLUSTER_FEATURE),
"Invalid cluster feature specification" },
{ ERRTAB_ENTRY(ESLURM_JOB_NOT_FEDERATED),
"Not a valid federated job" },
{ ERRTAB_ENTRY(ESLURM_INVALID_CLUSTER_NAME),
"Invalid cluster name" },
{ ERRTAB_ENTRY(ESLURM_FED_JOB_LOCK),
"Job locked by another sibling" },
{ ERRTAB_ENTRY(ESLURM_FED_NO_VALID_CLUSTERS),
"No eligible clusters for federated job" },
/* Lua wrapper errors */
{ ERRTAB_ENTRY(ESLURM_LUA_INVALID_STATE),
"Invalid or NULL Lua state pointer" },
{ ERRTAB_ENTRY(ESLURM_LUA_INVALID_SYNTAX),
"Lua script loading failed due to invalid syntax" },
{ ERRTAB_ENTRY(ESLURM_LUA_FUNC_NOT_FOUND),
"Requested Lua function not found" },
{ ERRTAB_ENTRY(ESLURM_LUA_FUNC_INVALID_RC),
"Lua function returned nil or table instead of numeric result" },
{ ERRTAB_ENTRY(ESLURM_LUA_FUNC_FAILED),
"Lua function execution failed for unknown reasons" },
{ ERRTAB_ENTRY(ESLURM_LUA_FUNC_FAILED_RUNTIME_ERROR),
"Lua function execution failed due to runtime error" },
{ ERRTAB_ENTRY(ESLURM_LUA_FUNC_FAILED_ENOMEM),
"Lua function execution failed due to memory allocation failure. Either not enough memory for Lua script's variables or memory allocation request for a variable was way too large." },
{ ERRTAB_ENTRY(ESLURM_LUA_FUNC_FAILED_GARBAGE_COLLECTOR),
"Lua function execution failed due to unknown failure in Lua's garbage collector" },
{ ERRTAB_ENTRY(ESLURM_LUA_INVALID_CONVERSION_TYPE),
"Unknown or unparsable Lua type found at top of Lua stack" },
/* plugin and custom errors */
{ ERRTAB_ENTRY(ESLURM_MISSING_TIME_LIMIT),
"Time limit specification required, but not provided" },
{ ERRTAB_ENTRY(ESLURM_INVALID_KNL),
"Invalid KNL configuration (MCDRAM or NUMA option)" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_INVALID),
"Plugin has invalid format or unable to be loaded" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_INCOMPLETE),
"Plugin missing required symbol or function" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_NOT_LOADED),
"Required plugin type not loaded or initialized" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_NOTFOUND),
"Plugin file not found" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_ACCESS_ERROR),
"Plugin access denied" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_DLOPEN_FAILED),
"Dlopen of plugin file failed" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_INIT_FAILED),
"Plugin init() callback failed" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_MISSING_NAME),
"Plugin name/type/version symbol missing" },
{ ERRTAB_ENTRY(ESLURM_PLUGIN_BAD_VERSION),
"Incompatible plugin version" },
/* REST errors */
{ ERRTAB_ENTRY(ESLURM_REST_INVALID_QUERY),
"Query empty or not RFC7320 compliant"},
{ ERRTAB_ENTRY(ESLURM_REST_FAIL_PARSING),
"Failure during parsing"},
{ ERRTAB_ENTRY(ESLURM_REST_INVALID_JOBS_DESC),
"Jobs description entry not found, empty or not dictionary or list"},
{ ERRTAB_ENTRY(ESLURM_REST_EMPTY_RESULT),
"Nothing found with query"},
{ ERRTAB_ENTRY(ESLURM_REST_MISSING_UID),
"Missing UNIX user in the system"},
{ ERRTAB_ENTRY(ESLURM_REST_MISSING_GID),
"Missing UNIX group in the system"},
/* data_t errors */
{ ERRTAB_ENTRY(ESLURM_DATA_PATH_NOT_FOUND),
"Unable to resolve path"},
{ ERRTAB_ENTRY(ESLURM_DATA_PTR_NULL),
"Data pointer is NULL"},
{ ERRTAB_ENTRY(ESLURM_DATA_CONV_FAILED),
"Unable to convert Data type"},
{ ERRTAB_ENTRY(ESLURM_DATA_REGEX_COMPILE),
"Unable to compile regex"},
{ ERRTAB_ENTRY(ESLURM_DATA_UNKNOWN_MIME_TYPE),
"MIME type is unknown to any loaded plugins"},
{ ERRTAB_ENTRY(ESLURM_DATA_TOO_LARGE),
"Data too large to handle"},
{ ERRTAB_ENTRY(ESLURM_DATA_FLAGS_INVALID_TYPE),
"Data parser expects flags to be a list"},
{ ERRTAB_ENTRY(ESLURM_DATA_FLAGS_INVALID),
"Data parser unable to parse invalid flag"},
{ ERRTAB_ENTRY(ESLURM_DATA_EXPECTED_LIST),
"Data parser expected a list"},
{ ERRTAB_ENTRY(ESLURM_DATA_EXPECTED_DICT),
"Data parser expected a dictionary or object"},
{ ERRTAB_ENTRY(ESLURM_DATA_AMBIGUOUS_MODIFY),
"Request matched more than one object to modify. Modifications must only apply to a single object. Try adding more properties to make update match a unique object."},
{ ERRTAB_ENTRY(ESLURM_DATA_AMBIGUOUS_QUERY),
"Request matched more than one object to query. Request is limited to query of a single matching object."},
{ ERRTAB_ENTRY(ESLURM_DATA_PARSE_NOTHING),
"Request to parse empty string rejected"},
{ ERRTAB_ENTRY(ESLURM_DATA_INVALID_PARSER),
"Invalid parser requested"},
{ ERRTAB_ENTRY(ESLURM_DATA_PARSING_DEPTH),
"Parsing tree too deep. Possible cyclic parsing detected"},
{ ERRTAB_ENTRY(ESLURM_DATA_PARSER_INVALID_STATE),
"Parser went into an invalid state. Possible library issue."},
/* container errors */
{ ERRTAB_ENTRY(ESLURM_CONTAINER_NOT_CONFIGURED),
"Container support is not configured"},
/* url errors */
{ ERRTAB_ENTRY(ESLURM_URL_UNKNOWN_SCHEME),
"Unknown URL scheme"},
{ ERRTAB_ENTRY(ESLURM_URL_EMPTY),
"URL string is empty"},
{ ERRTAB_ENTRY(ESLURM_URL_NON_NULL_TERMINATOR),
"Invalid non-NULL terminated URL" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_FORMATING),
"Invalid format for URL format" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_SCHEME),
"Invalid or unknown URL scheme" },
{ ERRTAB_ENTRY(ESLURM_URL_UNSUPPORTED_SCHEME),
"URL scheme not supported" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_HOST),
"Invalid or unknown URL host" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_PORT),
"Invalid or unknown URL port" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_PATH),
"Invalid or unknown URL path" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_QUERY),
"Invalid or unknown URL query" },
{ ERRTAB_ENTRY(ESLURM_URL_INVALID_FRAGMENT),
"Invalid or unknown URL fragment" },
{ ERRTAB_ENTRY(ESLURM_URL_UNSUPPORTED_FORMAT),
"URL format not supported" },
/* http errors */
{ ERRTAB_ENTRY(ESLURM_HTTP_EMPTY_HEADER),
"Invalid empty HTTP header" },
{ ERRTAB_ENTRY(ESLURM_HTTP_PARSING_FAILURE),
"Unspecified error during HTTP parsing" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNEXPECTED_URL),
"Unexpected duplicate URL" },
{ ERRTAB_ENTRY(ESLURM_HTTP_INVALID_STATUS_CODE),
"Invalid HTTP status code" },
{ ERRTAB_ENTRY(ESLURM_HTTP_INVALID_METHOD),
"Invalid HTTP method" },
{ ERRTAB_ENTRY(ESLURM_HTTP_MISSING_LF),
"Expected LF character but not found" },
{ ERRTAB_ENTRY(ESLURM_HTTP_INVALID_CHARACTER),
"Unexpected character added or missing in HTTP" },
{ ERRTAB_ENTRY(ESLURM_HTTP_INVALID_CONTENT_LENGTH),
"Unexpected character or unparsable number in HTTP Content-Length header" },
{ ERRTAB_ENTRY(ESLURM_HTTP_INVALID_TRANSFER_ENCODING),
"Invalid HTTP Tranfser-Encoding header" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNSUPPORTED_CHUNK_ENCODING),
"HTTP Chunked Transfer-Encoding not supported" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNEXPECTED_REQUEST),
"Received unexpected HTTP Request" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNSUPPORTED_VERSION),
"Only HTTP version 1.1 requests are supported" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNSUPPORTED_UPGRADE),
"HTTP protocol upgrading is not supported." },
{ ERRTAB_ENTRY(ESLURM_HTTP_INVALID_CONTENT_ENCODING),
"Invalid or unsupported HTTP Content-Encoding header" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNSUPPORTED_EXPECT),
"Invalid or unsupported HTTP Content-Encoding header" },
{ ERRTAB_ENTRY(ESLURM_HTTP_UNSUPPORTED_KEEP_ALIVE),
"Invalid or unsupported HTTP Keep-Alive header" },
/* TLS errors */
{ ERRTAB_ENTRY(ESLURM_TLS_REQUIRED),
"TLS missing but required for connection" },
};
unsigned int slurm_errtab_size = sizeof(slurm_errtab) / sizeof(slurm_errtab_t);
/*
* Linear search through table of errno values and strings,
* returns NULL on error, string on success.
*/
static char *_lookup_slurm_api_errtab(int errnum)
{
char *res = NULL;
int i;
for (i = 0; i < slurm_errtab_size; i++) {
if (slurm_errtab[i].xe_number == errnum) {
res = slurm_errtab[i].xe_message;
break;
}
}
return res;
}
/*
* Return string associated with error (Slurm or system).
* Always returns a valid string (because strerror always does).
*/
char *slurm_strerror(int errnum)
{
char *res = _lookup_slurm_api_errtab(errnum);
if (res)
return res;
else if (errnum > 0)
return strerror(errnum);
else
return "Unknown negative error number";
}
/*
* Print "message: error description" on stderr for current errno value.
*/
void slurm_perror(const char *msg)
{
fprintf(stderr, "%s: %s\n", msg, slurm_strerror(errno));
}