]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: stream: only loop on flags relevant to the analysers
authorWilly Tarreau <w@1wt.eu>
Thu, 6 Jun 2019 12:32:49 +0000 (14:32 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 6 Jun 2019 14:36:19 +0000 (16:36 +0200)
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

index f92a0085fae1cafae71de968eb57f3364aa1a013..860f2fdd2c324f55092ed21c7278ad03764f1993 100644 (file)
@@ -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)