diff --git a/src/common/gres.c b/src/common/gres.c index e6e8b16e5b52a1e12b3bf12cdcd77b610f7ee483..fd2a1a2cb13d73b0bc240318dc8b3b7d07f5aac5 100644 --- a/src/common/gres.c +++ b/src/common/gres.c @@ -100,7 +100,6 @@ typedef struct slurm_gres_context { slurm_gres_ops_t ops; /* pointers to plugin symbols */ uint32_t plugin_id; /* key for searches */ plugrack_t plugin_list; /* plugrack info */ - bool unpacked_info; /* info unpacked */ } slurm_gres_context_t; /* Generic gres data structure for adding to a list. Depending upon the @@ -135,9 +134,6 @@ static int _job_config_validate(char *config, uint32_t *gres_cnt, slurm_gres_context_t *context_ptr); static void _job_state_delete(void *gres_data); static void * _job_state_dup(void *gres_data); -static int _job_state_pack(void *gres_data, Buf buffer); -static int _job_state_unpack(void **gres_data, Buf buffer, - char *gres_name); static int _job_state_validate(char *config, void **gres_data, slurm_gres_context_t *gres_name); extern uint32_t _job_test(void *job_gres_data, void *node_gres_data, @@ -837,8 +833,6 @@ extern int gres_plugin_node_config_unpack(Buf buffer, char* node_name) return SLURM_SUCCESS; slurm_mutex_lock(&gres_context_lock); - for (j=0; j<gres_context_cnt; j++) - gres_context[j].unpacked_info = false; for (i=0; i<rec_cnt; i++) { safe_unpack32(&magic, buffer); if (magic != GRES_MAGIC) @@ -876,7 +870,6 @@ extern int gres_plugin_node_config_unpack(Buf buffer, char* node_name) count = 1024; } gres_context[j].has_file = has_file; - gres_context[j].unpacked_info = true; break; } if (j >= gres_context_cnt) { @@ -899,14 +892,6 @@ extern int gres_plugin_node_config_unpack(Buf buffer, char* node_name) p->plugin_id = plugin_id; list_append(gres_conf_list, p); } - for (j=0; j<gres_context_cnt; j++) { - if (gres_context[j].unpacked_info) - continue; - - /* A likely sign GresPlugins is inconsistently configured. */ - error("gres_plugin_node_config_unpack: no data type of type " - "%s from node %s", gres_context[j].gres_type, node_name); - } slurm_mutex_unlock(&gres_context_lock); return rc; @@ -1575,9 +1560,6 @@ extern int gres_plugin_node_state_unpack(List *gres_list, Buf buffer, fatal("list_create malloc failure"); } - for (i=0; i<gres_context_cnt; i++) - gres_context[i].unpacked_info = false; - while ((rc == SLURM_SUCCESS) && (rec_cnt)) { if ((buffer == NULL) || (remaining_buf(buffer) == 0)) break; @@ -1600,7 +1582,6 @@ extern int gres_plugin_node_state_unpack(List *gres_list, Buf buffer, * Not a fatal error, skip over the data. */ continue; } - gres_context[i].unpacked_info = true; gres_node_ptr = _build_gres_node_state(); gres_node_ptr->gres_cnt_avail = gres_cnt_avail; if (has_bitmap) { @@ -1614,30 +1595,14 @@ extern int gres_plugin_node_state_unpack(List *gres_list, Buf buffer, gres_ptr->gres_data = gres_node_ptr; list_append(*gres_list, gres_ptr); } - -fini: /* Insure that every gres plugin is called for unpack, even if no data - * was packed by the node. A likely sign that GresPlugins is - * inconsistently configured. */ - for (i=0; i<gres_context_cnt; i++) { - if (gres_context[i].unpacked_info) - continue; - error("gres_plugin_node_state_unpack: no info packed for %s " - "by node %s", gres_context[i].gres_type, node_name); - gres_node_ptr = _build_gres_node_state(); - gres_ptr = xmalloc(sizeof(gres_state_t)); - gres_ptr->plugin_id = gres_context[i].plugin_id; - gres_ptr->gres_data = gres_node_ptr; - list_append(*gres_list, gres_ptr); - } slurm_mutex_unlock(&gres_context_lock); - return rc; unpack_error: error("gres_plugin_node_state_unpack: unpack error from node %s", node_name); - rc = SLURM_ERROR; - goto fini; + slurm_mutex_unlock(&gres_context_lock); + return SLURM_ERROR; } static void *_node_state_dup(void *gres_data) @@ -2142,7 +2107,6 @@ static void *_job_state_dup(void *gres_data) */ List gres_plugin_job_state_dup(List gres_list) { - int i; ListIterator gres_iter; gres_state_t *gres_ptr, *new_gres_state; List new_gres_list = NULL; @@ -2156,27 +2120,18 @@ List gres_plugin_job_state_dup(List gres_list) slurm_mutex_lock(&gres_context_lock); gres_iter = list_iterator_create(gres_list); while ((gres_ptr = (gres_state_t *) list_next(gres_iter))) { - for (i=0; i<gres_context_cnt; i++) { - if (gres_ptr->plugin_id != gres_context[i].plugin_id) - continue; - new_gres_data = _job_state_dup(gres_ptr->gres_data); - if (new_gres_data == NULL) - break; - if (new_gres_list == NULL) { - new_gres_list = list_create(_gres_job_list_delete); - if (new_gres_list == NULL) - fatal("list_create: malloc failure"); - } - new_gres_state = xmalloc(sizeof(gres_state_t)); - new_gres_state->plugin_id = gres_ptr->plugin_id; - new_gres_state->gres_data = new_gres_data; - list_append(new_gres_list, new_gres_state); + new_gres_data = _job_state_dup(gres_ptr->gres_data); + if (new_gres_data == NULL) break; + if (new_gres_list == NULL) { + new_gres_list = list_create(_gres_job_list_delete); + if (new_gres_list == NULL) + fatal("list_create: malloc failure"); } - if (i >= gres_context_cnt) { - error("Could not find plugin id %u to dup job record", - gres_ptr->plugin_id); - } + new_gres_state = xmalloc(sizeof(gres_state_t)); + new_gres_state->plugin_id = gres_ptr->plugin_id; + new_gres_state->gres_data = new_gres_data; + list_append(new_gres_list, new_gres_state); } list_iterator_destroy(gres_iter); slurm_mutex_unlock(&gres_context_lock); @@ -2184,19 +2139,6 @@ List gres_plugin_job_state_dup(List gres_list) return new_gres_list; } -static int _job_state_pack(void *gres_data, Buf buffer) -{ - int i; - gres_job_state_t *gres_ptr = (gres_job_state_t *) gres_data; - - pack32(gres_ptr->gres_cnt_alloc, buffer); - pack32(gres_ptr->node_cnt, buffer); - for (i=0; i<gres_ptr->node_cnt; i++) - pack_bit_str(gres_ptr->gres_bit_alloc[i], buffer); - - return SLURM_SUCCESS; -} - /* * Pack a job's current gres status, called from slurmctld for save/restore * IN gres_list - generated by gres_plugin_job_config_validate() @@ -2206,13 +2148,14 @@ static int _job_state_pack(void *gres_data, Buf buffer) extern int gres_plugin_job_state_pack(List gres_list, Buf buffer, uint32_t job_id) { - int i, rc = SLURM_SUCCESS, rc2; - uint32_t top_offset, gres_size = 0; - uint32_t header_offset, size_offset, data_offset, tail_offset; + int i, rc = SLURM_SUCCESS; + uint32_t top_offset, tail_offset; uint32_t magic = GRES_MAGIC; uint16_t rec_cnt = 0; + uint8_t has_bitmap; ListIterator gres_iter; gres_state_t *gres_ptr; + gres_job_state_t *gres_job_ptr; top_offset = get_buf_offset(buffer); pack16(rec_cnt, buffer); /* placeholder if data */ @@ -2225,35 +2168,23 @@ extern int gres_plugin_job_state_pack(List gres_list, Buf buffer, slurm_mutex_lock(&gres_context_lock); gres_iter = list_iterator_create(gres_list); while ((gres_ptr = (gres_state_t *) list_next(gres_iter))) { - for (i=0; i<gres_context_cnt; i++) { - if (gres_ptr->plugin_id != - gres_context[i].plugin_id) - continue; - header_offset = get_buf_offset(buffer); - pack32(magic, buffer); - pack32(gres_ptr->plugin_id, buffer); - size_offset = get_buf_offset(buffer); - pack32(gres_size, buffer); /* placeholder */ - data_offset = get_buf_offset(buffer); - rc2 = _job_state_pack(gres_ptr->gres_data, buffer); - if (rc2 != SLURM_SUCCESS) { - rc = rc2; - set_buf_offset(buffer, header_offset); - continue; + gres_job_ptr = (gres_job_state_t *) gres_ptr->gres_data; + pack32(magic, buffer); + pack32(gres_ptr->plugin_id, buffer); + pack32(gres_job_ptr->gres_cnt_alloc, buffer); + pack32(gres_job_ptr->node_cnt, buffer); + if (gres_job_ptr->gres_bit_alloc) { + has_bitmap = 1; + pack8(has_bitmap, buffer); + for (i=0; i<gres_job_ptr->node_cnt; i++) { + pack_bit_str(gres_job_ptr->gres_bit_alloc[i], + buffer); } - tail_offset = get_buf_offset(buffer); - set_buf_offset(buffer, size_offset); - gres_size = tail_offset - data_offset; - pack32(gres_size, buffer); - set_buf_offset(buffer, tail_offset); - rec_cnt++; - break; - } - if (i >= gres_context_cnt) { - error("Could not find plugin id %u to pack record for " - "job %u", - gres_ptr->plugin_id, job_id); + } else { + has_bitmap = 0; + pack8(has_bitmap, buffer); } + rec_cnt++; } list_iterator_destroy(gres_iter); slurm_mutex_unlock(&gres_context_lock); @@ -2266,37 +2197,6 @@ extern int gres_plugin_job_state_pack(List gres_list, Buf buffer, return rc; } -static int _job_state_unpack(void **gres_data, Buf buffer, char *gres_name) -{ - int i; - gres_job_state_t *gres_ptr; - - gres_ptr = xmalloc(sizeof(gres_job_state_t)); - - if (buffer) { - safe_unpack32(&gres_ptr->gres_cnt_alloc, buffer); - safe_unpack32(&gres_ptr->node_cnt, buffer); - gres_ptr->gres_bit_alloc = xmalloc(sizeof(bitstr_t *) * - gres_ptr->node_cnt); - for (i=0; i<gres_ptr->node_cnt; i++) - unpack_bit_str(&gres_ptr->gres_bit_alloc[i], buffer); - } - - *gres_data = gres_ptr; - return SLURM_SUCCESS; - -unpack_error: - error("Unpacking gres/%s job state info", gres_name); - if (gres_ptr->gres_bit_alloc) { - for (i=0; i<gres_ptr->node_cnt; i++) - FREE_NULL_BITMAP(gres_ptr->gres_bit_alloc[i]); - xfree(gres_ptr->gres_bit_alloc); - } - xfree(gres_ptr); - *gres_data = NULL; - return SLURM_ERROR; -} - /* * Unpack a job's current gres status, called from slurmctld for save/restore * OUT gres_list - restored state stored by gres_plugin_job_state_pack() @@ -2306,11 +2206,12 @@ unpack_error: extern int gres_plugin_job_state_unpack(List *gres_list, Buf buffer, uint32_t job_id) { - int i, rc, rc2; - uint32_t gres_size, magic, tail_offset, plugin_id; + int i, rc; + uint32_t magic, plugin_id; uint16_t rec_cnt; + uint8_t has_bitmap; gres_state_t *gres_ptr; - void *gres_data; + gres_job_state_t *gres_job_ptr = NULL; safe_unpack16(&rec_cnt, buffer); if (rec_cnt == 0) @@ -2325,9 +2226,6 @@ extern int gres_plugin_job_state_unpack(List *gres_list, Buf buffer, fatal("list_create malloc failure"); } - for (i=0; i<gres_context_cnt; i++) - gres_context[i].unpacked_info = false; - while ((rc == SLURM_SUCCESS) && (rec_cnt)) { if ((buffer == NULL) || (remaining_buf(buffer) == 0)) break; @@ -2336,7 +2234,19 @@ extern int gres_plugin_job_state_unpack(List *gres_list, Buf buffer, if (magic != GRES_MAGIC) goto unpack_error; safe_unpack32(&plugin_id, buffer); - safe_unpack32(&gres_size, buffer); + gres_job_ptr = xmalloc(sizeof(gres_job_state_t)); + safe_unpack32(&gres_job_ptr->gres_cnt_alloc, buffer); + safe_unpack32(&gres_job_ptr->node_cnt, buffer); + safe_unpack8(&has_bitmap, buffer); + if (has_bitmap) { + gres_job_ptr->gres_bit_alloc = + xmalloc(sizeof(bitstr_t *) * + gres_job_ptr->node_cnt); + for (i=0; i<gres_job_ptr->node_cnt; i++) { + unpack_bit_str(&gres_job_ptr->gres_bit_alloc[i], + buffer); + } + } for (i=0; i<gres_context_cnt; i++) { if (gres_context[i].plugin_id == plugin_id) break; @@ -2347,53 +2257,25 @@ extern int gres_plugin_job_state_unpack(List *gres_list, Buf buffer, plugin_id, job_id); /* A likely sign that GresPlugins has changed. * Not a fatal error, skip over the data. */ - tail_offset = get_buf_offset(buffer); - tail_offset += gres_size; - set_buf_offset(buffer, tail_offset); + _job_state_delete(gres_job_ptr); continue; } - gres_context[i].unpacked_info = true; - rc2 = _job_state_unpack(&gres_data, buffer, - gres_context[i].gres_name); - if (rc2 != SLURM_SUCCESS) { - rc = rc2; - } else { - gres_ptr = xmalloc(sizeof(gres_state_t)); - gres_ptr->plugin_id = gres_context[i].plugin_id; - gres_ptr->gres_data = gres_data; - list_append(*gres_list, gres_ptr); - } - } - -fini: /* Insure that every gres plugin is called for unpack, even if no data - * was packed by the job. A likely sign that GresPlugins is - * inconsistently configured. */ - for (i=0; i<gres_context_cnt; i++) { - if (gres_context[i].unpacked_info) - continue; - debug("gres_plugin_job_state_unpack: no info packed for %s " - "by job %u", - gres_context[i].gres_type, job_id); - rc2 = _job_state_unpack(&gres_data, NULL, - gres_context[i].gres_name); - if (rc2 != SLURM_SUCCESS) { - rc = rc2; - } else { - gres_ptr = xmalloc(sizeof(gres_state_t)); - gres_ptr->plugin_id = gres_context[i].plugin_id; - gres_ptr->gres_data = gres_data; - list_append(*gres_list, gres_ptr); - } + gres_ptr = xmalloc(sizeof(gres_state_t)); + gres_ptr->plugin_id = gres_context[i].plugin_id; + gres_ptr->gres_data = gres_job_ptr; + gres_job_ptr = NULL; /* nothing left to free on error */ + list_append(*gres_list, gres_ptr); } slurm_mutex_unlock(&gres_context_lock); - return rc; unpack_error: error("gres_plugin_job_state_unpack: unpack error from job %u", job_id); - rc = SLURM_ERROR; - goto fini; + if (gres_job_ptr) + _job_state_delete(gres_job_ptr); + slurm_mutex_unlock(&gres_context_lock); + return SLURM_ERROR; } /* If CPU bitmap from slurmd differs in size from that in slurmctld, @@ -3211,7 +3093,6 @@ static void *_step_state_dup(void *gres_data) */ List gres_plugin_step_state_dup(List gres_list) { - int i; ListIterator gres_iter; gres_state_t *gres_ptr, *new_gres_state; List new_gres_list = NULL; @@ -3393,9 +3274,6 @@ extern int gres_plugin_step_state_unpack(List *gres_list, Buf buffer, fatal("list_create malloc failure"); } - for (i=0; i<gres_context_cnt; i++) - gres_context[i].unpacked_info = false; - while ((rc == SLURM_SUCCESS) && (rec_cnt)) { if ((buffer == NULL) || (remaining_buf(buffer) == 0)) break; @@ -3421,7 +3299,6 @@ extern int gres_plugin_step_state_unpack(List *gres_list, Buf buffer, set_buf_offset(buffer, tail_offset); continue; } - gres_context[i].unpacked_info = true; rc2 = _step_state_unpack(&gres_data, buffer, gres_context[i].gres_name); if (rc2 != SLURM_SUCCESS) { @@ -3433,27 +3310,6 @@ extern int gres_plugin_step_state_unpack(List *gres_list, Buf buffer, list_append(*gres_list, gres_ptr); } } - -fini: /* Insure that every gres plugin is called for unpack, even if no data - * was packed by the job. A likely sign that GresPlugins is - * inconsistently configured. */ - for (i=0; i<gres_context_cnt; i++) { - if (gres_context[i].unpacked_info) - continue; - debug("gres_plugin_job_state_unpack: no info packed for %s " - "by step %u.%u", - gres_context[i].gres_type, job_id, step_id); - rc2 = _step_state_unpack(&gres_data, NULL, - gres_context[i].gres_name); - if (rc2 != SLURM_SUCCESS) { - rc = rc2; - } else { - gres_ptr = xmalloc(sizeof(gres_state_t)); - gres_ptr->plugin_id = gres_context[i].plugin_id; - gres_ptr->gres_data = gres_data; - list_append(*gres_list, gres_ptr); - } - } slurm_mutex_unlock(&gres_context_lock); return rc; @@ -3461,8 +3317,8 @@ fini: /* Insure that every gres plugin is called for unpack, even if no data unpack_error: error("gres_plugin_job_state_unpack: unpack error from step %u.%u", job_id, step_id); - rc = SLURM_ERROR; - goto fini; + slurm_mutex_unlock(&gres_context_lock); + return SLURM_ERROR; } static void _step_state_log(void *gres_data, uint32_t job_id, uint32_t step_id,