static void _print_burst_buffer_resv(FILE *out, burst_buffer_resv_t* burst_buffer_ptr, int one_liner, bool verbose) { char sz_buf[32], time_buf[64], tmp_line[512]; char *out_buf = NULL; /****** Line 1 ******/ if (burst_buffer_ptr->job_id && (burst_buffer_ptr->array_task_id == NO_VAL)) { snprintf(tmp_line, sizeof(tmp_line), " JobID=%u ", burst_buffer_ptr->job_id); } else if (burst_buffer_ptr->job_id) { snprintf(tmp_line, sizeof(tmp_line), " JobID=%u_%u(%u) ", burst_buffer_ptr->array_job_id, burst_buffer_ptr->array_task_id, burst_buffer_ptr->job_id); } else { snprintf(tmp_line, sizeof(tmp_line), " Name=%s ", burst_buffer_ptr->name); } xstrcat(out_buf, tmp_line); _get_size_str(sz_buf, sizeof(sz_buf), burst_buffer_ptr->size); if (burst_buffer_ptr->create_time) { slurm_make_time_str(&burst_buffer_ptr->create_time, time_buf, sizeof(time_buf)); } else { time_t now = time(NULL); slurm_make_time_str(&now, time_buf, sizeof(time_buf)); } if (verbose) { snprintf(tmp_line, sizeof(tmp_line), "Account=%s CreateTime=%s Partition=%s Pool=%s QOS=%s " "Size=%s State=%s UserID=%s(%u)", burst_buffer_ptr->account, time_buf, burst_buffer_ptr->partition, burst_buffer_ptr->pool, burst_buffer_ptr->qos, sz_buf, bb_state_string(burst_buffer_ptr->state), uid_to_string(burst_buffer_ptr->user_id), burst_buffer_ptr->user_id); } else { snprintf(tmp_line, sizeof(tmp_line), "CreateTime=%s Pool=%s Size=%s State=%s UserID=%s(%u)", time_buf, burst_buffer_ptr->pool, sz_buf, bb_state_string(burst_buffer_ptr->state), uid_to_string(burst_buffer_ptr->user_id), burst_buffer_ptr->user_id); } xstrcat(out_buf, tmp_line); xstrcat(out_buf, "\n"); fprintf(out, "%s", out_buf); xfree(out_buf); }
/* updates the burst buffer record on sview */ static void _update_bb_record(sview_bb_info_t *sview_bb_info_ptr, GtkTreeStore *treestore) { char tmp_create_time[40]; char tmp_size[20], tmp_user_id[60], bb_name_id[32]; char *tmp_state, *tmp_user_name; burst_buffer_resv_t *bb_ptr = sview_bb_info_ptr->bb_ptr; if (bb_ptr->name) { strncpy(bb_name_id, bb_ptr->name, sizeof(bb_name_id)); } else if (bb_ptr->array_task_id == NO_VAL) { convert_num_unit(bb_ptr->job_id, bb_name_id, sizeof(bb_name_id), UNIT_NONE, working_sview_config.convert_flags); } else { snprintf(bb_name_id, sizeof(bb_name_id), "%u_%u(%u)", bb_ptr->array_job_id, bb_ptr->array_task_id, bb_ptr->job_id); } if (bb_ptr->create_time) { slurm_make_time_str((time_t *)&bb_ptr->create_time, tmp_create_time, sizeof(tmp_create_time)); } else { time_t now = time(NULL); slurm_make_time_str(&now, tmp_create_time, sizeof(tmp_create_time)); } _get_size_str(tmp_size, sizeof(tmp_size), bb_ptr->size); tmp_state = bb_state_string(bb_ptr->state); tmp_user_name = uid_to_string(bb_ptr->user_id); snprintf(tmp_user_id, sizeof(tmp_user_id), "%s(%u)", tmp_user_name, bb_ptr->user_id); xfree(tmp_user_name); /* Combining these records provides a slight performance improvement */ gtk_tree_store_set(treestore, &sview_bb_info_ptr->iter_ptr, SORTID_COLOR, sview_colors[sview_bb_info_ptr->color_inx], SORTID_COLOR_INX, sview_bb_info_ptr->color_inx, SORTID_PLUGIN, sview_bb_info_ptr->plugin, SORTID_ACCOUNT, bb_ptr->account, SORTID_CREATE_TIME, tmp_create_time, SORTID_NAME, bb_name_id, SORTID_PARTITION, bb_ptr->partition, SORTID_POOL, bb_ptr->pool, SORTID_QOS, bb_ptr->qos, SORTID_SIZE, tmp_size, SORTID_STATE, tmp_state, SORTID_UPDATED, 1, SORTID_USERID, tmp_user_id, -1); return; }
/* Log the contents of a bb_job_t record using "info()" */ extern void bb_job_log(bb_state_t *state_ptr, bb_job_t *bb_job) { bb_buf_t *buf_ptr; char *out_buf = NULL; int i; if (bb_job) { xstrfmtcat(out_buf, "%s: Job:%u UserID:%u ", state_ptr->name, bb_job->job_id, bb_job->user_id); xstrfmtcat(out_buf, "Swap:%ux%u ", bb_job->swap_size, bb_job->swap_nodes); xstrfmtcat(out_buf, "TotalSize:%"PRIu64"", bb_job->total_size); info("%s", out_buf); xfree(out_buf); for (i = 0, buf_ptr = bb_job->buf_ptr; i < bb_job->buf_cnt; i++, buf_ptr++) { if (buf_ptr->create) { info(" Create Name:%s Pool:%s Size:%"PRIu64 " Access:%s Type:%s State:%s", buf_ptr->name, buf_ptr->pool, buf_ptr->size, buf_ptr->access, buf_ptr->type, bb_state_string(buf_ptr->state)); } else if (buf_ptr->destroy) { info(" Destroy Name:%s Hurry:%d", buf_ptr->name, (int) buf_ptr->hurry); } else { info(" Use Name:%s", buf_ptr->name); } } } }
static int _parse_job_info(void **dest, slurm_parser_enum_t type, const char *key, const char *value, const char *line, char **leftover) { s_p_hashtbl_t *job_tbl; char *name = NULL, *tmp = NULL, local_name[64] = ""; uint64_t size = 0; uint32_t job_id = 0, user_id = 0; uint16_t state = 0; bb_alloc_t *bb_ptr; struct job_record *job_ptr = NULL; bb_job_t *bb_spec; static s_p_options_t _job_options[] = { {"JobID",S_P_STRING}, {"Name", S_P_STRING}, {"Size", S_P_STRING}, {"State", S_P_STRING}, {NULL} }; *dest = NULL; user_id = strtol(value, NULL, 10); job_tbl = s_p_hashtbl_create(_job_options); s_p_parse_line(job_tbl, *leftover, leftover); if (s_p_get_string(&tmp, "JobID", job_tbl)) { job_id = strtol(tmp, NULL, 10); xfree(tmp); } if (s_p_get_string(&name, "Name", job_tbl)) { snprintf(local_name, sizeof(local_name), "%s", name); xfree(name); } if (s_p_get_string(&tmp, "Size", job_tbl)) { size = bb_get_size_num(tmp, bb_state.bb_config.granularity); xfree(tmp); } if (s_p_get_string(&tmp, "State", job_tbl)) { state = bb_state_num(tmp); xfree(tmp); } s_p_hashtbl_destroy(job_tbl); #if 0 info("%s: JobID:%u Name:%s Size:%"PRIu64" State:%u UserID:%u", __func__, job_id, local_name, size, state, user_id); #endif if (job_id) { job_ptr = find_job_record(job_id); if (!job_ptr && (state == BB_STATE_STAGED_OUT)) { struct job_record job_rec; job_rec.job_id = job_id; job_rec.user_id = user_id; bb_ptr = bb_find_alloc_rec(&bb_state, &job_rec); _stop_stage_out(job_id); /* Purge buffer */ if (bb_ptr) { bb_ptr->cancelled = true; bb_ptr->end_time = 0; } else { /* Slurm knows nothing about this job, * may be result of slurmctld cold start */ error("%s: Vestigial buffer for purged job %u", plugin_type, job_id); } return SLURM_SUCCESS; } else if (!job_ptr && ((state == BB_STATE_STAGING_IN) || (state == BB_STATE_STAGED_IN))) { struct job_record job_rec; job_rec.job_id = job_id; job_rec.user_id = user_id; bb_ptr = bb_find_alloc_rec(&bb_state, &job_rec); _stop_stage_in(job_id); /* Purge buffer */ if (bb_ptr) { bb_ptr->cancelled = true; bb_ptr->end_time = 0; } else { /* Slurm knows nothing about this job, * may be result of slurmctld cold start */ error("%s: Vestigial buffer for purged job %u", plugin_type, job_id); } return SLURM_SUCCESS; } else if (!job_ptr) { error("%s: Vestigial buffer for job ID %u. " "Clear manually", plugin_type, job_id); } snprintf(local_name, sizeof(local_name), "VestigialJob%u", job_id); } if (job_ptr) { bb_ptr = bb_find_alloc_rec(&bb_state, job_ptr); if (bb_ptr == NULL) { bb_spec = xmalloc(sizeof(bb_job_t)); bb_spec->total_size = _get_bb_size(job_ptr); bb_ptr = bb_alloc_job_rec(&bb_state, job_ptr, bb_spec); xfree(bb_spec); bb_ptr->state = state; /* bb_ptr->state_time set in bb_alloc_job_rec() */ } } else { if ((bb_ptr = _find_bb_name_rec(local_name, user_id)) == NULL) { bb_ptr = bb_alloc_name_rec(&bb_state, local_name, user_id); bb_ptr->size = size; bb_ptr->state = state; //FIXME: VESTIGIAL: Use bb_limit_add // bb_add_user_load(bb_ptr, &bb_state); return SLURM_SUCCESS; } } bb_ptr->seen_time = time(NULL); /* used to purge defunct recs */ /* UserID set to 0 on some failure modes */ if ((bb_ptr->user_id != user_id) && (user_id != 0)) { error("%s: User ID mismatch (%u != %u). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_ptr->user_id, user_id, bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); } if ((bb_ptr->state == BB_STATE_RUNNING) && (state == BB_STATE_STAGED_IN)) state = BB_STATE_RUNNING; /* More precise state info */ if (bb_ptr->state != state) { /* State is subject to real-time changes */ debug("%s: State changed (%s to %s). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_state_string(bb_ptr->state), bb_state_string(state), bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); bb_ptr->state = state; bb_ptr->state_time = time(NULL); if (bb_ptr->state == BB_STATE_STAGED_OUT) { if (bb_ptr->size != 0) { //FIXME: VESTIGIAL: Use bb_limit_rem // bb_remove_user_load(bb_ptr, &bb_state); bb_ptr->size = 0; } } if (bb_ptr->state == BB_STATE_STAGED_IN) queue_job_scheduler(); } if ((bb_ptr->state != BB_STATE_STAGED_OUT) && (bb_ptr->size != size)) { //FIXME: VESTIGIAL: Use bb_limit_rem // bb_remove_user_load(bb_ptr, &bb_state); if (size != 0) { error("%s: Size mismatch (%"PRIu64" != %"PRIu64"). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_ptr->size, size, bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); } bb_ptr->size = MAX(bb_ptr->size, size); //FIXME: VESTIGIAL: Use bb_limit_add // bb_add_user_load(bb_ptr, &bb_state); } return SLURM_SUCCESS; }
/* Function creates the record menu when you double click on a record */ static void _layout_bb_record(GtkTreeView *treeview, sview_bb_info_t *sview_bb_info, int update) { GtkTreeIter iter; char time_buf[20], tmp_user_id[60], tmp_size[20]; char bb_name_id[32]; char *tmp_state, *tmp_user_name; burst_buffer_resv_t *bb_ptr = sview_bb_info->bb_ptr; GtkTreeStore *treestore; treestore = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); if (bb_ptr->name) { strncpy(bb_name_id, bb_ptr->name, sizeof(bb_name_id)); } else if (bb_ptr->array_task_id == NO_VAL) { convert_num_unit(bb_ptr->job_id, bb_name_id, sizeof(bb_name_id), UNIT_NONE, working_sview_config.convert_flags); } else { snprintf(bb_name_id, sizeof(bb_name_id), "%u_%u(%u)", bb_ptr->array_job_id, bb_ptr->array_task_id, bb_ptr->job_id); } add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_NAME), bb_name_id); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_PLUGIN), sview_bb_info->plugin); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_ACCOUNT), bb_ptr->account); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_PARTITION), bb_ptr->partition); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_POOL), bb_ptr->pool); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_QOS), bb_ptr->qos); tmp_state = bb_state_string(bb_ptr->state); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_STATE), tmp_state); _get_size_str(tmp_size, sizeof(tmp_size), bb_ptr->size); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_SIZE), tmp_size); if (bb_ptr->create_time) { slurm_make_time_str((time_t *)&bb_ptr->create_time, time_buf, sizeof(time_buf)); } else { time_t now = time(NULL); slurm_make_time_str(&now, time_buf, sizeof(time_buf)); } add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_CREATE_TIME), time_buf); tmp_user_name = uid_to_string(bb_ptr->user_id); snprintf(tmp_user_id, sizeof(tmp_user_id), "%s(%u)", tmp_user_name, bb_ptr->user_id); xfree(tmp_user_name); add_display_treestore_line(update, treestore, &iter, find_col_name(display_data_bb, SORTID_USERID), tmp_user_id); }
static int _parse_job_info(void **dest, slurm_parser_enum_t type, const char *key, const char *value, const char *line, char **leftover) { s_p_hashtbl_t *job_tbl; char *name = NULL, *tmp = NULL, tmp_name[64]; uint32_t job_id = 0, size = 0, user_id = 0; uint16_t state = 0; bb_alloc_t *bb_ptr; struct job_record *job_ptr = NULL; static s_p_options_t _job_options[] = { {"JobID",S_P_STRING}, {"Name", S_P_STRING}, {"Size", S_P_STRING}, {"State", S_P_STRING}, {NULL} }; *dest = NULL; user_id = atoi(value); job_tbl = s_p_hashtbl_create(_job_options); s_p_parse_line(job_tbl, *leftover, leftover); if (s_p_get_string(&tmp, "JobID", job_tbl)) job_id = atoi(tmp); s_p_get_string(&name, "Name", job_tbl); if (s_p_get_string(&tmp, "Size", job_tbl)) size = _get_size_num(tmp); if (s_p_get_string(&tmp, "State", job_tbl)) state = bb_state_num(tmp); #if 1 info("%s: JobID:%u Name:%s Size:%u State:%u UserID:%u", __func__, job_id, name, size, state, user_id); #endif if (job_id) { job_ptr = find_job_record(job_id); if (!job_ptr) { error("%s: Vestigial buffer for job ID %u. " "Clear manually", plugin_type, job_id); } snprintf(tmp_name, sizeof(tmp_name), "VestigialJob%u", job_id); job_id = 0; name = tmp_name; } if (job_ptr) { if ((bb_ptr = _find_bb_job_rec(job_ptr)) == NULL) { bb_ptr = _alloc_bb_job_rec(job_ptr); bb_ptr->state = state; } } else { if ((bb_ptr = _find_bb_name_rec(name, user_id)) == NULL) { bb_ptr = _alloc_bb_name_rec(name, user_id); bb_ptr->size = size; bb_ptr->state = state; return SLURM_SUCCESS; } } if (bb_ptr->user_id != user_id) { error("%s: User ID mismatch (%u != %u). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_ptr->user_id, user_id, bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); } if (bb_ptr->size != size) { error("%s: Size mismatch (%u != %u). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_ptr->size, size, bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); bb_ptr->size = MAX(bb_ptr->size, size); } if (bb_ptr->state != state) { /* State is subject to real-time changes */ debug("%s: State mismatch (%s != %s). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_state_string(bb_ptr->state), bb_state_string(state), bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); } return SLURM_SUCCESS; }