diff --git a/NEWS b/NEWS index e1291cacd52b332d266f76dd39cd4796983865fa..91c4fa67cab6d8fe8c171c957ee9167a873052ae 100644 --- a/NEWS +++ b/NEWS @@ -361,6 +361,7 @@ documents those changes that are of interest to users and administrators. -- Fix Centos5 compile issues. -- Log Cray MPI job calling exit() without mpi_fini(), but do not treat it as a fatal error. This partially reverts logic added in version 14.03.9. + -- sview - Fix displaying of suspended steps elapsed times. * Changes in Slurm 14.03.10 =========================== diff --git a/src/sview/job_info.c b/src/sview/job_info.c index 1838df6cdaae9ac302a5a7331241d1d8e1ac9494..7ffe07c3c1a16e85c1a10cd31d9b2eb5c3307051 100644 --- a/src/sview/job_info.c +++ b/src/sview/job_info.c @@ -2502,11 +2502,10 @@ static void _get_step_nodelist(job_step_info_t *step_ptr, char *buf, static void _layout_step_record(GtkTreeView *treeview, job_step_info_t *step_ptr, - int update) + int update, bool suspended) { char *uname; char tmp_char[50], tmp_nodes[50], tmp_time[50]; - time_t now_time = time(NULL); GtkTreeIter iter; enum job_states state; GtkTreeStore *treestore = @@ -2551,14 +2550,19 @@ static void _layout_step_record(GtkTreeView *treeview, SORTID_NAME), step_ptr->name); + + if (suspended) + state = JOB_SUSPENDED; + else + state = step_ptr->state; + if (!step_ptr->nodes || !strcasecmp(step_ptr->nodes, "waiting...")) { sprintf(tmp_time,"00:00:00"); snprintf(tmp_nodes, sizeof(tmp_nodes), "waiting..."); state = JOB_PENDING; } else { - now_time -= step_ptr->start_time; - secs2time_str(now_time, tmp_time, sizeof(tmp_time)); + secs2time_str(step_ptr->run_time, tmp_time, sizeof(tmp_time)); _get_step_nodelist(step_ptr, tmp_nodes, sizeof(tmp_nodes)); if (cluster_flags & CLUSTER_FLAG_BGQ) { uint32_t nodes = 0; @@ -2580,7 +2584,6 @@ static void _layout_step_record(GtkTreeView *treeview, find_col_name(display_data_job, SORTID_NODES), tmp_char); - state = JOB_RUNNING; } add_display_treestore_line(update, treestore, &iter, @@ -2625,20 +2628,24 @@ static void _layout_step_record(GtkTreeView *treeview, static void _update_step_record(job_step_info_t *step_ptr, GtkTreeStore *treestore, - GtkTreeIter *iter) + GtkTreeIter *iter, bool suspended) { char *tmp_uname; char tmp_nodes[50]; char tmp_cpu_min[40], tmp_time_run[40], tmp_time_limit[40]; char tmp_node_cnt[40], tmp_time_start[40], tmp_task_cnt[40]; char tmp_step_id[40], tmp_job_id[400]; - time_t now_time = time(NULL); enum job_states state; int color_inx = step_ptr->step_id % sview_colors_cnt; convert_num_unit((float)step_ptr->num_cpus, tmp_cpu_min, sizeof(tmp_cpu_min), UNIT_NONE); + if (suspended) + state = JOB_SUSPENDED; + else + state = step_ptr->state; + if (!step_ptr->nodes || !strcasecmp(step_ptr->nodes,"waiting...")) { sprintf(tmp_time_run, "00:00:00"); @@ -2646,8 +2653,8 @@ static void _update_step_record(job_step_info_t *step_ptr, tmp_node_cnt[0] = '\0'; state = JOB_PENDING; } else { - now_time -= step_ptr->start_time; - secs2time_str(now_time, tmp_time_run, sizeof(tmp_time_run)); + secs2time_str(step_ptr->run_time, + tmp_time_run, sizeof(tmp_time_run)); _get_step_nodelist(step_ptr, tmp_nodes, sizeof(tmp_nodes)); if (cluster_flags & CLUSTER_FLAG_BGQ) { uint32_t nodes = 0; @@ -2665,7 +2672,6 @@ static void _update_step_record(job_step_info_t *step_ptr, tmp_node_cnt, sizeof(tmp_node_cnt), UNIT_NONE); } - state = JOB_RUNNING; } convert_num_unit((float)step_ptr->num_tasks, tmp_task_cnt, @@ -2746,13 +2752,13 @@ static void _append_task_record(sview_job_info_t *sview_job_info_ptr, static void _append_step_record(job_step_info_t *step_ptr, GtkTreeStore *treestore, GtkTreeIter *iter, - int jobid) + int jobid, bool suspended) { GtkTreeIter step_iter; gtk_tree_store_append(treestore, &step_iter, iter); gtk_tree_store_set(treestore, &step_iter, SORTID_POS, jobid, -1); - _update_step_record(step_ptr, treestore, &step_iter); + _update_step_record(step_ptr, treestore, &step_iter, suspended); } static void _handle_task_check(sview_job_info_t *task_ptr, @@ -2919,9 +2925,10 @@ static void _update_info_step(sview_job_info_t *sview_job_info_ptr, g_free(tmp_stepid); if (stepid == (int)step_ptr->step_id) { /* update with new info */ - _update_step_record(step_ptr, - GTK_TREE_STORE(model), - step_iter); + _update_step_record( + step_ptr, GTK_TREE_STORE(model), + step_iter, IS_JOB_SUSPENDED( + sview_job_info_ptr->job_ptr)); goto found; } @@ -2932,7 +2939,9 @@ static void _update_info_step(sview_job_info_t *sview_job_info_ptr, } adding: _append_step_record(step_ptr, GTK_TREE_STORE(model), - iter, sview_job_info_ptr->job_ptr->job_id); + iter, sview_job_info_ptr->job_ptr->job_id, + IS_JOB_SUSPENDED( + sview_job_info_ptr->job_ptr)); found: ; } @@ -3375,8 +3384,11 @@ need_refresh: color_set_flag, false, 0); xfree(color_inx); xfree(color_set_flag); - _layout_step_record(treeview, - step_ptr, update); + + _layout_step_record( + treeview, step_ptr, update, + IS_JOB_SUSPENDED( + sview_job_info->job_ptr)); found = 1; break; } @@ -3551,7 +3563,9 @@ extern int get_new_info_job_step(job_step_info_response_msg_t **info_ptr, */ show_flags |= SHOW_ALL; if (g_step_info_ptr) { - error_code = slurm_get_job_steps(g_step_info_ptr->last_update, + /* Use a last_update time of NULL so that we can get an updated + * run_time for jobs rather than just its start_time */ + error_code = slurm_get_job_steps((time_t) NULL, NO_VAL, NO_VAL, &new_step_ptr, show_flags); if (error_code == SLURM_SUCCESS) { @@ -3839,7 +3853,7 @@ extern void get_info_job(GtkTable *table, display_data_t *display_data) force_refresh)) == SLURM_NO_CHANGE_IN_DATA){ if ((!display_widget || view == ERROR_VIEW) - || (job_error_code != SLURM_NO_CHANGE_IN_DATA)) + || (step_error_code != SLURM_NO_CHANGE_IN_DATA)) goto display_it; } else if (step_error_code != SLURM_SUCCESS) { if (view == ERROR_VIEW) @@ -4013,7 +4027,7 @@ extern void specific_info_job(popup_info_t *popup_win) == SLURM_NO_CHANGE_IN_DATA) { if ((!spec_info->display_widget || spec_info->view == ERROR_VIEW) - || (job_error_code != SLURM_NO_CHANGE_IN_DATA)) + || (step_error_code != SLURM_NO_CHANGE_IN_DATA)) goto display_it; } else if (step_error_code != SLURM_SUCCESS) { if (spec_info->view == ERROR_VIEW)