From: Willy Tarreau Date: Mon, 25 Mar 2019 17:13:16 +0000 (+0100) Subject: BUG/MEDIUM: mux-h2: make sure to always notify streams of EOS condition X-Git-Tag: v2.0-dev2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a27db38f121203fd337ffa394101db9dde12645a;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: mux-h2: make sure to always notify streams of EOS condition Recent commit 63768a63d ("MEDIUM: mux-h2: Don't mix the end of the message with the end of stream") introduced a race which may manifest itself with small connection counts on large objects and large server timeouts in legacy mode. Sometimes h2s_close() is called while the data layer is subscribed to read events but nothing in the chain can cause this wake-up to happen and some streams stall for a while at the end of a transfer until the server timeout strikes and ends the stream completes. We need to wake the stream up if it's subscribed to rx events there, which is what this patch does. When the patch above is backported to 1.9, this patch will also have to be backported. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index b6c2c80934..9894592e58 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -840,8 +840,11 @@ static inline void h2s_close(struct h2s *h2s) h2s->h2c->nb_streams--; if (!h2s->id) h2s->h2c->nb_reserved--; - if (h2s->cs) + if (h2s->cs) { h2s->cs->flags |= CS_FL_REOS; + if (!(h2s->cs->flags & CS_FL_EOS) && !b_data(&h2s->rxbuf)) + h2s_notify_recv(h2s); + } } h2s->st = H2_SS_CLOSED; }