MEDIUM: session: update the session's stick counters upon session_free()

Whenever session_free() is called, any possible stick counter stored in
the session will be synchronized.
This commit is contained in:
Willy Tarreau 2015-04-04 16:31:16 +02:00
parent 8b7f8688ee
commit bb2ef12a60
2 changed files with 30 additions and 0 deletions

View File

@ -30,10 +30,37 @@
#include <types/global.h>
#include <types/session.h>
#include <proto/stick_table.h>
extern struct pool_head *pool2_session;
void session_free(struct session *sess);
int init_session();
/* Remove the refcount from the session to the tracked counters, and clear the
* pointer to ensure this is only performed once. The caller is responsible for
* ensuring that the pointer is valid first.
*/
static inline void session_store_counters(struct session *sess)
{
void *ptr;
int i;
for (i = 0; i < MAX_SESS_STKCTR; i++) {
struct stkctr *stkctr = &sess->stkctr[i];
if (!stkctr_entry(stkctr))
continue;
ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_CONN_CUR);
if (ptr)
stktable_data_cast(ptr, conn_cur)--;
stkctr_entry(stkctr)->ref_cnt--;
stksess_kill_if_expired(stkctr->table, stkctr_entry(stkctr));
stkctr_set_entry(stkctr, NULL);
}
}
#endif /* _PROTO_SESSION_H */
/*

View File

@ -18,10 +18,13 @@
#include <types/global.h>
#include <types/session.h>
#include <proto/session.h>
struct pool_head *pool2_session;
void session_free(struct session *sess)
{
session_store_counters(sess);
pool_free2(pool2_session, sess);
}