]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: stick-table: make stktable_fetch_key() indicate why it failed
authorWilly Tarreau <w@1wt.eu>
Wed, 25 Jun 2014 14:20:53 +0000 (16:20 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 25 Jun 2014 15:17:53 +0000 (17:17 +0200)
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.

include/proto/stick_table.h
src/proto_tcp.c
src/session.c
src/stick_table.c

index 0c26fbea30526c36380fba2ea73e9388eed467f0..57ca2234317caa2e45828f82db406a6d64b79c68 100644 (file)
@@ -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);
index 65c4fdad379e3af349ced64fa3423b17414f742e..1aac0d9225d9e533c1f38463ba987cdef5fb1734 100644 (file)
@@ -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);
index e26f5ad17a6b475cb09fdd2aa3dd9a26b5ad76e4..df85170cd13a7b49e3f7b400c911753a821c154e 100644 (file)
@@ -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;
 
index c6463ec7b95afa313229189948f2612ccb426c6a..a708d3c53386423d000f5dd51c0e217153401b59 100644 (file)
@@ -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;