From: Olivier Houchard Date: Thu, 13 Dec 2018 17:46:22 +0000 (+0100) Subject: MEDIUM: htx: Try to take a connection over if it has no owner. X-Git-Tag: v1.9-dev11~61 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=44d59146a6c00c73f3095eed820f5f792fca4ac1;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/mux_h1.c b/src/mux_h1.c index 21f539d1fe..bd7d038353 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 806c817bd3..807f3197dd 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 &&