From: Willy Tarreau Date: Mon, 30 Oct 2017 14:38:23 +0000 (+0100) Subject: MEDIUM: h2: enable reading again on the connection if it was blocked on stream buffer... X-Git-Tag: v1.8-rc1~37 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d7739c8820be1d7a89498f6d01cd652f7548b583;p=thirdparty%2Fhaproxy.git MEDIUM: h2: enable reading again on the connection if it was blocked on stream buffer full If the polling update function is called with RD_ENA while H2_CF_DEM_SFULL indicates the demux had to block on a stream buffer full condition, we can remove the flag and re-enable polling for receiving because this is the indication that a consumer stream has made some room in the buffer. Probably that we should improve this to ensure that h2s->id == h2c->dsi and avoid trying to receive multiple times in a row for the wrong stream. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index f05c269393..e9f1bc856c 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -943,6 +943,14 @@ static void h2_update_poll(struct conn_stream *cs) if (!h2s) return; + /* we may unblock a blocked read */ + + if (cs->flags & CS_FL_DATA_RD_ENA && + h2s->h2c->flags & H2_CF_DEM_SFULL && h2s->h2c->dsi == h2s->id) { + h2s->h2c->flags &= ~H2_CF_DEM_SFULL; + conn_xprt_want_recv(cs->conn); + } + /* Note: the stream and stream-int code doesn't allow us to perform a * synchronous send() here unfortunately, because this code is called * as si_update() from the process_stream() context. This means that