Skip to content
Snippets Groups Projects
Commit b7410c4f authored by Danny Auble's avatar Danny Auble
Browse files

sview - speed up logic for large numbers of front end nodes

parent 69d3fa54
No related branches found
No related tags found
No related merge requests found
...@@ -36,9 +36,13 @@ ...@@ -36,9 +36,13 @@
/* Collection of data for printing reports. Like data is combined here */ /* Collection of data for printing reports. Like data is combined here */
typedef struct { typedef struct {
int color_inx; int color_inx;
char *front_end_name;
front_end_info_t *front_end_ptr; front_end_info_t *front_end_ptr;
GtkTreeIter iter_ptr;
bool iter_set;
char *boot_time; char *boot_time;
int node_inx[3]; int node_inx[3];
int pos;
char *reason; char *reason;
char *slurmd_start_time; char *slurmd_start_time;
char *state; char *state;
...@@ -68,6 +72,7 @@ enum { ...@@ -68,6 +72,7 @@ enum {
SORTID_REASON, SORTID_REASON,
SORTID_SLURMD_START_TIME, SORTID_SLURMD_START_TIME,
SORTID_STATE, SORTID_STATE,
SORTID_UPDATED,
SORTID_CNT SORTID_CNT
}; };
...@@ -109,6 +114,8 @@ static display_data_t display_data_front_end[] = { ...@@ -109,6 +114,8 @@ static display_data_t display_data_front_end[] = {
refresh_front_end, create_model_front_end, admin_edit_front_end}, refresh_front_end, create_model_front_end, admin_edit_front_end},
{G_TYPE_POINTER, SORTID_NODE_INX, NULL, FALSE, EDIT_NONE, {G_TYPE_POINTER, SORTID_NODE_INX, NULL, FALSE, EDIT_NONE,
refresh_front_end, create_model_front_end, admin_edit_front_end}, refresh_front_end, create_model_front_end, admin_edit_front_end},
{G_TYPE_INT, SORTID_UPDATED, NULL, FALSE, EDIT_NONE,
refresh_resv, create_model_resv, admin_edit_resv},
{G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE}
}; };
...@@ -132,16 +139,23 @@ static void _admin_front_end(GtkTreeModel *model, GtkTreeIter *iter, char *type, ...@@ -132,16 +139,23 @@ static void _admin_front_end(GtkTreeModel *model, GtkTreeIter *iter, char *type,
static void _process_each_front_end(GtkTreeModel *model, GtkTreePath *path, static void _process_each_front_end(GtkTreeModel *model, GtkTreePath *path,
GtkTreeIter*iter, gpointer userdata); GtkTreeIter*iter, gpointer userdata);
static void _front_end_info_list_del(void *object) static void _front_end_info_free(sview_front_end_info_t *sview_front_end_info)
{ {
sview_front_end_info_t *sview_front_end_info;
sview_front_end_info = (sview_front_end_info_t *)object;
if (sview_front_end_info) { if (sview_front_end_info) {
xfree(sview_front_end_info->boot_time); xfree(sview_front_end_info->boot_time);
xfree(sview_front_end_info->reason); xfree(sview_front_end_info->reason);
xfree(sview_front_end_info->slurmd_start_time); xfree(sview_front_end_info->slurmd_start_time);
xfree(sview_front_end_info->state); xfree(sview_front_end_info->state);
}
}
static void _front_end_info_list_del(void *object)
{
sview_front_end_info_t *sview_front_end_info;
sview_front_end_info = (sview_front_end_info_t *)object;
if (sview_front_end_info) {
_front_end_info_free(sview_front_end_info);
xfree(sview_front_end_info); xfree(sview_front_end_info);
} }
} }
...@@ -210,15 +224,14 @@ static void _layout_front_end_record(GtkTreeView *treeview, ...@@ -210,15 +224,14 @@ static void _layout_front_end_record(GtkTreeView *treeview,
static void _update_front_end_record( static void _update_front_end_record(
sview_front_end_info_t *sview_front_end_info_ptr, sview_front_end_info_t *sview_front_end_info_ptr,
GtkTreeStore *treestore, GtkTreeStore *treestore)
GtkTreeIter *iter)
{ {
front_end_info_t *front_end_ptr; front_end_info_t *front_end_ptr;
front_end_ptr = sview_front_end_info_ptr->front_end_ptr; front_end_ptr = sview_front_end_info_ptr->front_end_ptr;
/* Combining these records provides a slight performance improvement */ /* Combining these records provides a slight performance improvement */
gtk_tree_store_set(treestore, iter, gtk_tree_store_set(treestore, &sview_front_end_info_ptr->iter_ptr,
SORTID_ALLOW_GROUPS, front_end_ptr->allow_groups, SORTID_ALLOW_GROUPS, front_end_ptr->allow_groups,
SORTID_ALLOW_USERS, front_end_ptr->allow_users, SORTID_ALLOW_USERS, front_end_ptr->allow_users,
SORTID_BOOT_TIME, SORTID_BOOT_TIME,
...@@ -236,6 +249,7 @@ static void _update_front_end_record( ...@@ -236,6 +249,7 @@ static void _update_front_end_record(
SORTID_SLURMD_START_TIME, SORTID_SLURMD_START_TIME,
sview_front_end_info_ptr->slurmd_start_time, sview_front_end_info_ptr->slurmd_start_time,
SORTID_STATE, sview_front_end_info_ptr->state, SORTID_STATE, sview_front_end_info_ptr->state,
SORTID_UPDATED, 1,
-1); -1);
return; return;
...@@ -243,77 +257,58 @@ static void _update_front_end_record( ...@@ -243,77 +257,58 @@ static void _update_front_end_record(
static void _append_front_end_record( static void _append_front_end_record(
sview_front_end_info_t *sview_front_end_info_ptr, sview_front_end_info_t *sview_front_end_info_ptr,
GtkTreeStore *treestore, GtkTreeIter *iter, GtkTreeStore *treestore)
int line)
{ {
gtk_tree_store_append(treestore, iter, NULL); gtk_tree_store_append(treestore, &sview_front_end_info_ptr->iter_ptr,
gtk_tree_store_set(treestore, iter, SORTID_POS, line, -1); NULL);
_update_front_end_record(sview_front_end_info_ptr, treestore, iter); gtk_tree_store_set(treestore, &sview_front_end_info_ptr->iter_ptr,
SORTID_POS, sview_front_end_info_ptr->pos, -1);
_update_front_end_record(sview_front_end_info_ptr, treestore);
} }
static void _update_info_front_end(List info_list, GtkTreeView *tree_view) static void _update_info_front_end(List info_list, GtkTreeView *tree_view)
{ {
GtkTreePath *path = gtk_tree_path_new_first();
GtkTreeModel *model = gtk_tree_view_get_model(tree_view); GtkTreeModel *model = gtk_tree_view_get_model(tree_view);
GtkTreeIter iter; static GtkTreeModel *last_model = NULL;
front_end_info_t *front_end_ptr = NULL; char *name;
int line = 0;
char *host = NULL, *front_end_name = NULL;
ListIterator itr = NULL; ListIterator itr = NULL;
sview_front_end_info_t *sview_front_end_info = NULL; sview_front_end_info_t *sview_front_end_info = NULL;
/* get the iter, or find out the list is empty goto add */ set_for_update(model, SORTID_UPDATED);
if (gtk_tree_model_get_iter(model, &iter, path)) {
/* make sure all the reserves are still here */
while (1) {
if (!gtk_tree_model_iter_next(model, &iter)) {
break;
}
}
}
itr = list_iterator_create(info_list); itr = list_iterator_create(info_list);
while ((sview_front_end_info = list_next(itr))) { while ((sview_front_end_info = list_next(itr))) {
front_end_ptr = sview_front_end_info->front_end_ptr; /* This means the tree_store changed (added new column
/* get the iter, or find out the list is empty goto add */ or something). */
if (!gtk_tree_model_get_iter(model, &iter, path)) { if (last_model != model)
goto adding; sview_front_end_info->iter_set = false;
}
line = 0; if (sview_front_end_info->iter_set) {
while (1) { gtk_tree_model_get(model,
/* search for the jobid and check to see if &sview_front_end_info->iter_ptr,
it is in the list */ SORTID_NAME, &name, -1);
gtk_tree_model_get(model, &iter, SORTID_NAME, if (strcmp(name,
&front_end_name, -1); sview_front_end_info->front_end_name)) {
if (!strcmp(front_end_name, front_end_ptr->name)) { /* Bad pointer */
/* update with new info */ sview_front_end_info->iter_set = false;
g_free(front_end_name); //g_print("bad front_end iter pointer\n");
_update_front_end_record(sview_front_end_info,
GTK_TREE_STORE(model),
&iter);
goto found;
}
g_free(front_end_name);
line++;
if (!gtk_tree_model_iter_next(model, &iter)) {
break;
} }
g_free(name);
}
if (sview_front_end_info->iter_set)
_update_front_end_record(sview_front_end_info,
GTK_TREE_STORE(model));
else {
_append_front_end_record(sview_front_end_info,
GTK_TREE_STORE(model));
sview_front_end_info->iter_set = true;
} }
adding:
_append_front_end_record(sview_front_end_info,
GTK_TREE_STORE(model),
&iter, line);
found:
;
} }
list_iterator_destroy(itr); list_iterator_destroy(itr);
if (host)
free(host);
gtk_tree_path_free(path); /* remove all old front_ends */
remove_old(model, SORTID_UPDATED);
return; last_model = model;
} }
static List _create_front_end_info_list( static List _create_front_end_info_list(
...@@ -322,6 +317,8 @@ static List _create_front_end_info_list( ...@@ -322,6 +317,8 @@ static List _create_front_end_info_list(
char *upper = NULL; char *upper = NULL;
char user[32], time_str[32]; char user[32], time_str[32];
static List info_list = NULL; static List info_list = NULL;
List last_list = NULL;
ListIterator last_list_itr = NULL;
int i = 0; int i = 0;
sview_front_end_info_t *sview_front_end_info_ptr = NULL; sview_front_end_info_t *sview_front_end_info_ptr = NULL;
front_end_info_t *front_end_ptr = NULL; front_end_info_t *front_end_ptr = NULL;
...@@ -330,19 +327,40 @@ static List _create_front_end_info_list( ...@@ -330,19 +327,40 @@ static List _create_front_end_info_list(
goto update_color; goto update_color;
if (info_list) if (info_list)
list_flush(info_list); last_list = info_list;
else
info_list = list_create(_front_end_info_list_del);
info_list = list_create(_front_end_info_list_del);
if (!info_list) { if (!info_list) {
g_print("malloc error\n"); g_print("malloc error\n");
return NULL; return NULL;
} }
if (last_list)
last_list_itr = list_iterator_create(last_list);
for (i = 0; i < front_end_info_ptr->record_count; i++) { for (i = 0; i < front_end_info_ptr->record_count; i++) {
front_end_ptr = &(front_end_info_ptr->front_end_array[i]); front_end_ptr = &(front_end_info_ptr->front_end_array[i]);
sview_front_end_info_ptr =
xmalloc(sizeof(sview_front_end_info_t)); sview_front_end_info_ptr = NULL;
if (last_list_itr) {
while ((sview_front_end_info_ptr =
list_next(last_list_itr))) {
if (!strcmp(sview_front_end_info_ptr->
front_end_name,
front_end_ptr->name)) {
list_remove(last_list_itr);
_front_end_info_free(
sview_front_end_info_ptr);
break;
}
}
list_iterator_reset(last_list_itr);
}
if (!sview_front_end_info_ptr)
sview_front_end_info_ptr =
xmalloc(sizeof(sview_front_end_info_t));
sview_front_end_info_ptr->pos = i;
sview_front_end_info_ptr->front_end_name = front_end_ptr->name;
sview_front_end_info_ptr->front_end_ptr = front_end_ptr; sview_front_end_info_ptr->front_end_ptr = front_end_ptr;
sview_front_end_info_ptr->color_inx = i % sview_colors_cnt; sview_front_end_info_ptr->color_inx = i % sview_colors_cnt;
if (g_node_info_ptr) { if (g_node_info_ptr) {
...@@ -390,6 +408,11 @@ static List _create_front_end_info_list( ...@@ -390,6 +408,11 @@ static List _create_front_end_info_list(
list_append(info_list, sview_front_end_info_ptr); list_append(info_list, sview_front_end_info_ptr);
} }
if (last_list) {
list_iterator_destroy(last_list_itr);
list_destroy(last_list);
}
update_color: update_color:
return info_list; return info_list;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment