]> granicus.if.org Git - apache/commitdiff
mod_http2: fixed slave connection keepalives counter.
authorStefan Eissing <icing@apache.org>
Fri, 25 Jan 2019 09:27:39 +0000 (09:27 +0000)
committerStefan Eissing <icing@apache.org>
Fri, 25 Jan 2019 09:27:39 +0000 (09:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1852101 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/http2/h2_conn.c
modules/http2/h2_mplx.c
modules/http2/h2_task.c

diff --git a/CHANGES b/CHANGES
index 6bee2dd9543c7423892e7889df4b2c3a86686b9d..5a3824b97832d40ffdd62770e2c07a2ae2c80bdc 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,7 +1,8 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.1
 
-  *) mod_http2: enable re-use of slave connections again. [Stefan Eissing]
+  *) mod_http2: enable re-use of slave connections again. Fixed slave connection
+     keepalives counter. [Stefan Eissing]
 
   *) mod_proxy_wstunnel: Fix websocket proxy over UDS.
      PR 62932 <pavel dcmsys.com>
index 16b82282cc74bd67ab046fce164c3b5ccf8a7b6c..fa524b47412682f71490a48b249ed16fa6eaf9ec 100644 (file)
@@ -316,6 +316,7 @@ conn_rec *h2_slave_create(conn_rec *master, int slave_id, apr_pool_t *parent)
     c->notes                  = apr_table_make(pool, 5);
     c->input_filters          = NULL;
     c->output_filters         = NULL;
+    c->keepalives             = 0;
 #if AP_MODULE_MAGIC_AT_LEAST(20180903, 1)
     c->filter_conn_ctx        = NULL;
 #endif
@@ -348,16 +349,15 @@ conn_rec *h2_slave_create(conn_rec *master, int slave_id, apr_pool_t *parent)
         ap_set_module_config(c->conn_config, mpm, cfg);
     }
 
-    ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, c, 
-                  "h2_stream(%ld-%d): created slave", master->id, slave_id);
+    ap_log_cerror(APLOG_MARK, APLOG_TRACE3, 0, c, 
+                  "h2_slave(%s): created", c->log_id);
     return c;
 }
 
 void h2_slave_destroy(conn_rec *slave)
 {
-    ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, slave,
-                  "h2_stream(%s): destroy slave", 
-                  apr_table_get(slave->notes, H2_TASK_ID_NOTE));
+    ap_log_cerror(APLOG_MARK, APLOG_TRACE3, 0, slave,
+                  "h2_slave(%s): destroy", slave->log_id);
     slave->sbh = NULL;
     apr_pool_destroy(slave->pool);
 }
@@ -370,16 +370,18 @@ apr_status_t h2_slave_run_pre_connection(conn_rec *slave, apr_socket_t *csd)
          * (Not necessarily in pre_connection, but later. Set it here, so it
          * is in place.) */
         slave->keepalives = 1;
+        /* We signal that this connection will be closed after the request.
+         * Which is true in that sense that we throw away all traffic data
+         * on this slave connection after each requests. Although we might
+         * reuse internal structures like memory pools.
+         * The wanted effect of this is that httpd does not try to clean up
+         * any dangling data on this connection when a request is done. Which
+         * is unneccessary on a h2 stream.
+         */
+        slave->keepalive = AP_CONN_CLOSE;
+        return ap_run_pre_connection(slave, csd);
     }
-    /* We signal that this connection will be closed after the request.
-     * Which is true in that sense that we throw away all traffic data
-     * on this slave connection after each requests. Although we might
-     * reuse internal structures like memory pools.
-     * The wanted effect of this is that httpd does not try to clean up
-     * any dangling data on this connection when a request is done. Which
-     * is unneccessary on a h2 stream.
-     */
-    slave->keepalive = AP_CONN_CLOSE;
-    return ap_run_pre_connection(slave, csd);
+    ap_assert(slave->output_filters);
+    return APR_SUCCESS;
 }
 
index 0e764f67f0f863e777d07cc569bd6cb88c63e4c9..b0d075ea61e70edc99eabd23181548eea22bd2a0 100644 (file)
@@ -438,6 +438,8 @@ void h2_mplx_release_and_join(h2_mplx *m, apr_thread_cond_t *wait)
     apr_status_t status;
     int i, wait_secs = 60;
 
+    ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
+                  "h2_mplx(%ld): start release", m->id);
     /* How to shut down a h2 connection:
      * 0. abort and tell the workers that no more tasks will come from us */
     m->aborted = 1;
@@ -978,6 +980,9 @@ static apr_status_t unschedule_slow_tasks(h2_mplx *m)
      */
     n = (m->tasks_active - m->limit_active - (int)h2_ihash_count(m->sredo));
     while (n > 0 && (stream = get_latest_repeatable_unsubmitted_stream(m))) {
+        ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c, 
+                      "h2_mplx(%s): unschedule, resetting task for redo later",
+                      stream->task->id);
         h2_task_rst(stream->task, H2_ERR_CANCEL);
         h2_ihash_add(m->sredo, stream);
         --n;
index f7aa0bdcc4bf57cc53f073d3a1fa7e0a09bc2bb7..9a210b55c4b7854e3c19af21981ab080e9ec6012 100644 (file)
@@ -504,7 +504,7 @@ static int h2_task_pre_conn(conn_rec* c, void *arg)
     (void)arg;
     if (h2_ctx_is_task(ctx)) {
         ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, c,
-                      "h2_h2, pre_connection, found stream task");
+                      "h2_slave(%s), pre_connection, adding filters", c->log_id);
         ap_add_input_filter("H2_SLAVE_IN", NULL, NULL, c);
         ap_add_output_filter("H2_PARSE_H1", NULL, NULL, c);
         ap_add_output_filter("H2_SLAVE_OUT", NULL, NULL, c);