|
From 86bd33a9f842caf1788b61d1f99e95f8ad866660 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Wed, 25 Jun 2014 17:01:56 +0200
|
|
Subject: [PATCH 6/6] BUG/MEDIUM: counters: fix track-sc* to wait on unstable
|
|
contents
|
|
|
|
I've been facing multiple configurations which involved track-sc* rules
|
|
in tcp-request content without the "if ..." to force it to wait for the
|
|
contents, resulting in random behaviour with contents sometimes retrieved
|
|
and sometimes not.
|
|
|
|
Reading the doc doesn't make it clear either that the tracking will be
|
|
performed only if data are already there and that waiting on an ACL is
|
|
the only way to avoid this.
|
|
|
|
Since this behaviour is not natural and we now have the ability to fix
|
|
it, this patch ensures that if input data are still moving, instead of
|
|
silently dropping them, we naturally wait for them to stabilize up to
|
|
the inspect-delay. This way it's not needed anymore to implement an
|
|
ACL-based condition to force to wait for data, eventhough the behaviour
|
|
is not changed for when an ACL is present.
|
|
|
|
The most obvious usage will be when track-sc is followed by any HTTP
|
|
sample expression, there's no need anymore for adding "if HTTP".
|
|
|
|
It's probably worth backporting this to 1.5 to avoid further configuration
|
|
issues. Note that it requires previous patch.
|
|
(cherry picked from commit 1b71eb581ec1637879f725421efb95ad69f0ea4f)
|
|
---
|
|
src/proto_tcp.c | 6 +++++-
|
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
|
|
index 1aac0d9..e9dbc9c 100644
|
|
--- a/src/proto_tcp.c
|
|
+++ b/src/proto_tcp.c
|
|
@@ -1022,12 +1022,16 @@ int tcp_inspect_request(struct session *s, struct channel *req, int an_bit)
|
|
* applies.
|
|
*/
|
|
struct stktable_key *key;
|
|
+ struct sample smp;
|
|
|
|
if (stkctr_entry(&s->stkctr[tcp_trk_idx(rule->action)]))
|
|
continue;
|
|
|
|
t = rule->act_prm.trk_ctr.table.t;
|
|
- key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr, NULL);
|
|
+ key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ | partial, rule->act_prm.trk_ctr.expr, &smp);
|
|
+
|
|
+ if (smp.flags & SMP_F_MAY_CHANGE)
|
|
+ goto missing_data;
|
|
|
|
if (key && (ts = stktable_get_entry(t, key))) {
|
|
session_track_stkctr(&s->stkctr[tcp_trk_idx(rule->action)], t, ts);
|
|
--
|
|
1.8.5.5
|
|
|