|
|
- 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
-
|