]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MEDIUM] session: don't resync FSMs on non-interesting changes
authorWilly Tarreau <w@1wt.eu>
Sat, 21 Mar 2009 21:09:29 +0000 (22:09 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 21 Mar 2009 21:09:29 +0000 (22:09 +0100)
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.

src/proto_uxst.c
src/session.c

index 0edc2aff274b4cfb77caec2e5d135e9a81a31ec5..0eaea3c40b4f7f9b9cfa10c292acbba63ac9a992 100644 (file)
@@ -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;
        }
 
index 6bb6a4537527c7236d9e5c1e6494e5dd426d26a3..9c06065f5b6072be31649c86ae9f3903e97d5707 100644 (file)
@@ -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;
        }