From a27db38f121203fd337ffa394101db9dde12645a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 25 Mar 2019 18:13:16 +0100 Subject: [PATCH] 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. --- src/mux_h2.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mux_h2.c b/src/mux_h2.c index b6c2c8093..9894592e5 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; }