]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mpm_event: avoid possible KeepAlveTimeout off by -100 ms.
authorYann Ylavic <ylavic@apache.org>
Thu, 20 Feb 2020 23:41:21 +0000 (23:41 +0000)
committerYann Ylavic <ylavic@apache.org>
Thu, 20 Feb 2020 23:41:21 +0000 (23:41 +0000)
Use TIMEOUT_FUDGE_FACTOR to limit wakeups from queues_next_expiry, yet consider
the current/unfudged timestamp to process/cleanup the queues (once woken up).

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

CHANGES
server/mpm/event/event.c

diff --git a/CHANGES b/CHANGES
index 20a293b561c3f049d14e46d77beb010eb6164ee8..552d37dbdf7fa7414c0eb10593320b52b4b9bc2e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.1
 
+  *) mpm_event: avoid possible KeepAlveTimeout off by -100 ms.
+     [Eric Covener, Yann Ylavic]
+
   *) core: ap_method_mask_t type added for method bitmasks, changed
      from apr_int64_t and used for the method_mask field in
      ap_method_list_t, AP_METHOD_BIT, allowed field of request_rec,
index a3647cf8caca0d083db77df504fed27c30961f25..37856e6a1157ef274919f28316a6debd035d171c 100644 (file)
@@ -1734,7 +1734,8 @@ static void process_timeout_queue(struct timeout_queue *q,
                  */
                 apr_time_t q_expiry = cs->queue_timestamp + qp->timeout;
                 apr_time_t next_expiry = queues_next_expiry;
-                if (!next_expiry || next_expiry > q_expiry) {
+                if (!next_expiry
+                        || next_expiry > q_expiry + TIMEOUT_FUDGE_FACTOR) {
                     queues_next_expiry = q_expiry;
                 }
                 break;
@@ -2163,8 +2164,6 @@ static void * APR_THREAD_FUNC listener_thread(apr_thread_t * thd, void *dummy)
          * with and without wake-ability.
          */
         if (timeout_time && timeout_time < (now = apr_time_now())) {
-            timeout_time = now + TIMEOUT_FUDGE_FACTOR;
-
             /* handle timed out sockets */
             apr_thread_mutex_lock(timeout_mutex);
 
@@ -2176,16 +2175,16 @@ static void * APR_THREAD_FUNC listener_thread(apr_thread_t * thd, void *dummy)
                 process_keepalive_queue(0); /* kill'em all \m/ */
             }
             else {
-                process_keepalive_queue(timeout_time);
+                process_keepalive_queue(now);
             }
             /* Step 2: write completion timeouts */
-            process_timeout_queue(write_completion_q, timeout_time,
+            process_timeout_queue(write_completion_q, now,
                                   start_lingering_close_nonblocking);
             /* Step 3: (normal) lingering close completion timeouts */
-            process_timeout_queue(linger_q, timeout_time,
+            process_timeout_queue(linger_q, now,
                                   stop_lingering_close);
             /* Step 4: (short) lingering close completion timeouts */
-            process_timeout_queue(short_linger_q, timeout_time,
+            process_timeout_queue(short_linger_q, now,
                                   stop_lingering_close);
 
             apr_thread_mutex_unlock(timeout_mutex);