[MINOR] stktable: add a stktable_update_key() function
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.
diff --git a/include/proto/stick_table.h b/include/proto/stick_table.h
index 7cfeaae..6b80eef 100644
--- a/include/proto/stick_table.h
+++ b/include/proto/stick_table.h
@@ -42,6 +42,7 @@
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);
diff --git a/src/session.c b/src/session.c
index 97153dc..2c11576 100644
--- a/src/session.c
+++ b/src/session.c
@@ -2222,15 +2222,9 @@
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)
diff --git a/src/stick_table.c b/src/stick_table.c
index c0848c3..471424a 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -180,6 +180,26 @@
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.