From 3c5c066d66d213afffaead7e82f3233d9debf66d Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 6 Jun 2019 14:32:49 +0200 Subject: [PATCH] MEDIUM: stream: only loop on flags relevant to the analysers In process_stream() we detect a number of conditions to decide to loop back to the analysers. Some of them are excessive in that they perform a strict comparison instead of filtering on the flags relevant to the analysers as is done at other places, resulting in excess wakeups. One of the effect is that after a successful WRITE_PARTIAL, a second send is not possible, resulting in the loss of WRITE_PARTIAL, causing another wakeup! Let's apply the same mask and verify the flags correctly. --- src/stream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stream.c b/src/stream.c index f92a0085fa..860f2fdd2c 100644 --- a/src/stream.c +++ b/src/stream.c @@ -2629,7 +2629,7 @@ struct task *process_stream(struct task *t, void *context, unsigned short state) (si_b->flags & SI_FL_ERR && si_b->state != SI_ST_CLO)) goto resync_stream_interface; - if (req->flags != rqf_last) + if ((req->flags & ~rqf_last) & CF_MASK_ANALYSER) goto resync_request; if ((res->flags ^ rpf_last) & CF_MASK_STATIC) -- 2.47.3