From db09723695172603ffdaeba67d0b774462aa75e3 Mon Sep 17 00:00:00 2001 From: Danny Auble <da@llnl.gov> Date: Wed, 26 May 2010 22:09:38 +0000 Subject: [PATCH] the patch is getting too big, things still work for sview. Quite a bit of infrastructure change to allow sview to work cross-cluster --- slurm/slurm.h.in | 6 +- slurm/slurmdb.h | 1 + src/api/block_info.c | 5 - src/common/job_resources.c | 63 ++--- src/common/node_select.c | 241 ------------------ src/common/node_select.h | 14 - src/common/slurm_protocol_defs.c | 38 +++ src/common/slurm_protocol_defs.h | 3 + src/common/slurm_protocol_pack.c | 182 ++++++++++++- src/common/slurm_protocol_pack.h | 4 +- src/common/slurm_step_layout.c | 63 ++--- src/common/slurmdb_defs.c | 8 +- .../select/bluegene/plugin/block_sys.c | 7 +- src/plugins/select/bluegene/plugin/sfree.c | 2 +- .../select/bluegene/plugin/slurm_prolog.c | 2 +- src/salloc/salloc.c | 2 +- src/scontrol/info_block.c | 2 +- src/scontrol/info_job.c | 2 +- src/scontrol/scontrol.c | 36 ++- src/sinfo/sinfo.c | 2 +- src/slurmctld/proc_req.c | 2 +- src/smap/partition_functions.c | 2 +- src/srun/allocate.c | 2 +- src/sview/block_info.c | 33 ++- src/sview/common.c | 6 - src/sview/config_info.c | 15 +- src/sview/job_info.c | 38 +-- src/sview/node_info.c | 32 ++- src/sview/part_info.c | 35 ++- src/sview/resv_info.c | 105 ++++++-- src/sview/sview.c | 34 +++ src/sview/sview.h | 8 +- 32 files changed, 540 insertions(+), 455 deletions(-) diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in index 9454611124a..668b59b6088 100644 --- a/slurm/slurm.h.in +++ b/slurm/slurm.h.in @@ -1206,11 +1206,11 @@ extern int slurm_load_block_info PARAMS( /* * slurm_free_block_info_msg - free buffer returned by * slurm_load_block - * IN block_info_msg_pptr - data is freed and pointer is set to NULL + * IN block_info_msg_ptr - pointer to block_info_msg_t * RET 0 or a slurm error code */ -extern int slurm_free_block_info_msg PARAMS( - (block_info_msg_t **block_info_msg_pptr)); +extern void slurm_free_block_info_msg PARAMS( + (block_info_msg_t *block_info_msg)); /* update state or remove block */ extern int slurm_update_block PARAMS((update_block_msg_t *block_msg)); diff --git a/slurm/slurmdb.h b/slurm/slurmdb.h index 5492bff6c2b..23f62bbc418 100644 --- a/slurm/slurmdb.h +++ b/slurm/slurmdb.h @@ -155,6 +155,7 @@ typedef enum { #define CLUSTER_FLAG_AIX 0x00000040 /* This is an aix cluster */ #define CLUSTER_FLAG_MULTSD 0x00000080 /* This cluster is multiple slurmd */ #define CLUSTER_FLAG_CRAYXT 0x00000100 /* This cluster is a cray XT */ +#define CLUSTER_FLAG_FE 0x00000200 /* This cluster is a front end system */ /* Define assoc_mgr_association_usage_t below to avoid including * extraneous slurmdb headers */ diff --git a/src/api/block_info.c b/src/api/block_info.c index 59cc25ce4af..c0186dbbf4a 100644 --- a/src/api/block_info.c +++ b/src/api/block_info.c @@ -242,11 +242,6 @@ extern int slurm_load_block_info ( return SLURM_SUCCESS; } -extern int slurm_free_block_info_msg(block_info_msg_t **block_info_msg_pptr) -{ - return node_select_block_info_msg_free(block_info_msg_pptr); -} - extern int slurm_get_select_jobinfo(dynamic_plugin_data_t *jobinfo, enum select_jobdata_type data_type, void *data) diff --git a/src/common/job_resources.c b/src/common/job_resources.c index da6f5828507..6daa8431a39 100644 --- a/src/common/job_resources.c +++ b/src/common/job_resources.c @@ -529,6 +529,8 @@ extern void log_job_resources(uint32_t job_id, extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, uint16_t protocol_version) { + uint32_t cluster_flags = slurmdb_setup_cluster_flags(); + if(protocol_version >= SLURM_2_2_PROTOCOL_VERSION) { if (job_resrcs_ptr == NULL) { uint32_t empty = NO_VAL; @@ -553,7 +555,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, pack16_array(job_resrcs_ptr->cpu_array_value, job_resrcs_ptr->cpu_array_cnt, buffer); else - pack16_array(job_resrcs_ptr->cpu_array_value, 0, buffer); + pack16_array(job_resrcs_ptr->cpu_array_value, + 0, buffer); if (job_resrcs_ptr->cpus) pack16_array(job_resrcs_ptr->cpus, @@ -571,15 +574,15 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, pack32_array(job_resrcs_ptr->memory_allocated, job_resrcs_ptr->nhosts, buffer); else - pack32_array(job_resrcs_ptr->memory_allocated, 0, buffer); + pack32_array(job_resrcs_ptr->memory_allocated, + 0, buffer); if (job_resrcs_ptr->memory_used) pack32_array(job_resrcs_ptr->memory_used, job_resrcs_ptr->nhosts, buffer); else pack32_array(job_resrcs_ptr->memory_used, 0, buffer); -#ifndef HAVE_BG - { + if(!(cluster_flags & CLUSTER_FLAG_BG)) { int i; uint32_t core_cnt = 0, sock_recs = 0; xassert(job_resrcs_ptr->cores_per_socket); @@ -587,8 +590,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, xassert(job_resrcs_ptr->sockets_per_node); for (i=0; i<job_resrcs_ptr->nhosts; i++) { - core_cnt += job_resrcs_ptr->sockets_per_node[i] * - job_resrcs_ptr->cores_per_socket[i] * + core_cnt += job_resrcs_ptr->sockets_per_node[i] + * job_resrcs_ptr->cores_per_socket[i] * job_resrcs_ptr->sock_core_rep_count[i]; sock_recs += job_resrcs_ptr-> sock_core_rep_count[i]; @@ -608,8 +611,7 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, pack_bit_str(job_resrcs_ptr->core_bitmap, buffer); pack_bit_str(job_resrcs_ptr->core_bitmap_used, buffer); } -#endif - } else { + } else { if (job_resrcs_ptr == NULL) { uint32_t empty = NO_VAL; pack32(empty, buffer); @@ -632,7 +634,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, pack16_array(job_resrcs_ptr->cpu_array_value, job_resrcs_ptr->cpu_array_cnt, buffer); else - pack16_array(job_resrcs_ptr->cpu_array_value, 0, buffer); + pack16_array(job_resrcs_ptr->cpu_array_value, + 0, buffer); if (job_resrcs_ptr->cpus) pack16_array(job_resrcs_ptr->cpus, @@ -650,7 +653,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, pack32_array(job_resrcs_ptr->memory_allocated, job_resrcs_ptr->nhosts, buffer); else - pack32_array(job_resrcs_ptr->memory_allocated, 0, buffer); + pack32_array(job_resrcs_ptr->memory_allocated, + 0, buffer); if (job_resrcs_ptr->memory_used) pack32_array(job_resrcs_ptr->memory_used, @@ -667,8 +671,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, xassert(job_resrcs_ptr->sockets_per_node); for (i=0; i<job_resrcs_ptr->nhosts; i++) { - core_cnt += job_resrcs_ptr->sockets_per_node[i] * - job_resrcs_ptr->cores_per_socket[i] * + core_cnt += job_resrcs_ptr->sockets_per_node[i] + * job_resrcs_ptr->cores_per_socket[i] * job_resrcs_ptr->sock_core_rep_count[i]; sock_recs += job_resrcs_ptr-> sock_core_rep_count[i]; @@ -698,6 +702,7 @@ extern int unpack_job_resources(job_resources_t **job_resrcs_pptr, char *bit_fmt = NULL; uint32_t empty, tmp32; job_resources_t *job_resrcs; + uint32_t cluster_flags = slurmdb_setup_cluster_flags(); xassert(job_resrcs_pptr); if(protocol_version >= SLURM_2_2_PROTOCOL_VERSION) { @@ -744,23 +749,23 @@ extern int unpack_job_resources(job_resources_t **job_resrcs_pptr, if (tmp32 == 0) xfree(job_resrcs->memory_used); -#ifndef HAVE_BG - safe_unpack16_array(&job_resrcs->sockets_per_node, - &tmp32, buffer); - if (tmp32 == 0) - xfree(job_resrcs->sockets_per_node); - safe_unpack16_array(&job_resrcs->cores_per_socket, - &tmp32, buffer); - if (tmp32 == 0) - xfree(job_resrcs->cores_per_socket); - safe_unpack32_array(&job_resrcs->sock_core_rep_count, - &tmp32, buffer); - if (tmp32 == 0) - xfree(job_resrcs->sock_core_rep_count); - - unpack_bit_str(&job_resrcs->core_bitmap, buffer); - unpack_bit_str(&job_resrcs->core_bitmap_used, buffer); -#endif + if(!(cluster_flags & CLUSTER_FLAG_BG)) { + safe_unpack16_array(&job_resrcs->sockets_per_node, + &tmp32, buffer); + if (tmp32 == 0) + xfree(job_resrcs->sockets_per_node); + safe_unpack16_array(&job_resrcs->cores_per_socket, + &tmp32, buffer); + if (tmp32 == 0) + xfree(job_resrcs->cores_per_socket); + safe_unpack32_array(&job_resrcs->sock_core_rep_count, + &tmp32, buffer); + if (tmp32 == 0) + xfree(job_resrcs->sock_core_rep_count); + + unpack_bit_str(&job_resrcs->core_bitmap, buffer); + unpack_bit_str(&job_resrcs->core_bitmap_used, buffer); + } } else { safe_unpack32(&empty, buffer); if (empty == NO_VAL) { diff --git a/src/common/node_select.c b/src/common/node_select.c index b89e2fc95a2..0522fc2bc5f 100644 --- a/src/common/node_select.c +++ b/src/common/node_select.c @@ -300,247 +300,6 @@ static int _select_context_destroy( slurm_select_context_t *c ) return rc; } -static void _free_block_info(block_info_t *block_info) -{ - if(block_info) { - xfree(block_info->bg_block_id); - xfree(block_info->blrtsimage); - xfree(block_info->bp_inx); - xfree(block_info->ionodes); - xfree(block_info->ionode_inx); - xfree(block_info->linuximage); - xfree(block_info->mloaderimage); - xfree(block_info->nodes); - xfree(block_info->owner_name); - xfree(block_info->ramdiskimage); - } -} - -/* NOTE: The matching pack functions are directly in the select/bluegene - * plugin. The unpack functions can not be there since the plugin is - * dependent upon libraries which do not exist on the BlueGene front-end - * nodes. */ -static int _unpack_block_info(block_info_t *block_info, Buf buffer, - uint16_t protocol_version) -{ - uint32_t uint32_tmp; - char *bp_inx_str = NULL; - - if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { - safe_unpackstr_xmalloc(&block_info->bg_block_id, - &uint32_tmp, buffer); - if(working_cluster_rec) { - if(working_cluster_rec->flags & CLUSTER_FLAG_BGL) - safe_unpackstr_xmalloc(&block_info->blrtsimage, - &uint32_tmp, buffer); - } else { -#ifdef HAVE_BGL - safe_unpackstr_xmalloc(&block_info->blrtsimage, - &uint32_tmp, buffer); -#endif - } - safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer); - if (bp_inx_str == NULL) { - block_info->bp_inx = bitfmt2int(""); - } else { - block_info->bp_inx = bitfmt2int(bp_inx_str); - xfree(bp_inx_str); - } - safe_unpack16(&block_info->conn_type, buffer); - safe_unpackstr_xmalloc(&(block_info->ionodes), - &uint32_tmp, buffer); - safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer); - if (bp_inx_str == NULL) { - block_info->ionode_inx = bitfmt2int(""); - } else { - block_info->ionode_inx = bitfmt2int(bp_inx_str); - xfree(bp_inx_str); - } - safe_unpack32(&block_info->job_running, buffer); - safe_unpackstr_xmalloc(&block_info->linuximage, - &uint32_tmp, buffer); - safe_unpackstr_xmalloc(&block_info->mloaderimage, - &uint32_tmp, buffer); - safe_unpackstr_xmalloc(&(block_info->nodes), &uint32_tmp, - buffer); - safe_unpack32(&block_info->node_cnt, buffer); - if(working_cluster_rec) { - if(working_cluster_rec->flags & CLUSTER_FLAG_BGL) - safe_unpack16(&block_info->node_use, buffer); - } else { -#ifdef HAVE_BGL - safe_unpack16(&block_info->node_use, buffer); -#endif - } - safe_unpackstr_xmalloc(&block_info->owner_name, - &uint32_tmp, buffer); - safe_unpackstr_xmalloc(&block_info->ramdiskimage, - &uint32_tmp, buffer); - safe_unpack16(&block_info->state, buffer); - } - return SLURM_SUCCESS; - -unpack_error: - error("_unpack_node_info: error unpacking here"); - _free_block_info(block_info); - return SLURM_ERROR; -} - -extern int node_select_free_block_info(block_info_t *block_info) -{ - if(block_info) { - _free_block_info(block_info); - xfree(block_info); - } - return SLURM_SUCCESS; -} - -extern void node_select_pack_block_info(block_info_t *block_info, Buf buffer, - uint16_t protocol_version) -{ - if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { - if(!block_info) { - packnull(buffer); - if(working_cluster_rec) { - if(working_cluster_rec->flags - & CLUSTER_FLAG_BGL) - packnull(buffer); - } else { -#ifdef HAVE_BGL - packnull(buffer); -#endif - } - pack16((uint16_t)NO_VAL, buffer); - packnull(buffer); - - packnull(buffer); - packnull(buffer); - - pack32(NO_VAL, buffer); - - packnull(buffer); - packnull(buffer); - packnull(buffer); - pack32(NO_VAL, buffer); - if(working_cluster_rec) { - if(working_cluster_rec->flags - & CLUSTER_FLAG_BGL) - pack16((uint16_t)NO_VAL, buffer); - } else { -#ifdef HAVE_BGL - pack16((uint16_t)NO_VAL, buffer); -#endif - } - packnull(buffer); - packnull(buffer); - pack16((uint16_t)NO_VAL, buffer); - } else { - packstr(block_info->bg_block_id, buffer); -#ifdef HAVE_BGL - packstr(block_info->blrtsimage, buffer); -#endif - - if(block_info->bp_inx) { - char *bitfmt = inx2bitfmt(block_info->bp_inx); - packstr(bitfmt, buffer); - xfree(bitfmt); - } else - packnull(buffer); - - pack16(block_info->conn_type, buffer); - - packstr(block_info->ionodes, buffer); - - if(block_info->ionode_inx) { - char *bitfmt = - inx2bitfmt(block_info->ionode_inx); - packstr(bitfmt, buffer); - xfree(bitfmt); - } else - packnull(buffer); - - pack32(block_info->job_running, buffer); - - packstr(block_info->linuximage, buffer); - packstr(block_info->mloaderimage, buffer); - packstr(block_info->nodes, buffer); - pack32(block_info->node_cnt, buffer); -#ifdef HAVE_BGL - pack16(block_info->node_use, buffer); -#endif - packstr(block_info->owner_name, buffer); - packstr(block_info->ramdiskimage, buffer); - pack16(block_info->state, buffer); - } - } -} - -extern int node_select_unpack_block_info(block_info_t **block_info, Buf buffer, - uint16_t protocol_version) -{ - int rc = SLURM_SUCCESS; - block_info_t *bg_rec = xmalloc(sizeof(block_info_t)); - - if((rc = _unpack_block_info(bg_rec, buffer, protocol_version)) - != SLURM_SUCCESS) - xfree(bg_rec); - else - *block_info = bg_rec; - return rc; -} - -extern int node_select_block_info_msg_free ( - block_info_msg_t **block_info_msg_pptr) -{ - block_info_msg_t *block_info_msg = NULL; - - if (block_info_msg_pptr == NULL) - return EINVAL; - - block_info_msg = *block_info_msg_pptr; - if (block_info_msg->block_array) { - int i; - for(i=0; i<block_info_msg->record_count; i++) - _free_block_info( - &(block_info_msg->block_array[i])); - xfree(block_info_msg->block_array); - } - xfree(block_info_msg); - - *block_info_msg_pptr = NULL; - return SLURM_SUCCESS; -} - -/* Unpack node select info from a buffer */ -extern int node_select_block_info_msg_unpack( - block_info_msg_t **block_info_msg_pptr, Buf buffer, - uint16_t protocol_version) -{ - int i; - block_info_msg_t *buf; - - buf = xmalloc(sizeof(block_info_msg_t)); - if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { - safe_unpack32(&(buf->record_count), buffer); - safe_unpack_time(&(buf->last_update), buffer); - buf->block_array = xmalloc(sizeof(block_info_t) * - buf->record_count); - for(i=0; i<buf->record_count; i++) { - if (_unpack_block_info(&(buf->block_array[i]), buffer, - protocol_version)) - goto unpack_error; - } - } - *block_info_msg_pptr = buf; - return SLURM_SUCCESS; - -unpack_error: - node_select_block_info_msg_free(&buf); - *block_info_msg_pptr = NULL; - return SLURM_ERROR; -} - - /* * Initialize context for node selection plugin */ diff --git a/src/common/node_select.h b/src/common/node_select.h index e83d5a8de2c..cbb2cfe6c02 100644 --- a/src/common/node_select.h +++ b/src/common/node_select.h @@ -71,20 +71,6 @@ extern void node_select_pack_block_info(block_info_t *block_info, Buf buffer, extern int node_select_unpack_block_info(block_info_t **block_info, Buf buffer, uint16_t protocol_version); -/* - * node_select_block_info_msg_free - free buffer returned by - * slurm_load_node_select - * IN block_info_msg_pptr - data is freed and pointer is set to NULL - * RET 0 or a slurm error code - */ -extern int node_select_block_info_msg_free ( - block_info_msg_t **block_info_msg_pptr); - -/* Unpack node select info from a buffer */ -extern int node_select_block_info_msg_unpack( - block_info_msg_t **block_info_msg_pptr, Buf buffer, - uint16_t protocol_version); - /* * Initialize context for node selection plugin */ diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c index d936ca82d04..b059e1c01a4 100644 --- a/src/common/slurm_protocol_defs.c +++ b/src/common/slurm_protocol_defs.c @@ -1871,6 +1871,44 @@ extern void slurm_free_stat_jobacct_msg(stat_jobacct_msg_t *msg) } } +extern void slurm_free_block_info_members(block_info_t *block_info) +{ + if(block_info) { + xfree(block_info->bg_block_id); + xfree(block_info->blrtsimage); + xfree(block_info->bp_inx); + xfree(block_info->ionodes); + xfree(block_info->ionode_inx); + xfree(block_info->linuximage); + xfree(block_info->mloaderimage); + xfree(block_info->nodes); + xfree(block_info->owner_name); + xfree(block_info->ramdiskimage); + } +} + +extern void slurm_free_block_info(block_info_t *block_info) +{ + if(block_info) { + slurm_free_block_info_members(block_info); + xfree(block_info); + } +} + +extern void slurm_free_block_info_msg(block_info_msg_t *block_info_msg) +{ + if(block_info_msg) { + if (block_info_msg->block_array) { + int i; + for(i=0; i<block_info_msg->record_count; i++) + slurm_free_block_info_members( + &(block_info_msg->block_array[i])); + xfree(block_info_msg->block_array); + } + xfree(block_info_msg); + } +} + void inline slurm_free_block_info_request_msg( block_info_request_msg_t *msg) { diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h index 6dd5924183e..43d06b125fb 100644 --- a/src/common/slurm_protocol_defs.h +++ b/src/common/slurm_protocol_defs.h @@ -1041,6 +1041,9 @@ void slurm_free_topo_info_msg(topo_info_response_msg_t *msg); void inline slurm_free_file_bcast_msg(file_bcast_msg_t *msg); void inline slurm_free_step_complete_msg(step_complete_msg_t *msg); void inline slurm_free_stat_jobacct_msg(stat_jobacct_msg_t *msg); +void slurm_free_block_info_members(block_info_t *block_info); +void slurm_free_block_info(block_info_t *block_info); +void slurm_free_block_info_msg(block_info_msg_t *block_info_msg); void inline slurm_free_block_info_request_msg( block_info_request_msg_t *msg); void inline slurm_free_job_notify_msg(job_notify_msg_t * msg); diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c index 00b61d3a55f..f90a47bd1dd 100644 --- a/src/common/slurm_protocol_pack.c +++ b/src/common/slurm_protocol_pack.c @@ -68,7 +68,7 @@ #define _pack_job_info_msg(msg,buf) _pack_buffer_msg(msg,buf) #define _pack_job_step_info_msg(msg,buf) _pack_buffer_msg(msg,buf) -#define _pack_block_info_msg(msg,buf) _pack_buffer_msg(msg,buf) +#define _pack_block_info_resp_msg(msg,buf) _pack_buffer_msg(msg,buf) #define _pack_node_info_msg(msg,buf) _pack_buffer_msg(msg,buf) #define _pack_partition_info_msg(msg,buf) _pack_buffer_msg(msg,buf) #define _pack_reserve_info_msg(msg,buf) _pack_buffer_msg(msg,buf) @@ -311,6 +311,10 @@ static void _pack_block_info_req_msg(block_info_request_msg_t * static int _unpack_block_info_req_msg(block_info_request_msg_t ** msg, Buf buffer, uint16_t protocol_version); +static void _pack_block_info_msg(block_info_t *block_info, Buf buffer, + uint16_t protocol_version); +extern int _unpack_block_info(block_info_t **block_info, Buf buffer, + uint16_t protocol_version); static void _pack_job_step_info_req_msg(job_step_info_request_msg_t * msg, Buf buffer, @@ -773,8 +777,8 @@ pack_msg(slurm_msg_t const *msg, Buf buffer) msg->protocol_version); break; case REQUEST_UPDATE_BLOCK: - node_select_pack_block_info((block_info_t *)msg->data, buffer, - msg->protocol_version); + _pack_block_info_msg((block_info_t *)msg->data, buffer, + msg->protocol_version); break; case REQUEST_REATTACH_TASKS: _pack_reattach_tasks_request_msg( @@ -1023,7 +1027,7 @@ pack_msg(slurm_msg_t const *msg, Buf buffer) msg->protocol_version); break; case RESPONSE_BLOCK_INFO: - _pack_block_info_msg((slurm_msg_t *) msg, buffer); + _pack_block_info_resp_msg((slurm_msg_t *) msg, buffer); break; case REQUEST_FILE_BCAST: _pack_file_bcast((file_bcast_msg_t *) msg->data, buffer, @@ -1240,7 +1244,7 @@ unpack_msg(slurm_msg_t * msg, Buf buffer) msg->protocol_version); break; case REQUEST_UPDATE_BLOCK: - rc = node_select_unpack_block_info( + rc = _unpack_block_info( (block_info_t **)&(msg->data), buffer, msg->protocol_version); break; @@ -1519,7 +1523,7 @@ unpack_msg(slurm_msg_t * msg, Buf buffer) msg->protocol_version); break; case RESPONSE_BLOCK_INFO: - rc = node_select_block_info_msg_unpack( + rc = slurm_unpack_block_info_msg( (block_info_msg_t **) &(msg->data), buffer, msg->protocol_version); break; @@ -6366,6 +6370,172 @@ unpack_error: return SLURM_ERROR; } +/* NOTE: The matching pack functions are directly in the select/bluegene + * plugin. The unpack functions can not be there since the plugin is + * dependent upon libraries which do not exist on the BlueGene front-end + * nodes. */ +static int _unpack_block_info_members(block_info_t *block_info, Buf buffer, + uint16_t protocol_version) +{ + uint32_t uint32_tmp; + char *bp_inx_str = NULL; + uint32_t cluster_flags = slurmdb_setup_cluster_flags(); + + if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { + safe_unpackstr_xmalloc(&block_info->bg_block_id, + &uint32_tmp, buffer); + if(cluster_flags & CLUSTER_FLAG_BGL) + safe_unpackstr_xmalloc(&block_info->blrtsimage, + &uint32_tmp, buffer); + safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer); + if (bp_inx_str == NULL) { + block_info->bp_inx = bitfmt2int(""); + } else { + block_info->bp_inx = bitfmt2int(bp_inx_str); + xfree(bp_inx_str); + } + safe_unpack16(&block_info->conn_type, buffer); + safe_unpackstr_xmalloc(&(block_info->ionodes), + &uint32_tmp, buffer); + safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer); + if (bp_inx_str == NULL) { + block_info->ionode_inx = bitfmt2int(""); + } else { + block_info->ionode_inx = bitfmt2int(bp_inx_str); + xfree(bp_inx_str); + } + safe_unpack32(&block_info->job_running, buffer); + safe_unpackstr_xmalloc(&block_info->linuximage, + &uint32_tmp, buffer); + safe_unpackstr_xmalloc(&block_info->mloaderimage, + &uint32_tmp, buffer); + safe_unpackstr_xmalloc(&(block_info->nodes), &uint32_tmp, + buffer); + safe_unpack32(&block_info->node_cnt, buffer); + if(cluster_flags & CLUSTER_FLAG_BGL) + safe_unpack16(&block_info->node_use, buffer); + safe_unpackstr_xmalloc(&block_info->owner_name, + &uint32_tmp, buffer); + safe_unpackstr_xmalloc(&block_info->ramdiskimage, + &uint32_tmp, buffer); + safe_unpack16(&block_info->state, buffer); + } + return SLURM_SUCCESS; + +unpack_error: + error("_unpack_node_info: error unpacking here"); + slurm_free_block_info_members(block_info); + return SLURM_ERROR; +} + +static void _pack_block_info_msg(block_info_t *block_info, Buf buffer, + uint16_t protocol_version) +{ + uint32_t cluster_flags = slurmdb_setup_cluster_flags(); + if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { + if(!block_info) { + packnull(buffer); + if(cluster_flags & CLUSTER_FLAG_BGL) + packnull(buffer); + pack16((uint16_t)NO_VAL, buffer); + packnull(buffer); + + packnull(buffer); + packnull(buffer); + + pack32(NO_VAL, buffer); + + packnull(buffer); + packnull(buffer); + packnull(buffer); + pack32(NO_VAL, buffer); + if(cluster_flags & CLUSTER_FLAG_BGL) + pack16((uint16_t)NO_VAL, buffer); + packnull(buffer); + packnull(buffer); + pack16((uint16_t)NO_VAL, buffer); + } else { + packstr(block_info->bg_block_id, buffer); + if(cluster_flags & CLUSTER_FLAG_BGL) + packstr(block_info->blrtsimage, buffer); + + if(block_info->bp_inx) { + char *bitfmt = inx2bitfmt(block_info->bp_inx); + packstr(bitfmt, buffer); + xfree(bitfmt); + } else + packnull(buffer); + + pack16(block_info->conn_type, buffer); + + packstr(block_info->ionodes, buffer); + + if(block_info->ionode_inx) { + char *bitfmt = + inx2bitfmt(block_info->ionode_inx); + packstr(bitfmt, buffer); + xfree(bitfmt); + } else + packnull(buffer); + + pack32(block_info->job_running, buffer); + + packstr(block_info->linuximage, buffer); + packstr(block_info->mloaderimage, buffer); + packstr(block_info->nodes, buffer); + pack32(block_info->node_cnt, buffer); + if(cluster_flags & CLUSTER_FLAG_BGL) + pack16(block_info->node_use, buffer); + packstr(block_info->owner_name, buffer); + packstr(block_info->ramdiskimage, buffer); + pack16(block_info->state, buffer); + } + } +} + +extern int slurm_unpack_block_info_msg( + block_info_msg_t **block_info_msg_pptr, Buf buffer, + uint16_t protocol_version) +{ + int i; + block_info_msg_t *buf; + + buf = xmalloc(sizeof(block_info_msg_t)); + if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { + safe_unpack32(&(buf->record_count), buffer); + safe_unpack_time(&(buf->last_update), buffer); + buf->block_array = xmalloc(sizeof(block_info_t) * + buf->record_count); + for(i=0; i<buf->record_count; i++) { + if (_unpack_block_info_members( + &(buf->block_array[i]), buffer, + protocol_version)) + goto unpack_error; + } + } + *block_info_msg_pptr = buf; + return SLURM_SUCCESS; + +unpack_error: + slurm_free_block_info_msg(buf); + *block_info_msg_pptr = NULL; + return SLURM_ERROR; +} + +extern int _unpack_block_info(block_info_t **block_info, Buf buffer, + uint16_t protocol_version) +{ + int rc = SLURM_SUCCESS; + block_info_t *bg_rec = xmalloc(sizeof(block_info_t)); + + if((rc = _unpack_block_info_members(bg_rec, buffer, protocol_version)) + != SLURM_SUCCESS) + xfree(bg_rec); + else + *block_info = bg_rec; + return rc; +} + static void _pack_job_step_info_req_msg(job_step_info_request_msg_t * msg, Buf buffer, uint16_t protocol_version) diff --git a/src/common/slurm_protocol_pack.h b/src/common/slurm_protocol_pack.h index 4da59fd29fa..986161e6b4a 100644 --- a/src/common/slurm_protocol_pack.h +++ b/src/common/slurm_protocol_pack.h @@ -142,5 +142,7 @@ extern int unpack_msg ( slurm_msg_t * msg , Buf buffer ); extern void pack_multi_core_data (multi_core_data_t *multi_core, Buf buffer); extern int unpack_multi_core_data (multi_core_data_t **multi_core, Buf buffer); - +extern int slurm_unpack_block_info_msg( + block_info_msg_t **block_info_msg_pptr, Buf buffer, + uint16_t protocol_version); #endif diff --git a/src/common/slurm_step_layout.c b/src/common/slurm_step_layout.c index b6e82bbad7d..67478a4212a 100644 --- a/src/common/slurm_step_layout.c +++ b/src/common/slurm_step_layout.c @@ -53,6 +53,7 @@ #include "src/common/read_config.h" #include "src/common/slurm_protocol_api.h" #include "src/common/node_select.h" +#include "src/common/slurmdb_defs.h" /* build maps for task layout on nodes */ static int _init_task_layout(slurm_step_layout_t *step_layout, @@ -67,12 +68,8 @@ static int _task_layout_cyclic(slurm_step_layout_t *step_layout, uint16_t *cpus); static int _task_layout_plane(slurm_step_layout_t *step_layout, uint16_t *cpus); -#ifndef HAVE_FRONT_END static int _task_layout_hostfile(slurm_step_layout_t *step_layout, const char *arbitrary_nodes); -#endif - - /* * slurm_step_layout_create - determine how many tasks of a job will be @@ -101,6 +98,7 @@ slurm_step_layout_t *slurm_step_layout_create( char *arbitrary_nodes = NULL; slurm_step_layout_t *step_layout = xmalloc(sizeof(slurm_step_layout_t)); + uint32_t cluster_flags = slurmdb_setup_cluster_flags(); step_layout->task_dist = task_dist; if(task_dist == SLURM_DIST_ARBITRARY) { @@ -120,20 +118,18 @@ slurm_step_layout_t *slurm_step_layout_create( } step_layout->task_cnt = num_tasks; - -#ifdef HAVE_FRONT_END /* Limited job step support */ - /* All jobs execute through front-end on Blue Gene. - * Normally we would not permit execution of job steps, - * but can fake it by just allocating all tasks to - * one of the allocated nodes. */ -#ifdef HAVE_BG - step_layout->node_cnt = num_hosts; -#else - step_layout->node_cnt = 1; -#endif -#else - step_layout->node_cnt = num_hosts; -#endif + if(cluster_flags & CLUSTER_FLAG_FE) { + /* Limited job step support */ + /* All jobs execute through front-end on Blue Gene. + * Normally we would not permit execution of job steps, + * but can fake it by just allocating all tasks to + * one of the allocated nodes. */ + if(cluster_flags & CLUSTER_FLAG_BG) + step_layout->node_cnt = num_hosts; + else + step_layout->node_cnt = 1; + } else + step_layout->node_cnt = num_hosts; if(_init_task_layout(step_layout, arbitrary_nodes, cpus_per_node, cpu_count_reps, @@ -413,9 +409,8 @@ static int _init_task_layout(slurm_step_layout_t *step_layout, uint16_t task_dist, uint16_t plane_size) { int cpu_cnt = 0, cpu_inx = 0, i; -#ifndef HAVE_BG - hostlist_t hl = NULL; -#endif + uint32_t cluster_flags = slurmdb_setup_cluster_flags(); + /* char *name = NULL; */ uint16_t cpus[step_layout->node_cnt]; @@ -433,16 +428,15 @@ static int _init_task_layout(slurm_step_layout_t *step_layout, * step_layout->node_cnt); step_layout->tids = xmalloc(sizeof(uint32_t *) * step_layout->node_cnt); - -#ifndef HAVE_BG - hl = hostlist_create(step_layout->node_list); - /* make sure the number of nodes we think we have - * is the correct number */ - i = hostlist_count(hl); - if(step_layout->node_cnt > i) - step_layout->node_cnt = i; - hostlist_destroy(hl); -#endif + if(!(cluster_flags & CLUSTER_FLAG_BG)) { + hostlist_t hl = hostlist_create(step_layout->node_list); + /* make sure the number of nodes we think we have + * is the correct number */ + i = hostlist_count(hl); + if(step_layout->node_cnt > i) + step_layout->node_cnt = i; + hostlist_destroy(hl); + } debug("laying out the %u tasks on %u hosts %s", step_layout->task_cnt, step_layout->node_cnt, step_layout->node_list); @@ -479,17 +473,15 @@ static int _init_task_layout(slurm_step_layout_t *step_layout, (task_dist == SLURM_DIST_CYCLIC_CYCLIC) || (task_dist == SLURM_DIST_CYCLIC_BLOCK)) return _task_layout_cyclic(step_layout, cpus); -#ifndef HAVE_FRONT_END - else if(task_dist == SLURM_DIST_ARBITRARY) + else if(task_dist == SLURM_DIST_ARBITRARY + && !(cluster_flags & CLUSTER_FLAG_FE)) return _task_layout_hostfile(step_layout, arbitrary_nodes); -#endif else if(task_dist == SLURM_DIST_PLANE) return _task_layout_plane(step_layout, cpus); else return _task_layout_block(step_layout, cpus); } -#ifndef HAVE_FRONT_END /* use specific set run tasks on each host listed in hostfile * XXX: Need to handle over-subscribe. */ @@ -570,7 +562,6 @@ static int _task_layout_hostfile(slurm_step_layout_t *step_layout, return SLURM_SUCCESS; } -#endif /* to effectively deal with heterogeneous nodes, we fake a cyclic * distribution to figure out how many tasks go on each node and diff --git a/src/common/slurmdb_defs.c b/src/common/slurmdb_defs.c index f63fddf8f97..05c5882b38a 100644 --- a/src/common/slurmdb_defs.c +++ b/src/common/slurmdb_defs.c @@ -763,11 +763,14 @@ extern uint16_t slurmdb_setup_cluster_dims() extern uint32_t slurmdb_setup_cluster_flags() { - uint32_t cluster_flags = 0; + static uint32_t cluster_flags = NO_VAL; if(working_cluster_rec) return working_cluster_rec->flags; + else if(cluster_flags != NO_VAL) + return cluster_flags; + cluster_flags = 0; #ifdef HAVE_BG cluster_flags |= CLUSTER_FLAG_BG; #endif @@ -794,6 +797,9 @@ extern uint32_t slurmdb_setup_cluster_flags() #endif #ifdef HAVE_CRAY_XT cluster_flags |= CLUSTER_FLAG_CRAYXT; +#endif +#ifdef HAVE_FRONT_END + cluster_flags |= CLUSTER_FLAG_FE; #endif return cluster_flags; } diff --git a/src/plugins/select/bluegene/plugin/block_sys.c b/src/plugins/select/bluegene/plugin/block_sys.c index fde79dbf660..4cc32321e80 100755 --- a/src/plugins/select/bluegene/plugin/block_sys.c +++ b/src/plugins/select/bluegene/plugin/block_sys.c @@ -1031,8 +1031,7 @@ extern int load_state_file(List curr_block_list, char *dir_name) return EFAULT; } xfree(ver_str); - if(node_select_block_info_msg_unpack(&block_ptr, buffer, - protocol_version) + if(slurm_unpack_block_info_msg(&block_ptr, buffer, protocol_version) == SLURM_ERROR) { error("select_p_state_restore: problem unpacking block_info"); goto unpack_error; @@ -1060,7 +1059,7 @@ extern int load_state_file(List curr_block_list, char *dir_name) } } - slurm_free_block_info_msg(&block_ptr); + slurm_free_block_info_msg(block_ptr); free_buf(buffer); return SLURM_SUCCESS; #endif @@ -1259,7 +1258,7 @@ extern int load_state_file(List curr_block_list, char *dir_name) slurm_mutex_unlock(&block_state_mutex); info("Recovered %d blocks", blocks); - node_select_block_info_msg_free(&block_ptr); + slurm_free_block_info_msg(block_ptr); free_buf(buffer); return SLURM_SUCCESS; diff --git a/src/plugins/select/bluegene/plugin/sfree.c b/src/plugins/select/bluegene/plugin/sfree.c index 3a829cffded..966a324d04c 100644 --- a/src/plugins/select/bluegene/plugin/sfree.c +++ b/src/plugins/select/bluegene/plugin/sfree.c @@ -61,7 +61,7 @@ static int _get_new_info_block(block_info_msg_t **block_ptr) error_code = slurm_load_block_info(bg_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) { - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(bg_info_ptr); } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; new_bg_ptr = bg_info_ptr; diff --git a/src/plugins/select/bluegene/plugin/slurm_prolog.c b/src/plugins/select/bluegene/plugin/slurm_prolog.c index 8d7964d8236..d9ab9c6618a 100644 --- a/src/plugins/select/bluegene/plugin/slurm_prolog.c +++ b/src/plugins/select/bluegene/plugin/slurm_prolog.c @@ -193,7 +193,7 @@ static int _partitions_dealloc() error_code = slurm_load_block_info(bg_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(bg_info_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_SUCCESS; new_bg_ptr = bg_info_ptr; diff --git a/src/salloc/salloc.c b/src/salloc/salloc.c index 1fbdc34d3ee..eb1debc62a9 100644 --- a/src/salloc/salloc.c +++ b/src/salloc/salloc.c @@ -846,7 +846,7 @@ static int _blocks_dealloc(void) error_code = slurm_load_block_info(bg_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(bg_info_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_SUCCESS; new_bg_ptr = bg_info_ptr; diff --git a/src/scontrol/info_block.c b/src/scontrol/info_block.c index 1185ce4b871..139c4e09417 100644 --- a/src/scontrol/info_block.c +++ b/src/scontrol/info_block.c @@ -49,7 +49,7 @@ scontrol_load_block (block_info_msg_t **block_info_pptr) error_code = slurm_load_block_info( old_block_info_ptr->last_update, &info_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&old_block_info_ptr); + slurm_free_block_info_msg(old_block_info_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { info_ptr = old_block_info_ptr; error_code = SLURM_SUCCESS; diff --git a/src/scontrol/info_job.c b/src/scontrol/info_job.c index 088fd462ebf..0a1b8b3de11 100644 --- a/src/scontrol/info_job.c +++ b/src/scontrol/info_job.c @@ -709,7 +709,7 @@ static int _blocks_dealloc(void) error_code = slurm_load_block_info(bg_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(bg_info_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_SUCCESS; new_bg_ptr = bg_info_ptr; diff --git a/src/scontrol/scontrol.c b/src/scontrol/scontrol.c index b4cd788b46e..1ddc3e20f87 100644 --- a/src/scontrol/scontrol.c +++ b/src/scontrol/scontrol.c @@ -556,18 +556,30 @@ _process_command (int argc, char *argv[]) working_cluster_rec = list_peek(clusters); } cluster_flags = slurmdb_setup_cluster_flags(); - if(old_block_info_ptr) - old_block_info_ptr->last_update = 0; - if(old_job_info_ptr) - old_job_info_ptr->last_update = 0; - if(old_node_info_ptr) - old_node_info_ptr->last_update = 0; - if(old_part_info_ptr) - old_part_info_ptr->last_update = 0; - if(old_res_info_ptr) - old_res_info_ptr->last_update = 0; - if(old_slurm_ctl_conf_ptr) - old_slurm_ctl_conf_ptr->last_update = 0; + slurm_free_block_info_msg(old_block_info_ptr); + old_block_info_ptr = NULL; + slurm_free_job_info_msg(old_job_info_ptr); + old_job_info_ptr = NULL; + slurm_free_node_info_msg(old_node_info_ptr); + old_node_info_ptr = NULL; + slurm_free_partition_info_msg(old_part_info_ptr); + old_part_info_ptr = NULL; + slurm_free_reservation_info_msg(old_res_info_ptr); + old_res_info_ptr = NULL; + slurm_free_ctl_conf(old_slurm_ctl_conf_ptr); + old_slurm_ctl_conf_ptr = NULL; + /* if(old_block_info_ptr) */ + /* old_block_info_ptr->last_update = 0; */ + /* if(old_job_info_ptr) */ + /* old_job_info_ptr->last_update = 0; */ + /* if(old_node_info_ptr) */ + /* old_node_info_ptr->last_update = 0; */ + /* if(old_part_info_ptr) */ + /* old_part_info_ptr->last_update = 0; */ + /* if(old_res_info_ptr) */ + /* old_res_info_ptr->last_update = 0; */ + /* if(old_slurm_ctl_conf_ptr) */ + /* old_slurm_ctl_conf_ptr->last_update = 0; */ } else if (strncasecmp (tag, "create", MAX(taglen, 2)) == 0) { if (argc < 2) { diff --git a/src/sinfo/sinfo.c b/src/sinfo/sinfo.c index d15b34e25aa..99ffbcdb7f4 100644 --- a/src/sinfo/sinfo.c +++ b/src/sinfo/sinfo.c @@ -236,7 +236,7 @@ _query_server(partition_info_msg_t ** part_pptr, old_bg_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&old_bg_ptr); + slurm_free_block_info_msg(old_bg_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_SUCCESS; new_bg_ptr = old_bg_ptr; diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index 1e8faad0fc5..b76d21b8b25 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -304,7 +304,7 @@ void slurmctld_req (slurm_msg_t * msg) break; case REQUEST_UPDATE_BLOCK: _slurm_rpc_update_block(msg); - node_select_free_block_info(msg->data); + slurm_free_block_info(msg->data); break; case REQUEST_RESERVATION_INFO: _slurm_rpc_resv_show(msg); diff --git a/src/smap/partition_functions.c b/src/smap/partition_functions.c index 544f2ddbd21..0ff569b3147 100644 --- a/src/smap/partition_functions.c +++ b/src/smap/partition_functions.c @@ -228,7 +228,7 @@ extern void get_bg_part() error_code = slurm_load_block_info(bg_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(bg_info_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_SUCCESS; new_bg_ptr = bg_info_ptr; diff --git a/src/srun/allocate.c b/src/srun/allocate.c index 860f8fb46b0..eac2d12a5d3 100644 --- a/src/srun/allocate.c +++ b/src/srun/allocate.c @@ -294,7 +294,7 @@ static int _blocks_dealloc(void) error_code = slurm_load_block_info(bg_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(bg_info_ptr); else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_SUCCESS; new_bg_ptr = bg_info_ptr; diff --git a/src/sview/block_info.c b/src/sview/block_info.c index d3718597da6..3b9ee4ad972 100644 --- a/src/sview/block_info.c +++ b/src/sview/block_info.c @@ -104,8 +104,8 @@ static display_data_t display_data_block[] = { {G_TYPE_STRING, SORTID_CONN, "Connection Type", FALSE, EDIT_NONE, refresh_block, create_model_block, admin_edit_block}, - {G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, EDIT_NONE, refresh_block, - create_model_block, admin_edit_block}, + {G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, + EDIT_NONE, refresh_block, create_model_block, admin_edit_block}, {G_TYPE_STRING, SORTID_PARTITION, "Partition", TRUE, EDIT_NONE, refresh_block, create_model_block, admin_edit_block}, @@ -492,10 +492,10 @@ static List _create_block_list(partition_info_msg_t *part_info_ptr, return block_list; } - if(block_list) { - list_destroy(block_list); - } - block_list = list_create(_block_list_del); + if(block_list) + list_flush(block_list); + else + block_list = list_create(_block_list_del); if (!block_list) { g_print("malloc error\n"); return NULL; @@ -694,7 +694,6 @@ extern void refresh_block(GtkAction *action, gpointer user_data) extern int get_new_info_block(block_info_msg_t **block_ptr, int force) { int error_code = SLURM_NO_CHANGE_IN_DATA; - static block_info_msg_t *bg_info_ptr = NULL; static block_info_msg_t *new_bg_ptr = NULL; time_t now = time(NULL); static time_t last; @@ -704,23 +703,23 @@ extern int get_new_info_block(block_info_msg_t **block_ptr, int force) return error_code; if(!force && ((now - last) < working_sview_config.refresh_delay)) { - if(*block_ptr != bg_info_ptr) + if(*block_ptr != g_block_info_ptr) error_code = SLURM_SUCCESS; - *block_ptr = bg_info_ptr; + *block_ptr = g_block_info_ptr; if(changed) return SLURM_SUCCESS; return error_code; } last = now; - if (bg_info_ptr) { - error_code = slurm_load_block_info(bg_info_ptr->last_update, - &new_bg_ptr); + if (g_block_info_ptr) { + error_code = slurm_load_block_info( + g_block_info_ptr->last_update, &new_bg_ptr); if (error_code == SLURM_SUCCESS) { - slurm_free_block_info_msg(&bg_info_ptr); + slurm_free_block_info_msg(g_block_info_ptr); changed = 1; } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; - new_bg_ptr = bg_info_ptr; + new_bg_ptr = g_block_info_ptr; changed = 0; } } else { @@ -729,9 +728,9 @@ extern int get_new_info_block(block_info_msg_t **block_ptr, int force) changed = 1; } - bg_info_ptr = new_bg_ptr; + g_block_info_ptr = new_bg_ptr; if(block_ptr) { - if(*block_ptr != bg_info_ptr) + if(*block_ptr != g_block_info_ptr) error_code = SLURM_SUCCESS; *block_ptr = new_bg_ptr; @@ -898,8 +897,6 @@ extern void get_info_block(GtkTable *table, display_data_t *display_data) if(display_widget) gtk_widget_destroy(display_widget); display_widget = NULL; - get_new_info_part(&part_info_ptr, true); - get_new_info_block(&block_ptr, true); return; } diff --git a/src/sview/common.c b/src/sview/common.c index 7f777017dd9..99070d159a1 100644 --- a/src/sview/common.c +++ b/src/sview/common.c @@ -59,12 +59,6 @@ static gboolean _menu_button_released(GtkWidget *widget, GdkEventButton *event, return false; } -static gboolean _entry_changed(GtkWidget *widget, void *msg) -{ - global_entry_changed = 1; - return false; -} - static void _handle_response(GtkDialog *dialog, gint response_id, popup_info_t *popup_win) { diff --git a/src/sview/config_info.c b/src/sview/config_info.c index ceacbdad25a..3d00f35e851 100644 --- a/src/sview/config_info.c +++ b/src/sview/config_info.c @@ -41,24 +41,23 @@ extern int get_new_info_config(slurm_ctl_conf_info_msg_t **info_ptr) { - static slurm_ctl_conf_info_msg_t *ctl_info_ptr = NULL, - *new_ctl_ptr = NULL; + static slurm_ctl_conf_info_msg_t *new_ctl_ptr = NULL; int error_code = SLURM_NO_CHANGE_IN_DATA; - if (ctl_info_ptr) { - error_code = slurm_load_ctl_conf(ctl_info_ptr->last_update, + if (g_ctl_info_ptr) { + error_code = slurm_load_ctl_conf(g_ctl_info_ptr->last_update, &new_ctl_ptr); if (error_code == SLURM_SUCCESS) - slurm_free_ctl_conf(ctl_info_ptr); + slurm_free_ctl_conf(g_ctl_info_ptr); else if (slurm_get_errno () == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; - new_ctl_ptr = ctl_info_ptr; + new_ctl_ptr = g_ctl_info_ptr; } } else error_code = slurm_load_ctl_conf((time_t) NULL, &new_ctl_ptr); - ctl_info_ptr = new_ctl_ptr; + g_ctl_info_ptr = new_ctl_ptr; - if(*info_ptr != ctl_info_ptr) + if(*info_ptr != g_ctl_info_ptr) error_code = SLURM_SUCCESS; *info_ptr = new_ctl_ptr; diff --git a/src/sview/job_info.c b/src/sview/job_info.c index f36d1605c1d..660b08800f3 100644 --- a/src/sview/job_info.c +++ b/src/sview/job_info.c @@ -2417,12 +2417,12 @@ static List _create_job_info_list(job_info_msg_t *job_info_ptr, } if(info_list) { - list_destroy(info_list); - list_destroy(odd_info_list); + list_flush(info_list); + list_flush(odd_info_list); + } else { + info_list = list_create(NULL); + odd_info_list = list_create(_job_info_list_del); } - - info_list = list_create(NULL); - odd_info_list = list_create(_job_info_list_del); if (!info_list || !odd_info_list) { g_print("malloc error\n"); return NULL; @@ -2613,7 +2613,7 @@ extern void refresh_job(GtkAction *action, gpointer user_data) extern int get_new_info_job(job_info_msg_t **info_ptr, int force) { - static job_info_msg_t *job_info_ptr = NULL, *new_job_ptr = NULL; + static job_info_msg_t *new_job_ptr = NULL; uint16_t show_flags = 0; int error_code = SLURM_NO_CHANGE_IN_DATA; time_t now = time(NULL); @@ -2622,9 +2622,9 @@ extern int get_new_info_job(job_info_msg_t **info_ptr, static uint16_t last_flags = 0; if(!force && ((now - last) < working_sview_config.refresh_delay)) { - if(*info_ptr != job_info_ptr) + if(*info_ptr != g_job_info_ptr) error_code = SLURM_SUCCESS; - *info_ptr = job_info_ptr; + *info_ptr = g_job_info_ptr; if(changed) return SLURM_SUCCESS; return error_code; @@ -2633,17 +2633,17 @@ extern int get_new_info_job(job_info_msg_t **info_ptr, if(working_sview_config.show_hidden) show_flags |= SHOW_ALL; - if (job_info_ptr) { + if (g_job_info_ptr) { if(show_flags != last_flags) - job_info_ptr->last_update = 0; - error_code = slurm_load_jobs(job_info_ptr->last_update, + g_job_info_ptr->last_update = 0; + error_code = slurm_load_jobs(g_job_info_ptr->last_update, &new_job_ptr, show_flags); if (error_code == SLURM_SUCCESS) { - slurm_free_job_info_msg(job_info_ptr); + slurm_free_job_info_msg(g_job_info_ptr); changed = 1; } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; - new_job_ptr = job_info_ptr; + new_job_ptr = g_job_info_ptr; changed = 0; } } else { @@ -2653,9 +2653,9 @@ extern int get_new_info_job(job_info_msg_t **info_ptr, } last_flags = show_flags; - job_info_ptr = new_job_ptr; + g_job_info_ptr = new_job_ptr; - if(*info_ptr != job_info_ptr) + if(*info_ptr != g_job_info_ptr) error_code = SLURM_SUCCESS; *info_ptr = new_job_ptr; @@ -2915,6 +2915,14 @@ extern void get_info_job(GtkTable *table, display_data_t *display_data) ListIterator itr = NULL; GtkTreePath *path = NULL; + /* reset */ + if(!table && !display_data) { + if(display_widget) + gtk_widget_destroy(display_widget); + display_widget = NULL; + return; + } + if(display_data) local_display_data = display_data; if(!table) { diff --git a/src/sview/node_info.c b/src/sview/node_info.c index f1e41540e3d..da1ad6e3073 100644 --- a/src/sview/node_info.c +++ b/src/sview/node_info.c @@ -583,7 +583,7 @@ update_color: extern int get_new_info_node(node_info_msg_t **info_ptr, int force) { - static node_info_msg_t *node_info_ptr = NULL, *new_node_ptr = NULL; + static node_info_msg_t *new_node_ptr = NULL; uint16_t show_flags = 0; int error_code = SLURM_NO_CHANGE_IN_DATA; time_t now = time(NULL); @@ -592,9 +592,9 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force) static uint16_t last_flags = 0; if(!force && ((now - last) < working_sview_config.refresh_delay)) { - if(*info_ptr != node_info_ptr) + if(*info_ptr != g_node_info_ptr) error_code = SLURM_SUCCESS; - *info_ptr = node_info_ptr; + *info_ptr = g_node_info_ptr; if(changed) return SLURM_SUCCESS; @@ -604,17 +604,17 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force) if(working_sview_config.show_hidden) show_flags |= SHOW_ALL; - if (node_info_ptr) { + if (g_node_info_ptr) { if(show_flags != last_flags) - node_info_ptr->last_update = 0; - error_code = slurm_load_node(node_info_ptr->last_update, + g_node_info_ptr->last_update = 0; + error_code = slurm_load_node(g_node_info_ptr->last_update, &new_node_ptr, show_flags); if (error_code == SLURM_SUCCESS) { - slurm_free_node_info_msg(node_info_ptr); + slurm_free_node_info_msg(g_node_info_ptr); changed = 1; } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; - new_node_ptr = node_info_ptr; + new_node_ptr = g_node_info_ptr; changed = 0; } } else { @@ -624,9 +624,9 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force) } last_flags = show_flags; - node_info_ptr = new_node_ptr; + g_node_info_ptr = new_node_ptr; - if(*info_ptr != node_info_ptr) + if(*info_ptr != g_node_info_ptr) error_code = SLURM_SUCCESS; if(new_node_ptr && changed) { int i; @@ -638,8 +638,8 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force) cpus_per_node = new_node_ptr->node_array[0].cpus / g_node_scaling; - for (i=0; i<node_info_ptr->record_count; i++) { - node_ptr = &(node_info_ptr->node_array[i]); + for (i=0; i<g_node_info_ptr->record_count; i++) { + node_ptr = &(g_node_info_ptr->node_array[i]); if (!node_ptr->name || (node_ptr->name[0] == '\0')) continue; /* bad node */ @@ -1088,6 +1088,14 @@ extern void get_info_node(GtkTable *table, display_data_t *display_data) sview_node_info_t *sview_node_info_ptr = NULL; ListIterator itr = NULL; + /* reset */ + if(!table && !display_data) { + if(display_widget) + gtk_widget_destroy(display_widget); + display_widget = NULL; + return; + } + if(display_data) local_display_data = display_data; if(!table) { diff --git a/src/sview/part_info.c b/src/sview/part_info.c index eb6988ed51e..bda57412169 100644 --- a/src/sview/part_info.c +++ b/src/sview/part_info.c @@ -1546,10 +1546,10 @@ static List _create_part_info_list(partition_info_msg_t *part_info_ptr, return info_list; } - if(info_list) { - list_destroy(info_list); - } - info_list = list_create(_part_info_list_del); + if(info_list) + list_flush(info_list); + else + info_list = list_create(_part_info_list_del); if (!info_list) { g_print("malloc error\n"); return NULL; @@ -1679,7 +1679,6 @@ extern void refresh_part(GtkAction *action, gpointer user_data) extern int get_new_info_part(partition_info_msg_t **part_ptr, int force) { - static partition_info_msg_t *part_info_ptr = NULL; static partition_info_msg_t *new_part_ptr = NULL; uint16_t show_flags = 0; int error_code = SLURM_NO_CHANGE_IN_DATA; @@ -1689,9 +1688,9 @@ extern int get_new_info_part(partition_info_msg_t **part_ptr, int force) static uint16_t last_flags = 0; if(!force && ((now - last) < working_sview_config.refresh_delay)) { - if(*part_ptr != part_info_ptr) + if(*part_ptr != g_part_info_ptr) error_code = SLURM_SUCCESS; - *part_ptr = part_info_ptr; + *part_ptr = g_part_info_ptr; if(changed) return SLURM_SUCCESS; return error_code; @@ -1701,17 +1700,17 @@ extern int get_new_info_part(partition_info_msg_t **part_ptr, int force) if(working_sview_config.show_hidden) show_flags |= SHOW_ALL; - if (part_info_ptr) { + if (g_part_info_ptr) { if(show_flags != last_flags) - part_info_ptr->last_update = 0; - error_code = slurm_load_partitions(part_info_ptr->last_update, + g_part_info_ptr->last_update = 0; + error_code = slurm_load_partitions(g_part_info_ptr->last_update, &new_part_ptr, show_flags); if (error_code == SLURM_SUCCESS) { - slurm_free_partition_info_msg(part_info_ptr); + slurm_free_partition_info_msg(g_part_info_ptr); changed = 1; } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; - new_part_ptr = part_info_ptr; + new_part_ptr = g_part_info_ptr; changed = 0; } } else { @@ -1721,9 +1720,9 @@ extern int get_new_info_part(partition_info_msg_t **part_ptr, int force) } last_flags = show_flags; - part_info_ptr = new_part_ptr; + g_part_info_ptr = new_part_ptr; - if(*part_ptr != part_info_ptr) + if(*part_ptr != g_part_info_ptr) error_code = SLURM_SUCCESS; *part_ptr = new_part_ptr; @@ -1961,6 +1960,14 @@ extern void get_info_part(GtkTable *table, display_data_t *display_data) ListIterator itr = NULL; GtkTreePath *path = NULL; + /* reset */ + if(!table && !display_data) { + if(display_widget) + gtk_widget_destroy(display_widget); + display_widget = NULL; + return; + } + if(display_data) local_display_data = display_data; if(!table) { diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c index e474c4fb9c5..6f4a63abe4c 100644 --- a/src/sview/resv_info.c +++ b/src/sview/resv_info.c @@ -81,8 +81,13 @@ static display_data_t display_data_resv[] = { refresh_resv, create_model_resv, admin_edit_resv}, {G_TYPE_STRING, SORTID_NODE_CNT, "Node Count", TRUE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_NODE_LIST, "NodeList", TRUE, EDIT_TEXTBOX, - refresh_resv, create_model_resv, admin_edit_resv}, + {G_TYPE_STRING, SORTID_NODE_LIST, +#ifdef HAVE_BG + "BP List", +#else + "NodeList", +#endif + TRUE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, {G_TYPE_STRING, SORTID_TIME_START, "Time Start", TRUE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, {G_TYPE_STRING, SORTID_TIME_END, "Time End", TRUE, EDIT_TEXTBOX, @@ -119,6 +124,7 @@ static display_data_t options_data_resv[] = { {G_TYPE_STRING, BLOCK_PAGE, "Blocks", TRUE, RESV_PAGE}, {G_TYPE_STRING, NODE_PAGE, "Base Partitions", TRUE, RESV_PAGE}, #else + {G_TYPE_STRING, BLOCK_PAGE, NULL, TRUE, RESV_PAGE}, {G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, RESV_PAGE}, #endif {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} @@ -786,30 +792,30 @@ extern void refresh_resv(GtkAction *action, gpointer user_data) extern int get_new_info_resv(reserve_info_msg_t **info_ptr, int force) { - static reserve_info_msg_t *resv_info_ptr = NULL, *new_resv_ptr = NULL; + static reserve_info_msg_t *new_resv_ptr = NULL; int error_code = SLURM_NO_CHANGE_IN_DATA; time_t now = time(NULL); static time_t last; static bool changed = 0; if(!force && ((now - last) < working_sview_config.refresh_delay)) { - if(*info_ptr != resv_info_ptr) + if(*info_ptr != g_resv_info_ptr) error_code = SLURM_SUCCESS; - *info_ptr = resv_info_ptr; + *info_ptr = g_resv_info_ptr; if(changed) return SLURM_SUCCESS; return error_code; } last = now; - if (resv_info_ptr) { - error_code = slurm_load_reservations(resv_info_ptr->last_update, - &new_resv_ptr); + if (g_resv_info_ptr) { + error_code = slurm_load_reservations( + g_resv_info_ptr->last_update, &new_resv_ptr); if (error_code == SLURM_SUCCESS) { - slurm_free_reservation_info_msg(resv_info_ptr); + slurm_free_reservation_info_msg(g_resv_info_ptr); changed = 1; } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { error_code = SLURM_NO_CHANGE_IN_DATA; - new_resv_ptr = resv_info_ptr; + new_resv_ptr = g_resv_info_ptr; changed = 0; } } else { @@ -818,9 +824,9 @@ extern int get_new_info_resv(reserve_info_msg_t **info_ptr, changed = 1; } - resv_info_ptr = new_resv_ptr; + g_resv_info_ptr = new_resv_ptr; - if(*info_ptr != resv_info_ptr) + if(*info_ptr != g_resv_info_ptr) error_code = SLURM_SUCCESS; *info_ptr = new_resv_ptr; @@ -945,6 +951,14 @@ extern void get_info_resv(GtkTable *table, display_data_t *display_data) time_t now = time(NULL); GtkTreePath *path = NULL; + /* reset */ + if(!table && !display_data) { + if(display_widget) + gtk_widget_destroy(display_widget); + display_widget = NULL; + return; + } + if(display_data) local_display_data = display_data; if(!table) { @@ -1263,14 +1277,13 @@ extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id) snprintf(title, 100, "Job(s) in reservation %s", name); break; case NODE_PAGE: -#ifdef HAVE_BG - snprintf(title, 100, - "Base partitions(s) in reservation %s", - name); -#else - snprintf(title, 100, "Node(s) in reservation %s ", - name); -#endif + if(cluster_flags & CLUSTER_FLAG_BG) + snprintf(title, 100, + "Base partitions(s) in reservation %s", + name); + else + snprintf(title, 100, "Node(s) in reservation %s ", + name); break; case BLOCK_PAGE: snprintf(title, 100, "Block(s) in reservation %s", name); @@ -1459,3 +1472,55 @@ end_it: return; } +extern void cluster_change_resv() +{ + display_data_t *display_data = display_data_resv; + while(display_data++) { + if(display_data->id == -1) + break; + if(cluster_flags & CLUSTER_FLAG_BG) { + switch(display_data->id) { + case SORTID_NODE_LIST: + display_data->name = "BP List"; + break; + default: + break; + } + } else { + switch(display_data->id) { + case SORTID_NODE_LIST: + display_data->name = "NodeList"; + break; + default: + break; + } + } + } + display_data = options_data_resv; + while(display_data++) { + if(display_data->id == -1) + break; + + if(cluster_flags & CLUSTER_FLAG_BG) { + switch(display_data->id) { + case BLOCK_PAGE: + display_data->name = "Blocks"; + break; + case NODE_PAGE: + display_data->name = "Base Partitions"; + break; + } + } else { + switch(display_data->id) { + case BLOCK_PAGE: + display_data->name = NULL; + break; + case NODE_PAGE: + display_data->name = "Nodes"; + break; + } + } + } + get_info_resv(NULL, NULL); +} + diff --git a/src/sview/sview.c b/src/sview/sview.c index 453142bf17f..5fbf76ca40f 100644 --- a/src/sview/sview.c +++ b/src/sview/sview.c @@ -74,6 +74,13 @@ GCond *grid_cond = NULL; uint32_t cluster_flags; int cluster_dims; +block_info_msg_t *g_block_info_ptr = NULL; +job_info_msg_t *g_job_info_ptr = NULL; +node_info_msg_t *g_node_info_ptr = NULL; +partition_info_msg_t *g_part_info_ptr = NULL; +reserve_info_msg_t *g_resv_info_ptr = NULL; +slurm_ctl_conf_info_msg_t *g_ctl_info_ptr = NULL; + static GtkActionGroup *admin_action_group = NULL; static GtkActionGroup *menu_action_group = NULL; static bool debug_inited = 0; @@ -807,7 +814,34 @@ extern void change_cluster_main() } } } + slurm_free_block_info_msg(g_block_info_ptr); + g_block_info_ptr = NULL; + slurm_free_job_info_msg(g_job_info_ptr); + g_job_info_ptr = NULL; + slurm_free_node_info_msg(g_node_info_ptr); + g_node_info_ptr = NULL; + slurm_free_partition_info_msg(g_part_info_ptr); + g_part_info_ptr = NULL; + slurm_free_reservation_info_msg(g_resv_info_ptr); + g_resv_info_ptr = NULL; + slurm_free_ctl_conf(g_ctl_info_ptr); + g_ctl_info_ptr = NULL; + + /* if(g_block_info_ptr) */ + /* g_block_info_ptr->last_update = 0; */ + /* if(g_job_info_ptr) */ + /* g_job_info_ptr->last_update = 0; */ + /* if(g_node_info_ptr) */ + /* g_node_info_ptr->last_update = 0; */ + /* if(g_part_info_ptr) */ + /* g_part_info_ptr->last_update = 0; */ + /* if(g_resv_info_ptr) */ + /* g_resv_info_ptr->last_update = 0; */ + /* if(g_ctl_info_ptr) */ + /* g_ctl_info_ptr->last_update = 0; */ + cluster_change_block(); + cluster_change_resv(); } extern void refresh_main(GtkAction *action, gpointer user_data) diff --git a/src/sview/sview.h b/src/sview/sview.h index b4edc9bb56a..b579a22fa1d 100644 --- a/src/sview/sview.h +++ b/src/sview/sview.h @@ -265,7 +265,6 @@ typedef struct { List *button_list; } signal_params_t; - extern sview_config_t default_sview_config; extern sview_config_t working_sview_config; @@ -294,6 +293,13 @@ extern int sview_colors_cnt; extern uint32_t cluster_flags; extern int cluster_dims; +extern block_info_msg_t *g_block_info_ptr; +extern job_info_msg_t *g_job_info_ptr; +extern node_info_msg_t *g_node_info_ptr; +extern partition_info_msg_t *g_part_info_ptr; +extern reserve_info_msg_t *g_resv_info_ptr; +extern slurm_ctl_conf_info_msg_t *g_ctl_info_ptr; + extern void init_grid(node_info_msg_t *node_info_ptr); extern int set_grid(int start, int end, int count); extern int set_grid_bg(int *start, int *end, int count, int set); -- GitLab