]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
On the trunk:
authorStefan Eissing <icing@apache.org>
Mon, 17 Apr 2017 09:17:55 +0000 (09:17 +0000)
committerStefan Eissing <icing@apache.org>
Mon, 17 Apr 2017 09:17:55 +0000 (09:17 +0000)
mod_http2: MaxKeepAliveRequests now limits the number of times a
     slave connection gets reused.

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

CHANGES
modules/http2/h2_mplx.c
modules/http2/h2_mplx.h

diff --git a/CHANGES b/CHANGES
index 4b91eb2b6c71a43f1745c882f743203e08997213..2f692cf0d92e36c785761463b795367985bba362 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mod_http2: MaxKeepAliveRequests now limits the number of times a 
+     slave connection gets reused. [Stefan Eissing]
+
   *) mod_substitute: Fix spurious AH01328 (Line too long) errors on EBCDIC
      systems.  [Eric Covener]
 
index dbb74afd6bf4318905b620f4d0a124293b14b556..e0704b7a8888dd47457c2b3656b0eab3512d7e39 100644 (file)
@@ -158,13 +158,18 @@ h2_mplx *h2_mplx_create(conn_rec *c, apr_pool_t *parent,
     apr_allocator_t *allocator;
     apr_thread_mutex_t *mutex;
     h2_mplx *m;
+    h2_ctx *ctx = h2_ctx_get(c, 0);
     ap_assert(conf);
     
     m = apr_pcalloc(parent, sizeof(h2_mplx));
     if (m) {
         m->id = c->id;
         m->c = c;
-
+        m->s = (ctx? h2_ctx_server_get(ctx) : NULL);
+        if (!m->s) {
+            m->s = c->base_server;
+        }
+        
         /* We create a pool with its own allocator to be used for
          * processing slave connections. This is the only way to have the
          * processing independant of its parent pool in the sense that it
@@ -286,8 +291,11 @@ static void task_destroy(h2_mplx *m, h2_task *task)
     int reuse_slave = 0;
     
     slave = task->c;
-    reuse_slave = ((m->spare_slaves->nelts < (m->limit_active * 3 / 2))
-                   && !task->rst_error);
+
+    if (m->s->keep_alive_max == 0 || slave->keepalives < m->s->keep_alive_max) {
+        reuse_slave = ((m->spare_slaves->nelts < (m->limit_active * 3 / 2))
+                       && !task->rst_error);
+    }
     
     if (slave) {
         if (reuse_slave && slave->keepalive == AP_CONN_KEEPALIVE) {
@@ -570,7 +578,10 @@ static apr_status_t out_close(h2_mplx *m, h2_task *task)
     if (!task) {
         return APR_ECONNABORTED;
     }
-
+    if (task->c) {
+        ++task->c->keepalives;
+    }
+    
     stream = h2_ihash_get(m->streams, task->stream_id);
     if (!stream) {
         return APR_ECONNABORTED;
@@ -713,8 +724,7 @@ static h2_task *next_stream_task(h2_mplx *m)
             }
             
             if (!stream->task) {
-            
-                m->c->keepalives++;
+
                 if (sid > m->max_stream_started) {
                     m->max_stream_started = sid;
                 }
index ed332c8bc3d16efb55d99c9b71404df4ce9a353a..61b1b99aba705f8844eea69af72d5ceb1dca10bc 100644 (file)
@@ -57,6 +57,7 @@ struct h2_mplx {
     long id;
     conn_rec *c;
     apr_pool_t *pool;
+    server_rec *s;                  /* server for master conn */
 
     unsigned int event_pending;
     unsigned int aborted;