From 44d59146a6c00c73f3095eed820f5f792fca4ac1 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Thu, 13 Dec 2018 18:46:22 +0100 Subject: [PATCH] MEDIUM: htx: Try to take a connection over if it has no owner. In the mux detach function, when using HTX, take the connection over if it no longer has an owner (ie because the session that was the owner left). It is done for legacy code in proto_http.c, but not for HTX. Also when using HTX, in H2, try to add the connection back to idle_conns if it was not already (ie we used to use all the available streams, and we're freeing one). That too was done in proto_http.c. --- src/mux_h1.c | 15 ++++++++++++--- src/mux_h2.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/mux_h1.c b/src/mux_h1.c index 21f539d1f..bd7d03835 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -1925,13 +1926,21 @@ static void h1_detach(struct conn_stream *cs) h1c = h1s->h1c; h1s->cs = NULL; - if (conn_is_back(h1c->conn) && (h1s->flags & H1S_F_WANT_KAL) && h1c->conn->owner) { + if (conn_is_back(h1c->conn) && (h1s->flags & H1S_F_WANT_KAL) && + !(h1c->conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) { + struct stream_interface *si = cs->data; + struct stream *s = si_strm(si); + /* Never ever allow to reuse a connection from a non-reuse backend */ - if (h1c->conn && (h1c->px->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR) + if ((h1c->px->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR) h1c->conn->flags |= CO_FL_PRIVATE; + if (!(h1c->conn->owner)) { + h1c->conn->owner = s->sess; + session_add_conn(s->sess, h1c->conn, s->target); + } /* we're in keep-alive with an idle connection, monitor it if not already done */ - if (h1c->conn && LIST_ISEMPTY(&h1c->conn->list)) { + if (LIST_ISEMPTY(&h1c->conn->list)) { struct server *srv = objt_server(h1c->conn->target); if (srv) { diff --git a/src/mux_h2.c b/src/mux_h2.c index 806c817bd..807f3197d 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -22,7 +22,9 @@ #include #include #include +#include #include +#include #include #include @@ -2815,6 +2817,34 @@ static void h2_detach(struct conn_stream *cs) return; h2c = h2s->h2c; + if (h2c->proxy->options2 & PR_O2_USE_HTX) { + struct stream_interface *si; + struct stream *s; + + si = cs->data; + s = si_strm(si); + if (!(h2c->conn->flags & + (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) { + if (!h2c->conn->owner) { + h2c->conn->owner = s->sess; + session_add_conn(s->sess, h2c->conn, s->target); + } + /* Never ever allow to reuse a connection from a non-reuse backend */ + if ((h2c->proxy->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR) + h2c->conn->flags |= CO_FL_PRIVATE; + if (LIST_ISEMPTY(&h2c->conn->list)) { + struct server *srv = objt_server(h2c->conn->target); + + if (srv) { + if (h2c->conn->flags & CO_FL_PRIVATE) + LIST_ADD(&srv->priv_conns[tid], &h2c->conn->list); + else + LIST_ADD(&srv->idle_conns[tid], &h2c->conn->list); + } + + } + } + } h2s->cs = NULL; h2c->nb_cs--; if (h2c->flags & H2_CF_DEM_TOOMANY &&