From: Willy Tarreau Date: Sun, 20 Jun 2010 10:27:21 +0000 (+0200) Subject: [MINOR] stktable: add a stktable_update_key() function X-Git-Tag: v1.5-dev8~512 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1f7e925d6a5496fd7c32f690b19a2a2ce11264fb;p=thirdparty%2Fhaproxy.git [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 7cfeaae234..6b80eef45b 100644 --- a/include/proto/stick_table.h +++ b/include/proto/stick_table.h @@ -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); diff --git a/src/session.c b/src/session.c index 97153dc046..2c115767cd 100644 --- a/src/session.c +++ b/src/session.c @@ -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) diff --git a/src/stick_table.c b/src/stick_table.c index c0848c345d..471424a83c 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -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 in , 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 for a sticky session with same key as . * Returns pointer on requested sticky session or NULL if none was found.