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);
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)
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.