diff options
author | Stefan Eissing <icing@apache.org> | 2017-04-17 09:17:55 +0000 |
---|---|---|
committer | Stefan Eissing <icing@apache.org> | 2017-04-17 09:17:55 +0000 |
commit | f255ac6d7c7a47e117ee1c0748468b454e305a56 (patch) | |
tree | ad0bef4137845fd15d3555cb7c8ed25333c21b09 | |
parent | 7fb70434eb2644aca6143d5e25c43afe3903d267 (diff) | |
download | httpd-f255ac6d7c7a47e117ee1c0748468b454e305a56.tar.gz |
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
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | modules/http2/h2_mplx.c | 22 | ||||
-rw-r--r-- | modules/http2/h2_mplx.h | 1 |
3 files changed, 20 insertions, 6 deletions
@@ -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 dbb74afd6b..e0704b7a88 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 ed332c8bc3..61b1b99aba 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; |