]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mpm_event: Follow up to r1899858: Avoid explicit sleep.
authorYann Ylavic <ylavic@apache.org>
Thu, 14 Apr 2022 17:04:08 +0000 (17:04 +0000)
committerYann Ylavic <ylavic@apache.org>
Thu, 14 Apr 2022 17:04:08 +0000 (17:04 +0000)
Instead, we can simply go to ap_wait_or_timeout() again.

While at it, improve the comment about killed processes.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1899865 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/event/event.c

index b4361cc8988a2b25832b096b92b953ec5b7aaa5f..2611d33f6978e509ad05f8e9eefe7a0879342fc5 100644 (file)
@@ -3382,7 +3382,7 @@ static void server_main_loop(int remaining_children_to_start)
 {
     int num_buckets = retained->mpm->num_buckets;
     int max_daemon_used = 0;
-    int successive_signals = 0;
+    int successive_kills = 0;
     int child_slot;
     apr_exit_why_e exitwhy;
     int status, processed_status;
@@ -3461,28 +3461,27 @@ static void server_main_loop(int remaining_children_to_start)
             /* Don't perform idle maintenance when a child dies,
              * only do it when there's a timeout.  Remember only a
              * finite number of children can die, and it's pretty
-             * pathological for a lot to die suddenly.  If that happens
-             * anyway, protect against fork()+kill() flood by not restarting
-             * more than 3 children if no timeout happened in between,
-             * otherwise we keep going with idle maintenance.
+             * pathological for a lot to die suddenly.  If a child is
+             * killed by a signal (faulting) we want to restart it ASAP
+             * though, up to 3 successive faults or we stop this until
+             * a timeout happens again (to avoid the flood of fork()ed
+             * processes that keep being killed early).
              */
             if (child_slot < 0 || !APR_PROC_CHECK_SIGNALED(exitwhy)) {
                 continue;
             }
-            if (++successive_signals >= 3) {
-                if (successive_signals % 10 == 3) {
+            if (++successive_kills >= 3) {
+                if (successive_kills % 10 == 3) {
                     ap_log_error(APLOG_MARK, APLOG_WARNING, 0,
                                  ap_server_conf, APLOGNO(10392)
                                  "children are killed successively!");
                 }
-                apr_sleep(apr_time_from_sec(1));
-            }
-            else {
-                ++remaining_children_to_start;
+                continue;
             }
+            ++remaining_children_to_start;
         }
         else {
-            successive_signals = 0;
+            successive_kills = 0;
         }
 
         if (remaining_children_to_start) {