|
From ee12145d38a7dee81a20cf232c724ccb7a46ad8b Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Tue, 18 Aug 2015 17:15:20 +0200
|
|
Subject: [PATCH 11/13] BUG/MEDIUM: counters: ensure that src_{inc,clr}_gpc0
|
|
creates a missing entry
|
|
|
|
During 1.5-dev20 there was some code refactoring to make the src_* fetch
|
|
function use the same code as sc_*. Unfortunately this introduced a
|
|
regression where src_* doesn't create an entry anymore if it does not
|
|
exist in the table. The reason is that smp_fetch_sc_stkctr() only calls
|
|
stktable_lookup_key() while src_inc_*/src_clr_* used to make use of
|
|
stktable_update_key() which additionally create the entry if it does
|
|
not exist.
|
|
|
|
There's no point modifying the common function for these two exceptions,
|
|
so instead we now have a function dedicated to the creation of this entry
|
|
for src_* only. It is called when the entry didn't exist, so that requires
|
|
minimal modifications to existing code.
|
|
|
|
Thanks to Thierry Fournier for helping diagnose the issue.
|
|
|
|
This fix must be backported to 1.5.
|
|
(cherry picked from commit 0f4eadd4830279f5ee83aa545728fb750f5c8185)
|
|
|
|
[Note: the backport to 1.5 significantly differs from the version in 1.6
|
|
since we need to use the table's type and to retrieve the source address
|
|
directly from the connection. At least it matches the way other src_*
|
|
fetch functions work, and it's been verified to work fine]
|
|
---
|
|
src/session.c | 33 +++++++++++++++++++++++++++++++++
|
|
1 file changed, 33 insertions(+)
|
|
|
|
diff --git a/src/session.c b/src/session.c
|
|
index 5b9e407..6d62e36 100644
|
|
--- a/src/session.c
|
|
+++ b/src/session.c
|
|
@@ -2806,6 +2806,33 @@ smp_fetch_sc_stkctr(struct session *l4, const struct arg *args, const char *kw)
|
|
return &l4->stkctr[num];
|
|
}
|
|
|
|
+/* same as smp_fetch_sc_stkctr() but dedicated to src_* and can create
|
|
+ * the entry if it doesn't exist yet. This is needed for a few fetch
|
|
+ * functions which need to create an entry, such as src_inc_gpc* and
|
|
+ * src_clr_gpc*.
|
|
+ */
|
|
+struct stkctr *
|
|
+smp_create_src_stkctr(struct session *sess, const struct arg *args, const char *kw)
|
|
+{
|
|
+ static struct stkctr stkctr;
|
|
+ struct stktable_key *key;
|
|
+ struct connection *conn = objt_conn(sess->si[0].end);
|
|
+
|
|
+ if (strncmp(kw, "src_", 4) != 0)
|
|
+ return NULL;
|
|
+
|
|
+ if (!conn)
|
|
+ return NULL;
|
|
+
|
|
+ key = addr_to_stktable_key(&conn->addr.from, args->data.prx->table.type);
|
|
+ if (!key)
|
|
+ return NULL;
|
|
+
|
|
+ stkctr.table = &args->data.prx->table;
|
|
+ stkctr_set_entry(&stkctr, stktable_update_key(stkctr.table, key));
|
|
+ return &stkctr;
|
|
+}
|
|
+
|
|
/* set return a boolean indicating if the requested session counter is
|
|
* currently being tracked or not.
|
|
* Supports being called as "sc[0-9]_tracked" only.
|
|
@@ -2887,6 +2914,9 @@ smp_fetch_sc_inc_gpc0(struct proxy *px, struct session *l4, void *l7, unsigned i
|
|
if (!stkctr)
|
|
return 0;
|
|
|
|
+ if (stkctr_entry(stkctr) == NULL)
|
|
+ stkctr = smp_create_src_stkctr(l4, args, kw);
|
|
+
|
|
smp->flags = SMP_F_VOL_TEST;
|
|
smp->type = SMP_T_UINT;
|
|
smp->data.uint = 0;
|
|
@@ -2924,6 +2954,9 @@ smp_fetch_sc_clr_gpc0(struct proxy *px, struct session *l4, void *l7, unsigned i
|
|
if (!stkctr)
|
|
return 0;
|
|
|
|
+ if (stkctr_entry(stkctr) == NULL)
|
|
+ stkctr = smp_create_src_stkctr(l4, args, kw);
|
|
+
|
|
smp->flags = SMP_F_VOL_TEST;
|
|
smp->type = SMP_T_UINT;
|
|
smp->data.uint = 0;
|
|
--
|
|
2.4.6
|
|
|