From: Stefan Eissing Date: Mon, 17 Apr 2017 09:17:55 +0000 (+0000) Subject: On the trunk: X-Git-Tag: 2.5.0-alpha~470 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f255ac6d7c7a47e117ee1c0748468b454e305a56;p=thirdparty%2Fapache%2Fhttpd.git On the trunk: 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 --- diff --git a/CHANGES b/CHANGES index 4b91eb2b6c7..2f692cf0d92 100644 --- 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] diff --git a/modules/http2/h2_mplx.c b/modules/http2/h2_mplx.c index dbb74afd6bf..e0704b7a888 100644 --- a/modules/http2/h2_mplx.c +++ b/modules/http2/h2_mplx.c @@ -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; } diff --git a/modules/http2/h2_mplx.h b/modules/http2/h2_mplx.h index ed332c8bc3d..61b1b99aba7 100644 --- a/modules/http2/h2_mplx.h +++ b/modules/http2/h2_mplx.h @@ -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;