]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] stktable: add a stktable_update_key() function
authorWilly Tarreau <w@1wt.eu>
Sun, 20 Jun 2010 10:27:21 +0000 (12:27 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 10 Aug 2010 16:04:14 +0000 (18:04 +0200)
This function looks up a key, updates its expiration date, or creates
it if it was not found. acl_fetch_src_updt_conn_cnt() was updated to
make use of it.

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

index 7cfeaae234b542fa878c498a664383bac81f18d5..6b80eef45bc7fac9da66603f54ec44db8622a2f9 100644 (file)
@@ -42,6 +42,7 @@ struct stksess *stktable_store(struct stktable *t, struct stksess *ts);
 struct stksess *stktable_touch(struct stktable *t, struct stksess *ts);
 struct stksess *stktable_lookup(struct stktable *t, struct stksess *ts);
 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 proxy *px, struct session *l4,
                                        void *l7, int dir, struct pattern_expr *expr,
                                        unsigned long table_type);
index 97153dc046cbfccc82ad3eb73b80122bf3dff1c3..2c115767cd1870be2786ae21edc9acde79541f9c 100644 (file)
@@ -2222,15 +2222,9 @@ acl_fetch_src_updt_conn_cnt(struct proxy *px, struct session *l4, void *l7, int
        if (!px)
                return 0; /* table not found */
 
-       if ((ts = stktable_lookup_key(&px->table, key)) == NULL) {
-               /* entry does not exist, initialize a new one */
-               ts = stksess_new(&px->table, key);
-               if (!ts)
-                       return 0;
-               stktable_store(&px->table, ts);
-       }
-       else
-               stktable_touch(&px->table, ts);
+       if ((ts = stktable_update_key(&px->table, key)) == NULL)
+               /* entry does not exist and could not be created */
+               return 0;
 
        ptr = stktable_data_ptr(&px->table, ts, STKTABLE_DT_CONN_CNT);
        if (!ptr)
index c0848c345dbe3bd106f0996cd5f85f6ab2c064c2..471424a83c36569444ec9cdf74b46e2b2df00f14 100644 (file)
@@ -180,6 +180,26 @@ struct stksess *stktable_lookup_key(struct stktable *t, struct stktable_key *key
        return ebmb_entry(eb, struct stksess, key);
 }
 
+/* Lookup and touch <key> in <table>, or create the entry if it does not exist.
+ * This is mainly used for situations where we want to refresh a key's usage so
+ * that it does not expire, and we want to have it created if it was not there.
+ * The stksess is returned, or NULL if it could not be created.
+ */
+struct stksess *stktable_update_key(struct stktable *table, struct stktable_key *key)
+{
+       struct stksess *ts;
+
+       ts = stktable_lookup_key(table, key);
+       if (likely(ts))
+               return stktable_touch(table, ts);
+
+       /* entry does not exist, initialize a new one */
+       ts = stksess_new(table, key);
+       if (likely(ts))
+               stktable_store(table, ts);
+       return ts;
+}
+
 /*
  * Looks in table <t> for a sticky session with same key as <ts>.
  * Returns pointer on requested sticky session or NULL if none was found.