From: Stefan Eissing Date: Fri, 25 Jan 2019 09:27:39 +0000 (+0000) Subject: mod_http2: fixed slave connection keepalives counter. X-Git-Tag: 2.5.0-alpha2-ci-test-only~2191 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=17f636c764b4c68e4cba986d3d723966fad9796c;p=thirdparty%2Fapache%2Fhttpd.git mod_http2: fixed slave connection keepalives counter. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1852101 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 6bee2dd9543..5a3824b9783 100644 --- 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 diff --git a/modules/http2/h2_conn.c b/modules/http2/h2_conn.c index 16b82282cc7..fa524b47412 100644 --- a/modules/http2/h2_conn.c +++ b/modules/http2/h2_conn.c @@ -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; } diff --git a/modules/http2/h2_mplx.c b/modules/http2/h2_mplx.c index 0e764f67f0f..b0d075ea61e 100644 --- a/modules/http2/h2_mplx.c +++ b/modules/http2/h2_mplx.c @@ -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; diff --git a/modules/http2/h2_task.c b/modules/http2/h2_task.c index f7aa0bdcc4b..9a210b55c4b 100644 --- a/modules/http2/h2_task.c +++ b/modules/http2/h2_task.c @@ -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);