|
From d008394057c4fe46ca6eb775c66cc0ff986a5495 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Wed, 25 Jun 2014 16:20:53 +0200
|
|
Subject: [PATCH 5/6] MINOR: stick-table: make stktable_fetch_key() indicate
|
|
why it failed
|
|
|
|
stktable_fetch_key() does not indicate whether it returns NULL because
|
|
the input sample was not found or because it's unstable. It causes trouble
|
|
with track-sc* rules. Just like with sample_fetch_string(), we want it to
|
|
be able to give more information to the caller about what it found. Thus,
|
|
now we use the pointer to a sample passed by the caller, and fill it with
|
|
the information we have about the sample. That way, even if we return NULL,
|
|
the caller has the ability to check whether a sample was found and if it is
|
|
still changing or not.
|
|
(cherry picked from commit b5975defba61e7ef37ae771614166d0970ede04e)
|
|
---
|
|
include/proto/stick_table.h | 2 +-
|
|
src/proto_tcp.c | 4 ++--
|
|
src/session.c | 4 ++--
|
|
src/stick_table.c | 12 +++++++-----
|
|
4 files changed, 12 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/include/proto/stick_table.h b/include/proto/stick_table.h
|
|
index 0c26fbe..57ca223 100644
|
|
--- a/include/proto/stick_table.h
|
|
+++ b/include/proto/stick_table.h
|
|
@@ -48,7 +48,7 @@ struct stksess *stktable_lookup_key(struct stktable *t, struct stktable_key *key
|
|
struct stksess *stktable_update_key(struct stktable *table, struct stktable_key *key);
|
|
struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px,
|
|
struct session *l4, void *l7, unsigned int opt,
|
|
- struct sample_expr *expr);
|
|
+ struct sample_expr *expr, struct sample *smp);
|
|
int stktable_compatible_sample(struct sample_expr *expr, unsigned long table_type);
|
|
int stktable_get_data_type(char *name);
|
|
struct proxy *find_stktable(const char *name);
|
|
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
|
|
index 65c4fda..1aac0d9 100644
|
|
--- a/src/proto_tcp.c
|
|
+++ b/src/proto_tcp.c
|
|
@@ -1027,7 +1027,7 @@ int tcp_inspect_request(struct session *s, struct channel *req, int an_bit)
|
|
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);
|
|
+ key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr, NULL);
|
|
|
|
if (key && (ts = stktable_get_entry(t, key))) {
|
|
session_track_stkctr(&s->stkctr[tcp_trk_idx(rule->action)], t, ts);
|
|
@@ -1228,7 +1228,7 @@ int tcp_exec_req_rules(struct session *s)
|
|
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);
|
|
+ key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr, NULL);
|
|
|
|
if (key && (ts = stktable_get_entry(t, key)))
|
|
session_track_stkctr(&s->stkctr[tcp_trk_idx(rule->action)], t, ts);
|
|
diff --git a/src/session.c b/src/session.c
|
|
index e26f5ad..df85170 100644
|
|
--- a/src/session.c
|
|
+++ b/src/session.c
|
|
@@ -1458,7 +1458,7 @@ static int process_sticking_rules(struct session *s, struct channel *req, int an
|
|
if (ret) {
|
|
struct stktable_key *key;
|
|
|
|
- key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->expr);
|
|
+ key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->expr, NULL);
|
|
if (!key)
|
|
continue;
|
|
|
|
@@ -1561,7 +1561,7 @@ static int process_store_rules(struct session *s, struct channel *rep, int an_bi
|
|
if (ret) {
|
|
struct stktable_key *key;
|
|
|
|
- key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_RES|SMP_OPT_FINAL, rule->expr);
|
|
+ key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_RES|SMP_OPT_FINAL, rule->expr, NULL);
|
|
if (!key)
|
|
continue;
|
|
|
|
diff --git a/src/stick_table.c b/src/stick_table.c
|
|
index c6463ec..a708d3c 100644
|
|
--- a/src/stick_table.c
|
|
+++ b/src/stick_table.c
|
|
@@ -601,15 +601,17 @@ static sample_to_key_fct sample_to_key[SMP_TYPES][STKTABLE_TYPES] = {
|
|
* Process a fetch + format conversion as defined by the sample expression <expr>
|
|
* on request or response considering the <opt> parameter. Returns either NULL if
|
|
* no key could be extracted, or a pointer to the converted result stored in
|
|
- * static_table_key in format <table_type>.
|
|
+ * static_table_key in format <table_type>. If <smp> is not NULL, it will be reset
|
|
+ * and its flags will be initialized so that the caller gets a copy of the input
|
|
+ * sample, and knows why it was not accepted (eg: SMP_F_MAY_CHANGE is present).
|
|
*/
|
|
struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, struct session *l4, void *l7,
|
|
- unsigned int opt,
|
|
- struct sample_expr *expr)
|
|
+ unsigned int opt, struct sample_expr *expr, struct sample *smp)
|
|
{
|
|
- struct sample *smp;
|
|
+ if (smp)
|
|
+ memset(smp, 0, sizeof(*smp));
|
|
|
|
- smp = sample_process(px, l4, l7, opt, expr, NULL);
|
|
+ smp = sample_process(px, l4, l7, opt, expr, smp);
|
|
if (!smp)
|
|
return NULL;
|
|
|
|
--
|
|
1.8.5.5
|
|
|