/src/sview/job_info.c
C | 4370 lines | 3809 code | 406 blank | 155 comment | 672 complexity | 7c6477fd62adad1796e0a4c59e75ae66 MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- /*****************************************************************************\
- * job_info.c - Functions related to job display mode of sview.
- *****************************************************************************
- * Copyright (C) 2004-2007 The Regents of the University of California.
- * Copyright (C) 2008-2011 Lawrence Livermore National Security.
- * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
- * Written by Danny Auble <da@llnl.gov>
- *
- * CODE-OCEC-09-009. All rights reserved.
- *
- * This file is part of SLURM, a resource management program.
- * For details, see <http://www.schedmd.com/slurmdocs/>.
- * 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.
- *
- * 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.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- \*****************************************************************************/
- #include <fcntl.h>
- #include <grp.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include "src/common/uid.h"
- #include "src/common/node_select.h"
- #include "src/sview/sview.h"
- #include "src/common/parse_time.h"
- #include "src/common/proc_args.h"
- #include "src/common/slurm_strcasestr.h"
- #define _DEBUG 0
- #define MAX_CANCEL_RETRY 10
- #define SIZE(a) (sizeof(a)/sizeof(a[0]))
- /* We do not read the node table here, but allocated space for up to
- * MAX_NODE_SPACE nodes and generate fatal error if we go higher. Increase
- * this value if needed */
- #ifndef SVIEW_MAX_NODE_SPACE
- #define SVIEW_MAX_NODE_SPACE (24 * 1024)
- #endif
- /* Collection of data for printing reports. Like data is combined here */
- typedef struct {
- int color_inx;
- GtkTreeIter iter_ptr;
- bool iter_set;
- job_info_t *job_ptr;
- int node_cnt;
- char *nodes;
- int pos;
- bool small_block;
- List step_list;
- } sview_job_info_t;
- static List foreach_list = NULL;
- static char *stacked_job_list = NULL;
- typedef struct {
- int job_id;
- int state;
- int step_id;
- } jobs_foreach_t;
- typedef struct {
- int edit_type;
- GtkWidget *entry;
- job_desc_msg_t *job_msg;
- char *type;
- } jobs_foreach_common_t;
- enum {
- EDIT_SIGNAL = 1,
- EDIT_SIGNAL_USER,
- EDIT_CANCEL,
- EDIT_CANCEL_USER,
- EDIT_REQUEUE,
- EDIT_SUSPEND,
- EDIT_EDIT
- };
- /* These need to be in alpha order (except POS and CNT) */
- enum {
- SORTID_POS = POS_LOC,
- SORTID_ACCOUNT,
- SORTID_ACTION,
- SORTID_ALLOC,
- SORTID_ALLOC_NODE,
- SORTID_ALPS_RESV_ID,
- SORTID_BATCH,
- SORTID_BATCH_HOST,
- SORTID_BLOCK,
- SORTID_COLOR,
- SORTID_COLOR_INX,
- SORTID_COMMAND,
- SORTID_COMMENT,
- SORTID_CONNECTION,
- SORTID_CONTIGUOUS,
- /* SORTID_CORES_MAX, */
- /* SORTID_CORES_MIN, */
- SORTID_CPUS,
- SORTID_CPU_MAX,
- SORTID_CPU_MIN,
- SORTID_CPUS_PER_TASK,
- SORTID_DEPENDENCY,
- SORTID_DERIVED_EC,
- SORTID_EXIT_CODE,
- SORTID_FEATURES,
- SORTID_GEOMETRY,
- SORTID_GRES,
- SORTID_GROUP_ID,
- SORTID_IMAGE_BLRTS,
- #ifdef HAVE_BGL
- SORTID_IMAGE_LINUX,
- SORTID_IMAGE_MLOADER,
- SORTID_IMAGE_RAMDISK,
- #else
- SORTID_IMAGE_LINUX,
- SORTID_IMAGE_RAMDISK,
- SORTID_IMAGE_MLOADER,
- #endif
- SORTID_JOBID,
- SORTID_LICENSES,
- SORTID_CPU_REQ,
- SORTID_MEM_MIN,
- SORTID_TMP_DISK,
- #ifdef HAVE_BG
- SORTID_NODELIST,
- SORTID_NODELIST_EXC,
- SORTID_NODELIST_REQ,
- #endif
- SORTID_NAME,
- SORTID_NETWORK,
- SORTID_NICE,
- #ifndef HAVE_BG
- SORTID_NODELIST,
- SORTID_NODELIST_EXC,
- SORTID_NODELIST_REQ,
- #endif
- SORTID_NODE_INX,
- SORTID_NODES,
- SORTID_NODES_MAX,
- SORTID_NODES_MIN,
- /* SORTID_NTASKS_PER_CORE, */
- /* SORTID_NTASKS_PER_NODE, */
- /* SORTID_NTASKS_PER_SOCKET, */
- SORTID_PARTITION,
- SORTID_PREEMPT_TIME,
- SORTID_PRIORITY,
- SORTID_QOS,
- SORTID_REASON,
- SORTID_REQUEUE,
- SORTID_RESV_NAME,
- SORTID_RESTARTS,
- SORTID_ROTATE,
- SORTID_SHARED,
- /* SORTID_SOCKETS_MAX, */
- /* SORTID_SOCKETS_MIN, */
- SORTID_STATE,
- SORTID_STATE_NUM,
- SORTID_SWITCHES,
- SORTID_TASKS,
- /* SORTID_THREADS_MAX, */
- /* SORTID_THREADS_MIN, */
- SORTID_TIME_ELIGIBLE,
- SORTID_TIME_END,
- SORTID_TIMELIMIT,
- SORTID_TIME_RESIZE,
- SORTID_TIME_RUNNING,
- SORTID_TIME_START,
- SORTID_TIME_SUBMIT,
- SORTID_TIME_SUSPEND,
- SORTID_SMALL_BLOCK,
- SORTID_UPDATED,
- SORTID_USER_ID,
- SORTID_WCKEY,
- SORTID_WORKDIR,
- SORTID_CNT
- };
- /* extra field here is for choosing the type of edit you that will
- * take place. If you choose EDIT_MODEL (means only display a set of
- * known options) create it in function create_model_*.
- */
- static char *_initial_page_opts = ("JobID,Partition,BG_Block,"
- "ALPS_Resv_ID,UserID,Name,"
- "State,Time_Running,Node_Count,NodeList");
- static display_data_t display_data_job[] = {
- {G_TYPE_INT, SORTID_POS, NULL, FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_JOBID, "JobID", FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_COLOR, NULL, TRUE, EDIT_COLOR,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_ACTION, "Action", FALSE,
- EDIT_MODEL, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_ALLOC, NULL, FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_PARTITION, "Partition", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #ifdef HAVE_BG
- {G_TYPE_STRING, SORTID_BLOCK, "BG Block", FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_GEOMETRY, "Geometry",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_ROTATE, "Rotate",
- FALSE, EDIT_MODEL, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CONNECTION, "Connection",
- FALSE, EDIT_MODEL, refresh_job, create_model_job, admin_edit_job},
- #ifdef HAVE_BGL
- {G_TYPE_STRING, SORTID_IMAGE_BLRTS, "Image Blrts",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_LINUX, "Image Linux",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_RAMDISK, "Image Ramdisk",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #else
- {G_TYPE_STRING, SORTID_IMAGE_BLRTS, NULL,
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_LINUX, "Image Cnload",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_RAMDISK, "Image Ioload",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #endif
- {G_TYPE_STRING, SORTID_IMAGE_MLOADER, "Image Mloader",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #else
- {G_TYPE_STRING, SORTID_BLOCK, NULL, TRUE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_GEOMETRY, NULL,
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_ROTATE, NULL,
- FALSE, EDIT_MODEL, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CONNECTION, NULL,
- FALSE, EDIT_MODEL, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_BLRTS, NULL,
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_LINUX, NULL,
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_RAMDISK, NULL,
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_IMAGE_MLOADER, NULL,
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #endif
- #ifdef HAVE_CRAY
- {G_TYPE_STRING, SORTID_ALPS_RESV_ID, "ALPS Resv ID", FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- #else
- {G_TYPE_STRING, SORTID_ALPS_RESV_ID, NULL, TRUE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- #endif
- {G_TYPE_STRING, SORTID_USER_ID, "UserID", FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_GROUP_ID, "GroupID", FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_WCKEY, "WCKey", FALSE, EDIT_TEXTBOX, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NAME, "Name", FALSE, EDIT_TEXTBOX, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_STATE, "State", FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_STATE_NUM, NULL, FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_PREEMPT_TIME, "Preempt Time", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_RESIZE, "Time Resize", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_RUNNING, "Time Running", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_SUBMIT, "Time Submit", FALSE,
- EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_ELIGIBLE, "Time Eligible", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_START, "Time Start", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_END, "Time End", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIME_SUSPEND, "Time Suspended", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIMELIMIT, "Time Limit", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODES, "Node Count", FALSE, EDIT_TEXTBOX,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CPUS, "CPU Count",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- #ifdef HAVE_BG
- {G_TYPE_STRING, SORTID_NODELIST, "MidplaneList", FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODELIST_EXC, "MidplaneList Excluded",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODELIST_REQ, "MidplaneList Requested",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #else
- {G_TYPE_STRING, SORTID_NODELIST, "NodeList", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODELIST_EXC, "NodeList Excluded",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODELIST_REQ, "NodeList Requested",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- #endif
- {G_TYPE_STRING, SORTID_CONTIGUOUS, "Contiguous", FALSE, EDIT_MODEL,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_REQUEUE, "Requeue", FALSE, EDIT_MODEL,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_RESTARTS, "Restart Count", FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- /* Priority is a string so we can edit using a text box */
- {G_TYPE_STRING, SORTID_PRIORITY, "Priority", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_DERIVED_EC, "Derived Exit Code", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_EXIT_CODE, "Exit Code", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_BATCH, "Batch Flag", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_BATCH_HOST, "Batch Host", FALSE,
- EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CPU_MIN, "CPUs Min",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CPU_MAX, "CPUs Max",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TASKS, "Task Count",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_SHARED, "Shared", FALSE,
- EDIT_MODEL, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CPUS_PER_TASK, "CPUs per Task",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_RESV_NAME, "Reservation Name",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODES_MIN, "Nodes Min",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODES_MAX, "Nodes Max",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_CPU_REQ, "Min CPUs Per Node",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_MEM_MIN, "Min Memory",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TMP_DISK, "Min Tmp Disk Per Node",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- /* Nice is a string so we can edit using a text box */
- {G_TYPE_STRING, SORTID_NICE, "Nice", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_ACCOUNT, "Account", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_QOS, "QOS", FALSE,
- EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_REASON, "Reason Waiting",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_SWITCHES, "Switches",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_FEATURES, "Features",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_GRES, "Gres",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_LICENSES, "Licenses",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_DEPENDENCY, "Dependency",
- FALSE, EDIT_TEXTBOX, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_ALLOC_NODE, "Alloc Node : Sid",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- #ifdef HAVE_AIX
- {G_TYPE_STRING, SORTID_NETWORK, "Network",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- #else
- {G_TYPE_STRING, SORTID_NETWORK, NULL,
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- #endif
- {G_TYPE_STRING, SORTID_COMMAND, "Command",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_COMMENT, "Comment",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_WORKDIR, "Work Dir",
- FALSE, EDIT_NONE, refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_COLOR_INX, NULL, FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_POINTER, SORTID_NODE_INX, NULL, FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_SMALL_BLOCK, NULL, FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_INT, SORTID_UPDATED, NULL, FALSE, EDIT_NONE, refresh_job,
- create_model_job, admin_edit_job},
- {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE}
- };
- static display_data_t create_data_job[] = {
- {G_TYPE_INT, SORTID_POS, NULL, FALSE, EDIT_NONE,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_COMMAND, "Script File", FALSE, EDIT_TEXTBOX,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TIMELIMIT, "Time Limit", FALSE, EDIT_TEXTBOX,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_NODES_MIN, "Nodes Min", FALSE, EDIT_TEXTBOX,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_STRING, SORTID_TASKS, "Task Count", FALSE, EDIT_TEXTBOX,
- refresh_job, create_model_job, admin_edit_job},
- {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE}
- };
- static display_data_t options_data_job[] = {
- {G_TYPE_INT, SORTID_POS, NULL, FALSE, EDIT_NONE},
- {G_TYPE_STRING, INFO_PAGE, "Full Info", TRUE, JOB_PAGE},
- {G_TYPE_STRING, JOB_PAGE, "Signal", TRUE, ADMIN_PAGE},
- {G_TYPE_STRING, JOB_PAGE, "Requeue", TRUE, ADMIN_PAGE},
- {G_TYPE_STRING, JOB_PAGE, "Cancel", TRUE, ADMIN_PAGE},
- {G_TYPE_STRING, JOB_PAGE, "Suspend/Resume", TRUE, ADMIN_PAGE},
- {G_TYPE_STRING, JOB_PAGE, "Edit Job", TRUE, ADMIN_PAGE},
- {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, JOB_PAGE},
- #ifdef HAVE_BG
- {G_TYPE_STRING, BLOCK_PAGE, "Block", TRUE, JOB_PAGE},
- {G_TYPE_STRING, NODE_PAGE, "Midplanes", TRUE, JOB_PAGE},
- #else
- {G_TYPE_STRING, BLOCK_PAGE, NULL, TRUE, JOB_PAGE},
- {G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, JOB_PAGE},
- #endif
- {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, JOB_PAGE},
- {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE}
- };
- struct signv {
- char *name;
- uint16_t val;
- } sig_name_num[ ] = {
- { "HUP", SIGHUP },
- { "INT", SIGINT },
- { "QUIT", SIGQUIT },
- { "ABRT", SIGABRT },
- { "KILL", SIGKILL },
- { "ALRM", SIGALRM },
- { "TERM", SIGTERM },
- { "USR1", SIGUSR1 },
- { "USR2", SIGUSR2 },
- { "CONT", SIGCONT },
- { "STOP", SIGSTOP },
- { "TSTP", SIGTSTP },
- { "TTIN", SIGTTIN },
- { "TTOU", SIGTTOU },
- { "SIGHUP", SIGHUP },
- { "SIGINT", SIGINT },
- { "SIGQUIT", SIGQUIT },
- { "SIGABRT", SIGABRT },
- { "SIGKILL", SIGKILL },
- { "SIGALRM", SIGALRM },
- { "SIGTERM", SIGTERM },
- { "SIGUSR1", SIGUSR1 },
- { "SIGUSR2", SIGUSR2 },
- { "SIGCONT", SIGCONT },
- { "SIGSTOP", SIGSTOP },
- { "SIGTSTP", SIGTSTP },
- { "SIGTTIN", SIGTTIN },
- { "SIGTTOU", SIGTTOU }
- };
- static display_data_t *local_display_data = NULL;
- static char *got_edit_signal = NULL;
- static void _update_info_step(sview_job_info_t *sview_job_info_ptr,
- GtkTreeModel *model,
- GtkTreeIter *step_iter,
- GtkTreeIter *iter);
- static char *_read_file(const char *f_name)
- {
- int fd, f_size, offset = 0;
- ssize_t rd_size;
- struct stat f_stat;
- char *buf;
- fd = open(f_name, 0);
- if (fd < 0)
- return NULL;
- if (fstat(fd, &f_stat)) {
- close(fd);
- return NULL;
- }
- f_size = f_stat.st_size;
- buf = xmalloc(f_size);
- while (offset < f_size) {
- rd_size = read(fd, buf+offset, f_size-offset);
- if (rd_size < 0) {
- if ((errno == EAGAIN) || (errno == EINTR))
- continue;
- xfree(buf);
- break;
- }
- offset += rd_size;
- }
- close(fd);
- return buf;
- }
- static void _job_info_list_del(void *object)
- {
- sview_job_info_t *sview_job_info = (sview_job_info_t *)object;
- if (sview_job_info) {
- xfree(sview_job_info->nodes);
- if (sview_job_info->step_list)
- list_destroy(sview_job_info->step_list);
- xfree(sview_job_info);
- }
- }
- static void _destroy_jobs_foreach(void *object)
- {
- jobs_foreach_t *jobs_foreach = (jobs_foreach_t *)object;
- xfree(jobs_foreach);
- }
- /* translate name name to number */
- static uint16_t _xlate_signal_name(const char *signal_name)
- {
- uint16_t sig_num = (uint16_t)NO_VAL;
- char *end_ptr, *sig_names = NULL;
- int i;
- sig_num = (uint16_t) strtol(signal_name, &end_ptr, 10);
- if ((*end_ptr == '\0') && (sig_num != 0))
- return sig_num;
- for (i=0; i<SIZE(sig_name_num); i++) {
- if (strcasecmp(sig_name_num[i].name, signal_name) == 0) {
- xfree(sig_names);
- return sig_name_num[i].val;
- }
- if (i == 0)
- sig_names = xstrdup(sig_name_num[i].name);
- else {
- xstrcat(sig_names, ",");
- xstrcat(sig_names, sig_name_num[i].name);
- }
- }
- xfree(sig_names);
- return (uint16_t)NO_VAL;
- }
- static int _cancel_job_id (uint32_t job_id, uint16_t signal)
- {
- int error_code = SLURM_SUCCESS, i;
- char *temp = NULL;
- if (signal == (uint16_t)-1)
- signal = SIGKILL;
- for (i = 0; i < MAX_CANCEL_RETRY; i++) {
- /* NOTE: RPC always sent to slurmctld rather than directly
- * to slurmd daemons */
- error_code = slurm_kill_job(job_id, signal, false);
- if (error_code == 0
- || (errno != ESLURM_TRANSITION_STATE_NO_UPDATE
- && errno != ESLURM_JOB_PENDING))
- break;
- temp = g_strdup_printf("Sending signal %u to job %u",
- signal, job_id);
- display_edit_note(temp);
- g_free(temp);
- sleep ( 5 + i );
- }
- if (error_code) {
- error_code = slurm_get_errno();
- if ((error_code != ESLURM_ALREADY_DONE) &&
- (error_code != ESLURM_INVALID_JOB_ID)) {
- temp = g_strdup_printf(
- "Kill job error on job id %u: %s",
- job_id, slurm_strerror(slurm_get_errno()));
- display_edit_note(temp);
- g_free(temp);
- } else {
- display_edit_note(slurm_strerror(slurm_get_errno()));
- }
- }
- return error_code;
- }
- static int _cancel_step_id(uint32_t job_id, uint32_t step_id,
- uint16_t signal)
- {
- int error_code = SLURM_SUCCESS, i;
- char *temp = NULL;
- if (signal == (uint16_t)-1)
- signal = SIGKILL;
- for (i = 0; i < MAX_CANCEL_RETRY; i++) {
- /* NOTE: RPC always sent to slurmctld rather than directly
- * to slurmd daemons */
- if (signal == SIGKILL) {
- error_code = slurm_terminate_job_step(job_id, step_id);
- } else {
- error_code = slurm_kill_job_step(job_id, step_id,
- signal);
- }
- if (error_code == 0
- || (errno != ESLURM_TRANSITION_STATE_NO_UPDATE
- && errno != ESLURM_JOB_PENDING))
- break;
- temp = g_strdup_printf("Sending signal %u to job step %u.%u",
- signal, job_id, step_id);
- display_edit_note(temp);
- g_free(temp);
- sleep ( 5 + i );
- }
- if (error_code) {
- error_code = slurm_get_errno();
- if (error_code != ESLURM_ALREADY_DONE) {
- temp = g_strdup_printf(
- "Kill job error on job step id %u.%u: %s",
- job_id, step_id,
- slurm_strerror(slurm_get_errno()));
- display_edit_note(temp);
- g_free(temp);
- } else {
- display_edit_note(slurm_strerror(slurm_get_errno()));
- }
- }
- return error_code;
- }
- static void _set_active_combo_job(GtkComboBox *combo,
- GtkTreeModel *model, GtkTreeIter *iter,
- int type)
- {
- char *temp_char = NULL;
- int action = 0;
- if (model)
- gtk_tree_model_get(model, iter, type, &temp_char, -1);
- if (!temp_char)
- goto end_it;
- switch(type) {
- case SORTID_ACTION:
- if (!strcasecmp(temp_char, "None"))
- action = 0;
- else if (!strcasecmp(temp_char, "Cancel"))
- action = 1;
- else if (!strcasecmp(temp_char, "Suspend"))
- action = 2;
- else if (!strcasecmp(temp_char, "Resume"))
- action = 3;
- else if (!strcasecmp(temp_char, "Checkpoint"))
- action = 4;
- else if (!strcasecmp(temp_char, "Requeue"))
- action = 5;
- else
- action = 0;
- break;
- case SORTID_SHARED:
- case SORTID_CONTIGUOUS:
- case SORTID_REQUEUE:
- case SORTID_ROTATE:
- if (!strcasecmp(temp_char, "yes"))
- action = 0;
- else if (!strcasecmp(temp_char, "no"))
- action = 1;
- else
- action = 0;
- break;
- case SORTID_CONNECTION:
- if (!strcasecmp(temp_char, "Torus"))
- action = 0;
- else if (!strcasecmp(temp_char, "Mesh"))
- action = 1;
- else if (!strcasecmp(temp_char, "NAV"))
- action = 2;
- else if (!strcasecmp(temp_char, "HTC_S"))
- action = 3;
- else if (!strcasecmp(temp_char, "HTC_D"))
- action = 4;
- else if (!strcasecmp(temp_char, "HTC_V"))
- action = 5;
- else if (!strcasecmp(temp_char, "HTC_L"))
- action = 6;
- else
- action = 0;
- break;
- default:
- break;
- }
- g_free(temp_char);
- end_it:
- gtk_combo_box_set_active(combo, action);
- }
- /* don't free this char */
- static const char *_set_job_msg(job_desc_msg_t *job_msg, const char *new_text,
- int column)
- {
- char *type = "";
- int temp_int = 0;
- char *p;
- uint16_t rotate;
- uint16_t conn_type[cluster_dims];
- char* token, *delimiter = ",x", *next_ptr;
- char *sep_char;
- int j;
- uint16_t geo[cluster_dims];
- char* geometry_tmp = xstrdup(new_text);
- char* original_ptr = geometry_tmp;
- /* need to clear global_edit_error here (just in case) */
- global_edit_error = 0;
- if (!job_msg)
- return NULL;
- switch(column) {
- case SORTID_ACTION:
- xfree(got_edit_signal);
- if (!strcasecmp(new_text, "None"))
- got_edit_signal = NULL;
- else
- got_edit_signal = xstrdup(new_text);
- break;
- case SORTID_TIMELIMIT:
- if (!strcasecmp(new_text, "infinite"))
- temp_int = INFINITE;
- else
- temp_int = time_str2mins((char *)new_text);
- type = "timelimit";
- if (temp_int <= 0 && temp_int != INFINITE)
- goto return_error;
- job_msg->time_limit = (uint32_t)temp_int;
- break;
- case SORTID_PRIORITY:
- if (!strcasecmp(new_text, "infinite"))
- temp_int = INFINITE;
- else
- temp_int = strtol(new_text, (char **)NULL, 10);
- type = "priority";
- if ((temp_int < 0) && (temp_int != INFINITE))
- goto return_error;
- job_msg->priority = (uint32_t)temp_int;
- break;
- case SORTID_NICE:
- temp_int = strtol(new_text, (char **)NULL, 10);
- type = "nice";
- if (abs(temp_int) > NICE_OFFSET) {
- //error("Invalid nice value, must be between "
- // "-%d and %d", NICE_OFFSET, NICE_OFFSET);
- goto return_error;
- }
- job_msg->nice = NICE_OFFSET + temp_int;
- break;
- case SORTID_CPU_REQ:
- temp_int = strtol(new_text, &p, 10);
- if (*p == 'k' || *p == 'K')
- temp_int *= 1024;
- else if (*p == 'm' || *p == 'M')
- temp_int *= 1048576;
- type = "min cpus per node";
- if (temp_int <= 0)
- goto return_error;
- job_msg->pn_min_cpus = (uint32_t)temp_int;
- break;
- case SORTID_TASKS:
- temp_int = strtol(new_text, (char **)NULL, 10);
- type = "requested tasks";
- if (temp_int <= 0)
- goto return_error;
- job_msg->num_tasks = (uint32_t)temp_int;
- break;
- case SORTID_CPUS_PER_TASK:
- temp_int = strtol(new_text, (char **)NULL, 10);
- type = "cpus per task";
- if (temp_int <= 0)
- goto return_error;
- job_msg->cpus_per_task = (uint32_t)temp_int;
- break;
- case SORTID_RESV_NAME:
- job_msg->reservation = xstrdup(new_text);
- type = "reservation name";
- break;
- case SORTID_NODES_MIN:
- temp_int = strtol(new_text, &p, 10);
- if (*p == 'k' || *p == 'K')
- temp_int *= 1024;
- else if (*p == 'm' || *p == 'M')
- temp_int *= 1048576;
- type = "min nodes";
- if (temp_int <= 0)
- goto return_error;
- job_msg->min_nodes = (uint32_t)temp_int;
- break;
- case SORTID_NODES:
- temp_int = strtol(new_text, &p, 10);
- if (*p == 'k' || *p == 'K')
- temp_int *= 1024;
- else if (*p == 'm' || *p == 'M')
- temp_int *= 1048576;
- type = "node count";
- if (temp_int <= 0)
- goto return_error;
- job_msg->min_nodes = job_msg->max_nodes = (uint32_t)temp_int;
- break;
- case SORTID_NODES_MAX:
- temp_int = strtol(new_text, &p, 10);
- if (*p == 'k' || *p == 'K')
- temp_int *= 1024;
- else if (*p == 'm' || *p == 'M')
- temp_int *= 1048576;
- type = "max nodes";
- if (temp_int <= 0)
- goto return_error;
- if (cluster_flags & CLUSTER_FLAG_BG)
- /* this needs to be set up for correct functionality */
- if (job_msg->min_nodes == NO_VAL)
- job_msg->min_nodes = (uint32_t)temp_int;
- job_msg->max_nodes = (uint32_t)temp_int;
- break;
- case SORTID_MEM_MIN:
- temp_int = strtol(new_text, &p, 10);
- if (*p == 'g' || *p == 'G')
- temp_int *= 1024;
- else if (*p == 't' || *p == 'T')
- temp_int *= 1048576;
- p = slurm_strcasestr((char *)new_text, "cpu");
- if (p)
- type = "min memory per cpu";
- else
- type = "min memory per node";
- if (temp_int <= 0)
- goto return_error;
- job_msg->pn_min_memory = (uint32_t)temp_int;
- if (p)
- job_msg->pn_min_memory |= MEM_PER_CPU;
- break;
- case SORTID_TMP_DISK:
- temp_int = strtol(new_text, &p, 10);
- if (*p == 'g' || *p == 'G')
- temp_int *= 1024;
- else if (*p == 't' || *p == 'T')
- temp_int *= 1048576;
- type = "min tmp disk per node";
- if (temp_int <= 0)
- goto return_error;
- job_msg->pn_min_tmp_disk = (uint32_t)temp_int;
- break;
- case SORTID_PARTITION:
- job_msg->partition = xstrdup(new_text);
- type = "partition";
- break;
- case SORTID_NAME:
- job_msg->name = xstrdup(new_text);
- type = "name";
- break;
- case SORTID_WCKEY:
- job_msg->wckey = xstrdup(new_text);
- type = "wckey";
- break;
- case SORTID_SHARED:
- if (!strcasecmp(new_text, "yes"))
- job_msg->shared = 1;
- else
- job_msg->shared = 0;
- type = "shared";
- break;
- case SORTID_CONTIGUOUS:
- if (!strcasecmp(new_text, "yes"))
- job_msg->contiguous = 1;
- else
- job_msg->contiguous = 0;
- type = "contiguous";
- break;
- case SORTID_REQUEUE:
- if (!strcasecmp(new_text, "yes"))
- job_msg->requeue = 1;
- else
- job_msg->requeue = 0;
- type = "requeue";
- break;
- case SORTID_NODELIST_REQ:
- job_msg->req_nodes = xstrdup(new_text);
- type = "requested nodelist";
- break;
- case SORTID_NODELIST_EXC:
- job_msg->exc_nodes = xstrdup(new_text);
- type = "excluded nodelist";
- break;
- case SORTID_FEATURES:
- job_msg->features = xstrdup(new_text);
- type = "features";
- break;
- case SORTID_GRES:
- job_msg->gres = xstrdup(new_text);
- type = "gres";
- break;
- case SORTID_LICENSES:
- job_msg->licenses = xstrdup(new_text);
- type = "licenses";
- break;
- case SORTID_ACCOUNT:
- job_msg->account = xstrdup(new_text);
- type = "account";
- break;
- case SORTID_QOS:
- job_msg->qos = xstrdup(new_text);
- type = "qos";
- break;
- case SORTID_COMMAND:
- type = "script_file";
- xfree(job_msg->script);
- job_msg->script = _read_file(new_text);
- if (job_msg->script == NULL)
- goto return_error;
- if (job_msg->argc) {
- for (j = 0; j < job_msg->argc; j++)
- xfree(job_msg->argv[j]);
- }
- xfree(job_msg->argv);
- xfree(job_msg->name);
- job_msg->argc = 1;
- job_msg->argv = xmalloc(sizeof(char *) * job_msg->argc);
- if (new_text[0] == '/') {
- job_msg->argv[0] = xstrdup(new_text);
- token = strrchr(new_text, (int) '/');
- if (token)
- job_msg->name = xstrdup(token + 1);
- } else {
- job_msg->argv[0] = xmalloc(1024);
- if (!getcwd(job_msg->argv[0], 1024))
- goto return_error;
- xstrcat(job_msg->argv[0], "/");
- xstrcat(job_msg->argv[0], new_text);
- job_msg->name = xstrdup(new_text);
- }
- break;
- case SORTID_DEPENDENCY:
- job_msg->dependency = xstrdup(new_text);
- type = "dependency";
- break;
- case SORTID_GEOMETRY:
- type = "geometry";
- token = strtok_r(geometry_tmp, delimiter, &next_ptr);
- for (j=0; j<cluster_dims; j++)
- geo[j] = (uint16_t) NO_VAL;
- for (j=0; j<cluster_dims; j++) {
- if (!token) {
- //error("insufficient dimensions in "
- // "Geometry");
- goto return_error;
- }
- geo[j] = (uint16_t) atoi(token);
- if (geo[j] <= 0) {
- //error("invalid --geometry argument");
- goto return_error;
- break;
- }
- geometry_tmp = next_ptr;
- token = strtok_r(geometry_tmp, delimiter,
- &next_ptr);
- }
- if (token) {
- //error("too many dimensions in Geometry");
- goto return_error;
- }
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_GEOMETRY,
- (void *) &geo);
- break;
- case SORTID_ROTATE:
- type = "rotate";
- if (!strcasecmp(new_text, "yes")) {
- rotate = 1;
- } else {
- rotate = 0;
- }
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_ROTATE,
- (void *) &rotate);
- break;
- case SORTID_CONNECTION:
- verify_conn_type(new_text, conn_type);
- type = "connection";
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_CONN_TYPE,
- (void *) &conn_type);
- break;
- case SORTID_IMAGE_BLRTS:
- type = "BlrtsImage";
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_BLRTS_IMAGE,
- (void *) new_text);
- break;
- case SORTID_IMAGE_LINUX:
- if (cluster_flags & CLUSTER_FLAG_BGL)
- type = "LinuxImage";
- else
- type = "CnloadImage";
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_LINUX_IMAGE,
- (void *) new_text);
- break;
- case SORTID_IMAGE_MLOADER:
- type = "MloaderImage";
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_MLOADER_IMAGE,
- (void *) new_text);
- break;
- case SORTID_IMAGE_RAMDISK:
- if (cluster_flags & CLUSTER_FLAG_BGL)
- type = "RamdiskImage";
- else
- type = "IoloadImage";
- if (!job_msg->select_jobinfo)
- job_msg->select_jobinfo
- = select_g_select_jobinfo_alloc();
- select_g_select_jobinfo_set(job_msg->select_jobinfo,
- SELECT_JOBDATA_RAMDISK_IMAGE,
- (void *) new_text);
- break;
- case SORTID_TIME_ELIGIBLE:
- case SORTID_TIME_START:
- type = "start time";
- job_msg->begin_time = parse_time((char *)new_text, 0);
- if (!job_msg->begin_time)
- goto return_error;
- if (job_msg->begin_time < time(NULL))
- job_msg->begin_time = time(NULL);
- break;
- case SORTID_SWITCHES:
- type = "switches";
- job_msg->req_switch =
- (uint32_t) strtol(new_text, &sep_char, 10);
- if (sep_char && sep_char[0] == '@') {
- job_msg->wait4switch = time_str2mins(sep_char+1) * 60;
- }
- break;
- default:
- type = "unknown";
- break;
- }
- if (strcmp(type, "unknown"))
- global_send_update_msg = 1;
- xfree(original_ptr);
- return type;
- return_error:
- xfree(original_ptr);
- global_edit_error = 1;
- return type;
- }
- static void _admin_edit_combo_box_job(GtkComboBox *combo,
- job_desc_msg_t *job_msg)
- {
- GtkTreeModel *model = NULL;
- GtkTreeIter iter;
- int column = 0;
- char *name = NULL;
- if (!job_msg)
- return;
- if (!gtk_combo_box_get_active_iter(combo, &iter)) {
- g_print("nothing selected\n");
- return;
- }
- model = gtk_combo_box_get_model(combo);
- if (!model) {
- g_print("nothing selected\n");
- return;
- }
- gtk_tree_model_get(model, &iter, 0, &name, -1);
- gtk_tree_model_get(model, &iter, 1, &column, -1);
- _set_job_msg(job_msg, name, column);
- g_free(name);
- }
- static gboolean _admin_focus_out_job(GtkEntry *entry,
- GdkEventFocus *event,
- job_desc_msg_t *job_msg)
- {
- if (global_entry_changed) {
- const char *col_name = NULL;
- int type = gtk_entry_get_max_length(entry);
- const char *name = gtk_entry_get_text(entry);
- type -= DEFAULT_ENTRY_LENGTH;
- col_name = _set_job_msg(job_msg, name, type);
- if (global_edit_error) {
- if (global_edit_error_msg)
- g_free(global_edit_error_msg);
- global_edit_error_msg = g_strdup_printf(
- "Job %d %s can't be set to %s",
- job_msg->job_id,
- col_name,
- name);
- }
- global_entry_changed = 0;
- }
- return false;
- }
- static GtkWidget *_admin_full_edit_job(job_desc_msg_t *job_msg,
- GtkTreeModel *model, GtkTreeIter *iter)
- {
- GtkScrolledWindow *window = create_scrolled_window();
- GtkBin *bin = NULL;
- GtkViewport *view = NULL;
- GtkTable *table = NULL;
- int i = 0, row = 0;
- display_data_t *display_data = display_data_job;
- gtk_scrolled_window_set_policy(window,
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- bin = GTK_BIN(&window->container);
- view = GTK_VIEWPORT(bin->child);
- bin = GTK_BIN(&view->bin);
- table = GTK_TABLE(bin->child);
- gtk_table_resize(table, SORTID_CNT, 2);
- gtk_table_set_homogeneous(table, FALSE);
- for(i = 0; i < SORTID_CNT; i++) {
- while (display_data++) {
- if (display_data->id == -1)
- break;
- if (!display_data->name)
- continue;
- if (display_data->id != i)
- continue;
- display_admin_edit(
- table, job_msg, &row, model, iter,
- display_data,
- G_CALLBACK(_admin_edit_combo_box_job),
- G_CALLBACK(_admin_focus_out_job),
- _set_active_combo_job);
- break;
- }
- display_data = display_data_job;
- }
- gtk_table_resize(table, row, 2);
- return GTK_WIDGET(window);
- }
- static int _nodes_in_list(char *node_list)
- {
- hostset_t host_set = hostset_create(node_list);
- int count = hostset_count(host_set);
- hostset_destroy(host_set);
- return count;
- }
- static int _get_node_cnt(job_info_t * job)
- {
- int node_cnt = 0;
- /* For PENDING jobs, return the maximum of the requested nodelist,
- * requested maximum number of nodes, or requested CPUs rounded
- * to nearest node.
- *
- * For COMPLETING jobs, the job->nodes nodelist has already been
- * altered to list only the nodes still in the comp state, and
- * thus we count only those nodes toward the total nodes still
- * allocated to this job.
- */
- if (IS_JOB_PENDING(job)) {
- node_cnt = _nodes_in_list(job->req_nodes);
- node_cnt = MAX(node_cnt, job->num_nodes);
- } else
- node_cnt = _nodes_in_list(job->nodes);
- return node_cnt;
- }
- /* this needs to be freed by xfree() */
- static void _convert_char_to_job_and_step(const char *data,
- int *jobid, int *stepid)
- {
- int i = 0;
- if (!data)
- return;
- *jobid = atoi(data);
- *stepid = NO_VAL;
- while (data[i]) {
- if (data[i] == '.') {
- i++;
- if (data[i])
- *stepid = atoi(&data[i]);
- break;
- }
- i++;
- }
- return;
- }
- static void _layout_job_record(GtkTreeView *treeview,
- sview_job_info_t *sview_job_info_ptr,
- int update)
- {
- char *nodes = NULL, *reason = NULL, *uname = NULL;
- char tmp_char[50];
- char time_buf[32];
- char running_char[50];
- time_t now_time = time(NULL);
- int suspend_secs = 0;
- job_info_t *job_ptr = sview_job_info_ptr->job_ptr;
- struct group *group_info = NULL;
- uint16_t term_sig = 0;
- uint32_t min_mem = 0;
- GtkTreeIter iter;
- GtkTreeStore *treestore =
- GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
- if (!treestore)
- return;
- if (!job_ptr->nodes || !strcasecmp(job_ptr->nodes,"waiting...")) {
- sprintf(running_char,"00:00:00");
- nodes = "waiting...";
- } else {
- if (IS_JOB_SUSPENDED(job_ptr))
- now_time = job_ptr->pre_sus_time;
- else {
- if (!IS_JOB_RUNNING(job_ptr) &&
- (job_ptr->end_time != 0))
- now_time = job_ptr->end_time;
- if (job_ptr->suspend_time) {
- now_time = (time_t)
- (difftime(now_time,
- job_ptr->suspend_time)
- + job_ptr->pre_sus_time);
- } else
- now_time = (time_t)difftime(
- now_time, job_ptr->start_time);
- }
- suspend_secs = (time(NULL) - job_ptr->start_time) - now_time;
- secs2time_str(now_time, running_char, sizeof(running_char));
- nodes = sview_job_info_ptr->nodes;
- }
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_ACCOUNT),
- job_ptr->account);
- snprintf(tmp_char, sizeof(tmp_char), "%s:%u",
- job_ptr->alloc_node, job_ptr->alloc_sid);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_ALLOC_NODE),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_CRAYXT)
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_ALPS_RESV_ID),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_DATA));
- if (job_ptr->batch_flag)
- sprintf(tmp_char, "yes");
- else
- sprintf(tmp_char, "no");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_BATCH),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_BATCH_HOST),
- job_ptr->batch_host);
- if (cluster_flags & CLUSTER_FLAG_BG) {
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODELIST),
- nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODELIST_EXC),
- job_ptr->exc_nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODELIST_REQ),
- job_ptr->req_nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_BLOCK),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_BG_ID));
- }
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_COMMAND),
- job_ptr->command);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_COMMENT),
- job_ptr->comment);
- if (cluster_flags & CLUSTER_FLAG_BG)
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CONNECTION),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_CONNECTION));
- if (job_ptr->contiguous)
- sprintf(tmp_char, "yes");
- else
- sprintf(tmp_char, "no");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CONTIGUOUS),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG)
- convert_num_unit((float)job_ptr->num_cpus,
- tmp_char, sizeof(tmp_char),
- UNIT_NONE);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->num_cpus);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CPUS),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG)
- convert_num_unit((float)job_ptr->max_cpus,
- tmp_char, sizeof(tmp_char),
- UNIT_NONE);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->max_cpus);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CPU_MAX),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG)
- convert_num_unit((float)job_ptr->num_cpus,
- tmp_char, sizeof(tmp_char),
- UNIT_NONE);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->num_cpus);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CPU_MIN),
- tmp_char);
- if (job_ptr->cpus_per_task > 0)
- sprintf(tmp_char, "%u", job_ptr->cpus_per_task);
- else
- sprintf(tmp_char, " ");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CPUS_PER_TASK),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_DEPENDENCY),
- job_ptr->dependency);
- if (WIFSIGNALED(job_ptr->derived_ec))
- term_sig = WTERMSIG(job_ptr->derived_ec);
- snprintf(tmp_char, sizeof(tmp_char), "%u:%u",
- WEXITSTATUS(job_ptr->derived_ec), term_sig);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_DERIVED_EC),
- tmp_char);
- if (WIFSIGNALED(job_ptr->exit_code))
- term_sig = WTERMSIG(job_ptr->exit_code);
- else
- term_sig = 0;
- snprintf(tmp_char, sizeof(tmp_char), "%u:%u",
- WEXITSTATUS(job_ptr->exit_code), term_sig);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_EXIT_CODE),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_FEATURES),
- job_ptr->features);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_GRES),
- job_ptr->gres);
- if (cluster_flags & CLUSTER_FLAG_BG)
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_GEOMETRY),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_GEOMETRY));
- group_info = getgrgid((gid_t)job_ptr->group_id);
- if (group_info && group_info->gr_name[0])
- snprintf(tmp_char, sizeof(tmp_char), "%s", group_info->gr_name);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->group_id);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_GROUP_ID),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG) {
- if (cluster_flags & CLUSTER_FLAG_BGL)
- add_display_treestore_line(
- update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_IMAGE_BLRTS),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_BLRTS_IMAGE));
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_IMAGE_LINUX),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_LINUX_IMAGE));
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_IMAGE_MLOADER),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_MLOADER_IMAGE));
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_IMAGE_RAMDISK),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- SELECT_PRINT_RAMDISK_IMAGE));
- }
- snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->job_id);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_JOBID),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_LICENSES),
- job_ptr->licenses);
- convert_num_unit((float)job_ptr->pn_min_cpus,
- tmp_char, sizeof(tmp_char), UNIT_NONE);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_CPU_REQ),
- tmp_char);
- min_mem = job_ptr->pn_min_memory;
- if (min_mem & MEM_PER_CPU)
- min_mem &= (~MEM_PER_CPU);
- if (min_mem > 0) {
- int len;
- convert_num_unit((float)min_mem,
- tmp_char, sizeof(tmp_char), UNIT_MEGA);
- len = strlen(tmp_char);
- if (job_ptr->pn_min_memory & MEM_PER_CPU)
- sprintf(tmp_char+len, " Per CPU");
- else
- sprintf(tmp_char+len, " Per Node");
- } else
- sprintf(tmp_char, " ");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_MEM_MIN),
- tmp_char);
- if (job_ptr->pn_min_tmp_disk > 0)
- convert_num_unit((float)job_ptr->pn_min_tmp_disk,
- tmp_char, sizeof(tmp_char), UNIT_MEGA);
- else
- sprintf(tmp_char, " ");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_TMP_DISK),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NAME),
- job_ptr->name);
- if (cluster_flags & CLUSTER_FLAG_AIX)
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NETWORK),
- job_ptr->network);
- if (job_ptr->nice > 0)
- sprintf(tmp_char, "%u", job_ptr->nice - NICE_OFFSET);
- else
- sprintf(tmp_char, " ");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NICE),
- tmp_char);
- if (!(cluster_flags & CLUSTER_FLAG_BG)) {
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODELIST),
- nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODELIST_EXC),
- job_ptr->exc_nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODELIST_REQ),
- job_ptr->req_nodes);
- }
- if (cluster_flags & CLUSTER_FLAG_BG)
- convert_num_unit((float)sview_job_info_ptr->node_cnt,
- tmp_char, sizeof(tmp_char), UNIT_NONE);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u",
- sview_job_info_ptr->node_cnt);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODES),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG)
- convert_num_unit((float)sview_job_info_ptr->node_cnt,
- tmp_char, sizeof(tmp_char), UNIT_NONE);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u",
- job_ptr->max_nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODES_MAX),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG)
- convert_num_unit((float)sview_job_info_ptr->node_cnt,
- tmp_char, sizeof(tmp_char), UNIT_NONE);
- else
- snprintf(tmp_char, sizeof(tmp_char), "%u",
- job_ptr->num_nodes);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_NODES_MIN),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_PARTITION),
- job_ptr->partition);
- sprintf(tmp_char, "%u", job_ptr->priority);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_PRIORITY),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_QOS),
- job_ptr->qos);
- if (job_ptr->state_desc)
- reason = job_ptr->state_desc;
- else
- reason = job_reason_string(job_ptr->state_reason);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_REASON), reason);
- if (job_ptr->requeue)
- sprintf(tmp_char, "yes");
- else
- sprintf(tmp_char, "no");
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_REQUEUE),
- tmp_char);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_RESV_NAME),
- job_ptr->resv_name);
- snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->restart_cnt);
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_RESTARTS),
- tmp_char);
- if (cluster_flags & CLUSTER_FLAG_BG)
- add_display_treestore_line(update, treestore, &iter,
- find_col_name(display_data_job,
- SORTID_ROTATE),
- select_g_select_jobinfo_sprint(
- job_ptr->select_jobinfo,
- tmp_char,
- sizeof(tmp_char),
- …
Large files files are truncated, but you can click here to view the full file