From bdb8114cd810a4b3a7b2a936cab7cc1de107b347 Mon Sep 17 00:00:00 2001
From: Marius Tolzmann <tolzmann@molgen.mpg.de>
Date: Tue, 3 Nov 2015 23:21:03 +0100
Subject: [PATCH] mxqd_control: Track database values for global running slots
 and jobs

---
 mxqd.c         | 10 ++++++++--
 mxqd.h         |  9 +++++++++
 mxqd_control.c | 28 ++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/mxqd.c b/mxqd.c
index 91134842..38a22895 100644
--- a/mxqd.c
+++ b/mxqd.c
@@ -1336,13 +1336,16 @@ void server_dump(struct mxq_server *server)
             continue;
         }
         group = &ulist->groups[0].group;
-        mx_log_info("    user=%s(%d) slots_running=%lu",
+        mx_log_info("    user=%s(%d) slots_running=%lu global_slots_running=%lu global_threads_running=%lu",
                 group->user_name,
                 group->user_uid,
-                ulist->slots_running);
+                ulist->slots_running,
+                ulist->global_slots_running,
+                ulist->global_threads_running);
 
         for (glist = ulist->groups; glist; glist = glist->next) {
             group = &glist->group;
+
             mx_log_info("        group=%s(%d):%lu %s jobs_in_q=%lu",
                 group->user_name,
                 group->user_uid,
@@ -1369,6 +1372,9 @@ void server_dump(struct mxq_server *server)
                 server->slots,
                 server->threads_running,
                 server->jobs_running);
+    mx_log_info("global_slots_running=%lu global_threads_running=%lu",
+                server->global_slots_running,
+                server->global_threads_running);
     cpuset_log("cpu set running",
                 &server->cpu_set_running);
     mx_log_info("====================== SERVER DUMP END ======================");
diff --git a/mxqd.h b/mxqd.h
index 8b115a99..82ce6be8 100644
--- a/mxqd.h
+++ b/mxqd.h
@@ -39,6 +39,9 @@ struct mxq_group_list {
     unsigned long slots_running;
     unsigned long memory_used;
 
+    unsigned long global_threads_running;
+    unsigned long global_slots_running;
+
     short orphaned;
 };
 
@@ -54,6 +57,9 @@ struct mxq_user_list {
     unsigned long threads_running;
     unsigned long slots_running;
     unsigned long memory_used;
+
+    unsigned long global_threads_running;
+    unsigned long global_slots_running;
 };
 
 struct mxq_server {
@@ -69,6 +75,9 @@ struct mxq_server {
     unsigned long memory_used;
     cpu_set_t      cpu_set_running;
 
+    unsigned long global_threads_running;
+    unsigned long global_slots_running;
+
     unsigned long slots;
     unsigned long memory_total;
     long double   memory_avg_per_slot;
diff --git a/mxqd_control.c b/mxqd_control.c
index 9055f434..20a29c95 100644
--- a/mxqd_control.c
+++ b/mxqd_control.c
@@ -323,6 +323,15 @@ struct mxq_group_list *_user_list_add_group(struct mxq_user_list *ulist, struct
     ulist->group_cnt++;
     server->group_cnt++;
 
+    glist->global_slots_running   = group->group_slots_running;
+    glist->global_threads_running = group->group_jobs_running * group->job_threads;
+
+    ulist->global_slots_running   += glist->global_slots_running;
+    ulist->global_threads_running += glist->global_threads_running;
+
+    server->global_slots_running   += glist->global_slots_running;
+    server->global_threads_running += glist->global_threads_running;
+
     _group_list_init(glist);
 
     return glist;
@@ -354,15 +363,34 @@ struct mxq_group_list *_server_add_group(struct mxq_server *server, struct mxq_g
 static struct mxq_group_list *_user_list_update_group(struct mxq_user_list *ulist, struct mxq_group *group)
 {
     struct mxq_group_list *glist;
+    struct mxq_server *server;
 
     assert(ulist);
     assert(group);
+    assert(ulist->server);
+
+    server = ulist->server;
 
     glist = _group_list_find_by_group(ulist->groups, group);
     if (!glist) {
         return _user_list_add_group(ulist, group);
     }
 
+    server->global_slots_running   -= glist->global_slots_running;
+    server->global_threads_running -= glist->global_threads_running;
+
+    ulist->global_slots_running   -= glist->global_slots_running;
+    ulist->global_threads_running -= glist->global_threads_running;
+
+    glist->global_slots_running   = group->group_slots_running;
+    glist->global_threads_running = group->group_jobs_running * group->job_threads;
+
+    ulist->global_slots_running   += glist->global_slots_running;
+    ulist->global_threads_running += glist->global_threads_running;
+
+    server->global_slots_running   += glist->global_slots_running;
+    server->global_threads_running += glist->global_threads_running;
+
     mxq_group_free_content(&glist->group);
 
     memcpy(&glist->group, group, sizeof(*group));