mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 22:31:28 +02:00
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:
parent
8b7f8688ee
commit
bb2ef12a60
@ -30,10 +30,37 @@
|
|||||||
#include <types/global.h>
|
#include <types/global.h>
|
||||||
#include <types/session.h>
|
#include <types/session.h>
|
||||||
|
|
||||||
|
#include <proto/stick_table.h>
|
||||||
|
|
||||||
extern struct pool_head *pool2_session;
|
extern struct pool_head *pool2_session;
|
||||||
void session_free(struct session *sess);
|
void session_free(struct session *sess);
|
||||||
int init_session();
|
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 */
|
#endif /* _PROTO_SESSION_H */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -18,10 +18,13 @@
|
|||||||
#include <types/global.h>
|
#include <types/global.h>
|
||||||
#include <types/session.h>
|
#include <types/session.h>
|
||||||
|
|
||||||
|
#include <proto/session.h>
|
||||||
|
|
||||||
struct pool_head *pool2_session;
|
struct pool_head *pool2_session;
|
||||||
|
|
||||||
void session_free(struct session *sess)
|
void session_free(struct session *sess)
|
||||||
{
|
{
|
||||||
|
session_store_counters(sess);
|
||||||
pool_free2(pool2_session, sess);
|
pool_free2(pool2_session, sess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user