]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r1909429 and r1909606 from trunk:
authorRainer Jung <rjung@apache.org>
Thu, 24 Aug 2023 10:09:45 +0000 (10:09 +0000)
committerRainer Jung <rjung@apache.org>
Thu, 24 Aug 2023 10:09:45 +0000 (10:09 +0000)
mod_status: Remove duplicate keys "BusyWorkers" and "IdleWorkers".

Resolve inconsistency between the previous two occurrences by
counting workers in state SERVER_GRACEFUL no longer as busy,
but instead in a new counter "GracefulWorkers" (or on HTML
view as "workers gracefully restarting"). Also add the graceful
counter as a new column to the existing HTML per process table
for async MPMs.

PR 63300
Submitted by: rjung
Reviewed by: rjung, jorton, icing

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1911892 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
modules/generators/mod_status.c

diff --git a/CHANGES b/CHANGES
index 014bd7c58bac9a0d54f81858a92d986bad0725d0..744aaf14f8026ec84336812b057127fe08d2fbd5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,14 @@ Changes with Apache 2.4.58
 
   *) core: Optimize send_brigade_nonblocking(). [Yann Ylavic, Christophe Jaillet]
 
+  *) mod_status: Remove duplicate keys "BusyWorkers" and "IdleWorkers".
+     Resolve inconsistency between the previous two occurrences by
+     counting workers in state SERVER_GRACEFUL no longer as busy,
+     but instead in a new counter "GracefulWorkers" (or on HTML
+     view as "workers gracefully restarting"). Also add the graceful
+     counter as a new column to the existing HTML per process table
+     for async MPMs. PR 63300. [Rainer Jung]
+
 Changes with Apache 2.4.57
 
   *) mod_proxy: Check before forwarding that a nocanon path has not been
diff --git a/STATUS b/STATUS
index c09bee00ff16808802ecdfddb7bcb389f2e19652..000718c122124ec2bc7179fc6837c0675572b4a2 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -162,21 +162,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
        svn merge -c 1861542,r1861569 ^/httpd/httpd/trunk .
      +1: minfrin, covener, icing
 
-  *) mod_status: Remove duplicate keys "BusyWorkers" and "IdleWorkers".
-     Resolve inconsistency between the previous two occurrences by
-     counting workers in state SERVER_GRACEFUL no longer as busy,
-     but instead in a new counter "GracefulWorkers" (or on HTML
-     view as "workers gracefully restarting"). Also add the graceful
-     counter as a new column to the existing HTML per process table
-     for async MPMs.
-     PR 63300
-     Trunk version of patch:
-        https://svn.apache.org/r1909429
-        https://svn.apache.org/r1909606
-     Backport version for 2.4.x of patch:
-        svn merge -c r1909429,r1909606 ^/httpd/httpd/trunk .
-     +1: rjung, jorton, icing
-
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
   [ New proposals should be added at the end of the list ]
index 5917953090b32cca5c34f17c86f5ce550457c3f2..5bada0711851580d855f4cab24468b33685ad130 100644 (file)
@@ -186,7 +186,8 @@ static int status_handler(request_rec *r)
     apr_uint32_t up_time;
     ap_loadavg_t t;
     int j, i, res, written;
-    int ready;
+    int idle;
+    int graceful;
     int busy;
     unsigned long count;
     unsigned long lres, my_lres, conn_lres;
@@ -203,6 +204,7 @@ static int status_handler(request_rec *r)
     char *stat_buffer;
     pid_t *pid_buffer, worker_pid;
     int *thread_idle_buffer = NULL;
+    int *thread_graceful_buffer = NULL;
     int *thread_busy_buffer = NULL;
     clock_t tu, ts, tcu, tcs;
     clock_t gu, gs, gcu, gcs;
@@ -231,7 +233,8 @@ static int status_handler(request_rec *r)
 #endif
 #endif
 
-    ready = 0;
+    idle = 0;
+    graceful = 0;
     busy = 0;
     count = 0;
     bcount = 0;
@@ -250,6 +253,7 @@ static int status_handler(request_rec *r)
     stat_buffer = apr_palloc(r->pool, server_limit * thread_limit * sizeof(char));
     if (is_async) {
         thread_idle_buffer = apr_palloc(r->pool, server_limit * sizeof(int));
+        thread_graceful_buffer = apr_palloc(r->pool, server_limit * sizeof(int));
         thread_busy_buffer = apr_palloc(r->pool, server_limit * sizeof(int));
     }
 
