From 6b8daef56bf00f35191661f0a1dc8984d0592df0 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Wed, 14 Oct 2020 18:17:10 +0200 Subject: [PATCH] MEDIUM: h2: remove conn from session on detach H2 mux is marked with HOL blocking. On safe reuse mode, the connection using it are placed on the sessions instead of the available lists to avoid sharing it with several clients. On detach, if they are no more streams, remove the connection from the session before adding it to the idle list. If there is still used streams, do not add it to available list as it should be already on the session list. --- src/mux_h2.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/mux_h2.c b/src/mux_h2.c index 80a3e45..545bb38 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3975,6 +3975,14 @@ static void h2_detach(struct conn_stream *cs) } else { if (eb_is_empty(&h2c->streams_by_id)) { + /* If the connection is owned by the session, first remove it + * from its list + */ + if (h2c->conn->owner) { + session_unown_conn(h2c->conn->owner, h2c->conn); + h2c->conn->owner = NULL; + } + if (!srv_add_to_idle_list(objt_server(h2c->conn->target), h2c->conn, 1)) { /* The server doesn't want it, let's kill the connection right away */ h2c->conn->mux->destroy(h2c); @@ -3990,7 +3998,8 @@ static void h2_detach(struct conn_stream *cs) } else if (MT_LIST_ISEMPTY(&h2c->conn->list) && - h2_avail_streams(h2c->conn) > 0 && objt_server(h2c->conn->target)) { + h2_avail_streams(h2c->conn) > 0 && objt_server(h2c->conn->target) && + !LIST_ADDED(&h2c->conn->session_list)) { LIST_ADD(&__objt_server(h2c->conn->target)->available_conns[tid], mt_list_to_list(&h2c->conn->list)); } } -- 1.7.10.4