From: Willy Tarreau Date: Sat, 21 Mar 2009 21:09:29 +0000 (+0100) Subject: [MEDIUM] session: don't resync FSMs on non-interesting changes X-Git-Tag: v1.3.16~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06bea9426617699b5bf849c4cc7813572e066f14;p=thirdparty%2Fhaproxy.git [MEDIUM] session: don't resync FSMs on non-interesting changes While processing the session, we used to resync the FSMs when buffer flags changed. But since BF_KERN_SPLICING and BF_READ_DONTWAIT were introduced, sometimes we could resync after they were set, which is not what we want. This was because there were some old checks left which did not mask changes with BF_MASK_STATIC before checking. --- diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 0edc2aff27..0eaea3c40b 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -805,7 +805,7 @@ struct task *uxst_process_session(struct task *t) } s->req->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (s->req->flags != flags) + if ((s->req->flags ^ flags) & BF_MASK_STATIC) resync = 1; } @@ -891,7 +891,7 @@ struct task *uxst_process_session(struct task *t) } s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (s->rep->flags != flags) + if ((s->rep->flags ^ flags) & BF_MASK_STATIC) resync = 1; } else if ((s->rep->flags & BF_MASK_ANALYSER) || @@ -904,7 +904,7 @@ struct task *uxst_process_session(struct task *t) } s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (s->rep->flags != flags) + if ((s->rep->flags ^ flags) & BF_MASK_STATIC) resync = 1; } diff --git a/src/session.c b/src/session.c index 6bb6a45375..9c06065f5b 100644 --- a/src/session.c +++ b/src/session.c @@ -778,7 +778,7 @@ resync_stream_interface: s->req->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (s->req->flags != flags) + if ((s->req->flags ^ flags) & BF_MASK_STATIC) resync = 1; } @@ -925,7 +925,7 @@ resync_stream_interface: } s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (s->rep->flags != flags) + if ((s->rep->flags ^ flags) & BF_MASK_STATIC) resync = 1; } else if ((s->rep->flags & BF_MASK_ANALYSER) || @@ -956,7 +956,7 @@ resync_stream_interface: s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (s->rep->flags != flags) + if ((s->rep->flags ^ flags) & BF_MASK_STATIC) resync = 1; }