]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: acl: fix regression introduced by latest converters support
authorWilly Tarreau <w@1wt.eu>
Thu, 5 Dec 2013 01:19:58 +0000 (02:19 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 5 Dec 2013 01:23:13 +0000 (02:23 +0100)
Since commit 348971e (MEDIUM: acl: use the fetch syntax
'fetch(args),conv(),conv()' into the ACL keyword), ACLs wait on input
that may change. This is visible in the configuration below :

        tcp-request inspect-delay 3s
        tcp-request content accept if REQ_CONTENT

Nothing will pass before the end of the timer. This is because
historically, sample_process() was dedicated to stick tables where
it was absolutely necessary to wait for a stable sample. Now samples
are used by many other things and we can't afford this. So let's move
this check to the stick tables after the call to sample_process()
instead.

This is post-1.5-dev19 work, no backport is required.

src/sample.c
src/stick_table.c

index 10749c0e2433d08550c9647f8046b4db2ebfe3c0..4253dd15ee21ce9949bb204c41c5b132ab9a0cbd 100644 (file)
@@ -839,9 +839,6 @@ struct sample *sample_process(struct proxy *px, struct session *l4, void *l7,
        if (!expr->fetch->process(px, l4, l7, opt, expr->arg_p, p, expr->fetch->kw))
                return NULL;
 
-       if ((p->flags & SMP_F_MAY_CHANGE) && !(opt & SMP_OPT_FINAL))
-               return NULL; /* we can only use stable samples */
-
        list_for_each_entry(conv_expr, &expr->conv_exprs, list) {
                /* we want to ensure that p->type can be casted into
                 * conv_expr->conv->in_type. We have 3 possibilities :
index 45e6118fec3dccafe07eecd7b94b1389e338cf47..9a3e855a13c82eee3f1c4fa0537e4d3ac4a6f46b 100644 (file)
@@ -615,6 +615,9 @@ struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, st
        if (!smp)
                return NULL;
 
+       if ((smp->flags & SMP_F_MAY_CHANGE) && !(opt & SMP_OPT_FINAL))
+               return NULL; /* we can only use stable samples */
+
        if (!sample_to_key[smp->type][t->type])
                return NULL;