@@ -318,6 +322,7 @@ static int status_handler(request_rec *r)
         ps_record = ap_get_scoreboard_process(i);
         if (is_async) {
             thread_idle_buffer[i] = 0;
+            thread_graceful_buffer[i] = 0;
             thread_busy_buffer[i] = 0;
         }
         for (j = 0; j < thread_limit; ++j) {
@@ -336,18 +341,20 @@ static int status_handler(request_rec *r)
                 && ps_record->pid) {
                 if (res == SERVER_READY) {
                     if (ps_record->generation == mpm_generation)
-                        ready++;
+                        idle++;
                     if (is_async)
                         thread_idle_buffer[i]++;
                 }
                 else if (res != SERVER_DEAD &&
                          res != SERVER_STARTING &&
                          res != SERVER_IDLE_KILL) {
-                    busy++;
-                    if (is_async) {
-                        if (res == SERVER_GRACEFUL)
-                            thread_idle_buffer[i]++;
-                        else
+                    if (res == SERVER_GRACEFUL) {
+                        graceful++;
+                        if (is_async)
+                            thread_graceful_buffer[i]++;
+                    } else {
+                        busy++;
+                        if (is_async)
                             thread_busy_buffer[i]++;
                     }
                 }
@@ -548,10 +555,10 @@ static int status_handler(request_rec *r)
     } /* ap_extended_status */
 
     if (!short_report)
-        ap_rprintf(r, "<dt>%d requests currently being processed, "
-                      "%d idle workers</dt>\n", busy, ready);
+        ap_rprintf(r, "<dt>%d requests currently being processed, %d workers gracefully restarting, "
+                      "%d idle workers</dt>\n", busy, graceful, idle);
     else
-        ap_rprintf(r, "BusyWorkers: %d\nIdleWorkers: %d\n", busy, ready);
+        ap_rprintf(r, "BusyWorkers: %d\nGracefulWorkers: %d\nIdleWorkers: %d\n", busy, graceful, idle);
 
     if (!short_report)
         ap_rputs("</dl>", r);
@@ -559,11 +566,6 @@ static int status_handler(request_rec *r)
     if (is_async) {
         int write_completion = 0, lingering_close = 0, keep_alive = 0,
             connections = 0, stopping = 0, procs = 0;
-        /*
-         * These differ from 'busy' and 'ready' in how gracefully finishing
-         * threads are counted. XXX: How to make this clear in the html?
-         */
-        int busy_workers = 0, idle_workers = 0;
         if (!short_report)
             ap_rputs("\n\n<table rules=\"all\" cellpadding=\"1%\">\n"
                      "<tr><th rowspan=\"2\">Slot</th>"
@@ -573,7 +575,7 @@ static int status_handler(request_rec *r)
                          "<th colspan=\"2\">Threads</th>"
                          "<th colspan=\"3\">Async connections</th></tr>\n"
                      "<tr><th>total</th><th>accepting</th>"
-                         "<th>busy</th><th>idle</th>"
+                         "<th>busy</th><th>graceful</th><th>idle</th>"
                          "<th>writing</th><th>keep-alive</th><th>closing</th></tr>\n", r);
         for (i = 0; i < server_limit; ++i) {
             ps_record = ap_get_scoreboard_process(i);
@@ -582,8 +584,6 @@ static int status_handler(request_rec *r)
                 write_completion += ps_record->write_completion;
                 keep_alive       += ps_record->keep_alive;
                 lingering_close  += ps_record->lingering_close;
-                busy_workers     += thread_busy_buffer[i];
-                idle_workers     += thread_idle_buffer[i];
                 procs++;
                 if (ps_record->quiescing) {
                     stopping++;
@@ -599,7 +599,7 @@ static int status_handler(request_rec *r)
                     ap_rprintf(r, "<tr><td>%u</td><td>%" APR_PID_T_FMT "</td>"
                                       "<td>%s%s</td>"
                                       "<td>%u</td><td>%s</td>"
-                                      "<td>%u</td><td>%u</td>"
+                                      "<td>%u</td><td>%u</td><td>%u</td>"
                                       "<td>%u</td><td>%u</td><td>%u</td>"
                                       "</tr>\n",
                                i, ps_record->pid,
@@ -607,6 +607,7 @@ static int status_handler(request_rec *r)
                                ps_record->connections,
                                ps_record->not_accepting ? "no" : "yes",
                                thread_busy_buffer[i],
+                               thread_graceful_buffer[i],
                                thread_idle_buffer[i],
                                ps_record->write_completion,
                                ps_record->keep_alive,
@@ -618,25 +619,22 @@ static int status_handler(request_rec *r)
             ap_rprintf(r, "<tr><td>Sum</td>"
                           "<td>%d</td><td>%d</td>"
                           "<td>%d</td><td>&nbsp;</td>"
-                          "<td>%d</td><td>%d</td>"
+                          "<td>%d</td><td>%d</td><td>%d</td>"
                           "<td>%d</td><td>%d</td><td>%d</td>"
                           "</tr>\n</table>\n",
                           procs, stopping,
                           connections,
-                          busy_workers, idle_workers,
+                          busy, graceful, idle,
                           write_completion, keep_alive, lingering_close);
         }
         else {
             ap_rprintf(r, "Processes: %d\n"
                           "Stopping: %d\n"
-                          "BusyWorkers: %d\n"
-                          "IdleWorkers: %d\n"
                           "ConnsTotal: %d\n"
                           "ConnsAsyncWriting: %d\n"
                           "ConnsAsyncKeepAlive: %d\n"
                           "ConnsAsyncClosing: %d\n",
                           procs, stopping,
-                          busy_workers, idle_workers,
                           connections,
                           write_completion, keep_alive, lingering_close);
         }