diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in index c64bb90ba7ff638409dfc630d1adbc14bcae6096..edfd9330d426c940fad776d2eac72b968e5a6b49 100644 --- a/slurm/slurm.h.in +++ b/slurm/slurm.h.in @@ -360,6 +360,8 @@ enum select_nodedata_type { SELECT_NODEDATA_STR, /* data-> char * needs to be * freed with xfree */ SELECT_NODEDATA_PTR, /* data-> select_nodeinfo_t *nodeinfo */ + SELECT_NODEDATA_EXTRA_INFO, /* data-> char * needs to be + * freed with xfree */ }; enum select_print_mode { diff --git a/src/plugins/select/bluegene/bg_node_info.c b/src/plugins/select/bluegene/bg_node_info.c index 590e81f64159b37a65703ba1be713f2be137a7a1..5c34057d1d8ec1fb63fb1ced52837d3b73d57754 100644 --- a/src/plugins/select/bluegene/bg_node_info.c +++ b/src/plugins/select/bluegene/bg_node_info.c @@ -133,7 +133,25 @@ extern int select_nodeinfo_pack(select_nodeinfo_t *nodeinfo, Buf buffer, node_subgrp_t *subgrp = NULL; uint16_t count = 0; - if (protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { + if (protocol_version >= SLURM_2_4_PROTOCOL_VERSION) { + pack16(nodeinfo->bitmap_size, buffer); + + packstr(nodeinfo->extra_info, buffer); + + if (nodeinfo->subgrp_list) + count = list_count(nodeinfo->subgrp_list); + + pack16(count, buffer); + + if (count > 0) { + itr = list_iterator_create(nodeinfo->subgrp_list); + while ((subgrp = list_next(itr))) { + _pack_node_subgrp(subgrp, buffer, + protocol_version); + } + list_iterator_destroy(itr); + } + } else if (protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { pack16(nodeinfo->bitmap_size, buffer); if (nodeinfo->subgrp_list) @@ -150,6 +168,7 @@ extern int select_nodeinfo_pack(select_nodeinfo_t *nodeinfo, Buf buffer, list_iterator_destroy(itr); } } + return SLURM_SUCCESS; } @@ -159,8 +178,29 @@ extern int select_nodeinfo_unpack(select_nodeinfo_t **nodeinfo, Buf buffer, uint16_t size = 0; select_nodeinfo_t *nodeinfo_ptr = NULL; uint32_t j = 0; + uint32_t uint32_tmp; - if (protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { + if (protocol_version >= SLURM_2_4_PROTOCOL_VERSION) { + safe_unpack16(&size, buffer); + + nodeinfo_ptr = select_nodeinfo_alloc((uint32_t)size); + *nodeinfo = nodeinfo_ptr; + + safe_unpackstr_xmalloc(&nodeinfo_ptr->extra_info, + &uint32_tmp, buffer); + + safe_unpack16(&size, buffer); + nodeinfo_ptr->subgrp_list = list_create(_free_node_subgrp); + for (j=0; j<size; j++) { + node_subgrp_t *subgrp = NULL; + if (_unpack_node_subgrp(&subgrp, buffer, + nodeinfo_ptr->bitmap_size, + protocol_version) + != SLURM_SUCCESS) + goto unpack_error; + list_append(nodeinfo_ptr->subgrp_list, subgrp); + } + } else if (protocol_version >= SLURM_2_1_PROTOCOL_VERSION) { safe_unpack16(&size, buffer); nodeinfo_ptr = select_nodeinfo_alloc((uint32_t)size); @@ -168,7 +208,7 @@ extern int select_nodeinfo_unpack(select_nodeinfo_t **nodeinfo, Buf buffer, safe_unpack16(&size, buffer); nodeinfo_ptr->subgrp_list = list_create(_free_node_subgrp); - for(j=0; j<size; j++) { + for (j=0; j<size; j++) { node_subgrp_t *subgrp = NULL; if (_unpack_node_subgrp(&subgrp, buffer, nodeinfo_ptr->bitmap_size, @@ -219,6 +259,7 @@ extern int select_nodeinfo_free(select_nodeinfo_t *nodeinfo) return EINVAL; } nodeinfo->magic = 0; + xfree(nodeinfo->extra_info); if (nodeinfo->subgrp_list) list_destroy(nodeinfo->subgrp_list); xfree(nodeinfo); @@ -411,6 +452,9 @@ extern int select_nodeinfo_get(select_nodeinfo_t *nodeinfo, } list_iterator_destroy(itr); break; + case SELECT_NODEDATA_EXTRA_INFO: + *tmp_char = xstrdup(nodeinfo->extra_info); + break; default: error("Unsupported option %d for get_nodeinfo.", dinfo); rc = SLURM_ERROR; diff --git a/src/plugins/select/bluegene/bg_node_info.h b/src/plugins/select/bluegene/bg_node_info.h index 2cf1912d9a6ed07e80cbbca05e90c4eeb753779a..6e483b023d2940256ee36d8673cf1b9c876d5229 100644 --- a/src/plugins/select/bluegene/bg_node_info.h +++ b/src/plugins/select/bluegene/bg_node_info.h @@ -55,6 +55,9 @@ typedef struct { struct select_nodeinfo { ba_mp_t *ba_mp; uint16_t bitmap_size; + char *extra_info; /* Currently used to tell if a cable + is in an error state. + */ uint16_t magic; /* magic number */ List subgrp_list; };