summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Eissing <icing@apache.org>2017-04-17 09:17:55 +0000
committerStefan Eissing <icing@apache.org>2017-04-17 09:17:55 +0000
commitf255ac6d7c7a47e117ee1c0748468b454e305a56 (patch)
treead0bef4137845fd15d3555cb7c8ed25333c21b09
parent7fb70434eb2644aca6143d5e25c43afe3903d267 (diff)
downloadhttpd-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--CHANGES3
-rw-r--r--modules/http2/h2_mplx.c22
-rw-r--r--modules/http2/h2_mplx.h1
3 files changed, 20 insertions, 6 deletions
diff --git a/CHANGES b/CHANGES
index 4b91eb2b6c..2f692cf0d9 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 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;