mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-16 18:46:54 +00:00
[MAJOR] ported appsession to use mempools v2
Also during this process, a bug was found in appsession_refresh(). It would not automatically requeue the task in the queue, so the old sessions would not vanish.
This commit is contained in:
parent
e4d7e55061
commit
63963c62e7
@ -10,6 +10,7 @@
|
||||
#include <common/config.h>
|
||||
#include <common/hashpjw.h>
|
||||
#include <common/list.h>
|
||||
#include <common/memory.h>
|
||||
|
||||
#include <types/task.h>
|
||||
|
||||
@ -20,14 +21,11 @@ typedef struct appsessions {
|
||||
unsigned long int request_count;
|
||||
} appsess;
|
||||
|
||||
#define sizeof_appsess sizeof(struct appsessions)
|
||||
extern void **pool_appsess;
|
||||
extern struct pool_head *pool2_appsess;
|
||||
|
||||
struct app_pool {
|
||||
void **sessid;
|
||||
void **serverid;
|
||||
int ses_waste, ses_use, ses_msize;
|
||||
int ser_waste, ser_use, ser_msize;
|
||||
struct pool_head *sessid;
|
||||
struct pool_head *serverid;
|
||||
};
|
||||
|
||||
extern struct app_pool apools;
|
||||
|
@ -2,6 +2,7 @@
|
||||
* AppSession functions.
|
||||
*
|
||||
* Copyright 2004-2006 Alexander Lazic, Klaus Wagner
|
||||
* Copyright 2006-2007 Willy Tarreau
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@ -17,6 +18,7 @@
|
||||
#include <common/chtbl.h>
|
||||
#include <common/config.h>
|
||||
#include <common/list.h>
|
||||
#include <common/memory.h>
|
||||
#include <common/time.h>
|
||||
|
||||
#include <types/buffers.h>
|
||||
@ -27,7 +29,7 @@
|
||||
#include <proto/task.h>
|
||||
|
||||
|
||||
void **pool_appsess = NULL;
|
||||
struct pool_head *pool2_appsess;
|
||||
struct app_pool apools;
|
||||
int have_appsession;
|
||||
|
||||
@ -72,30 +74,40 @@ int appsession_init(void)
|
||||
struct proxy *p = proxy;
|
||||
|
||||
if (!initialized) {
|
||||
pool2_appsess = create_pool("appsess", sizeof(appsess), MEM_F_SHARED);
|
||||
if (pool2_appsess == NULL)
|
||||
return -1;
|
||||
|
||||
if (!appsession_task_init()) {
|
||||
int ser_msize, ses_msize;
|
||||
|
||||
apools.sessid = NULL;
|
||||
apools.serverid = NULL;
|
||||
apools.ser_waste = 0;
|
||||
apools.ser_use = 0;
|
||||
apools.ser_msize = sizeof(void *);
|
||||
apools.ses_waste = 0;
|
||||
apools.ses_use = 0;
|
||||
apools.ses_msize = sizeof(void *);
|
||||
|
||||
ser_msize = sizeof(void *);
|
||||
ses_msize = sizeof(void *);
|
||||
while (p) {
|
||||
s = p->srv;
|
||||
if (apools.ses_msize < p->appsession_len)
|
||||
apools.ses_msize = p->appsession_len;
|
||||
if (ses_msize < p->appsession_len)
|
||||
ses_msize = p->appsession_len;
|
||||
while (s) {
|
||||
idlen = strlen(s->id);
|
||||
if (apools.ser_msize < idlen)
|
||||
apools.ser_msize = idlen;
|
||||
if (ser_msize < idlen)
|
||||
ser_msize = idlen;
|
||||
s = s->next;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
/* we use strings, so reserve space for '\0' */
|
||||
apools.ser_msize ++;
|
||||
apools.ses_msize ++;
|
||||
ser_msize ++;
|
||||
ses_msize ++;
|
||||
|
||||
apools.sessid = create_pool("sessid", ses_msize, MEM_F_SHARED);
|
||||
if (!apools.sessid)
|
||||
return -1;
|
||||
apools.serverid = create_pool("serverid", ser_msize, MEM_F_SHARED);
|
||||
if (!apools.serverid)
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "appsession_task_init failed\n");
|
||||
@ -118,8 +130,8 @@ int appsession_task_init(void)
|
||||
t->state = TASK_IDLE;
|
||||
t->context = NULL;
|
||||
tv_ms_add(&t->expire, &now, TBLCHKINT);
|
||||
task_queue(t);
|
||||
t->process = appsession_refresh;
|
||||
task_queue(t);
|
||||
initialized ++;
|
||||
}
|
||||
return 0;
|
||||
@ -174,6 +186,7 @@ void appsession_refresh(struct task *t, struct timeval *next)
|
||||
p = p->next;
|
||||
}
|
||||
tv_ms_add(&t->expire, &now, TBLCHKINT); /* check expiration every 5 seconds */
|
||||
task_queue(t);
|
||||
*next = t->expire;
|
||||
} /* end appsession_refresh */
|
||||
|
||||
@ -196,12 +209,12 @@ void destroy(void *data) {
|
||||
temp1 = (appsess *)data;
|
||||
|
||||
if (temp1->sessid)
|
||||
pool_free_to(apools.sessid, temp1->sessid);
|
||||
pool_free2(apools.sessid, temp1->sessid);
|
||||
|
||||
if (temp1->serverid)
|
||||
pool_free_to(apools.serverid, temp1->serverid);
|
||||
pool_free2(apools.serverid, temp1->serverid);
|
||||
|
||||
pool_free(appsess, temp1);
|
||||
pool_free2(pool2_appsess, temp1);
|
||||
} /* end destroy */
|
||||
|
||||
void appsession_cleanup( void )
|
||||
|
@ -667,12 +667,12 @@ void deinit(void)
|
||||
pool_destroy(pool_requri);
|
||||
pool_destroy2(pool2_task);
|
||||
pool_destroy(pool_capture);
|
||||
pool_destroy(pool_appsess);
|
||||
pool_destroy2(pool2_appsess);
|
||||
pool_destroy2(pool2_pendconn);
|
||||
|
||||
if (have_appsession) {
|
||||
pool_destroy(apools.serverid);
|
||||
pool_destroy(apools.sessid);
|
||||
pool_destroy2(apools.serverid);
|
||||
pool_destroy2(apools.sessid);
|
||||
}
|
||||
} /* end deinit() */
|
||||
|
||||
|
@ -4298,7 +4298,7 @@ void manage_client_side_cookies(struct session *t, struct buffer *req)
|
||||
|
||||
asession_temp = &local_asession;
|
||||
|
||||
if ((asession_temp->sessid = pool_alloc_from(apools.sessid, apools.ses_msize)) == NULL) {
|
||||
if ((asession_temp->sessid = pool_alloc2(apools.sessid)) == NULL) {
|
||||
Alert("Not enough memory process_cli():asession->sessid:malloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough memory process_cli():asession->sessid:malloc().\n");
|
||||
return;
|
||||
@ -4310,9 +4310,9 @@ void manage_client_side_cookies(struct session *t, struct buffer *req)
|
||||
|
||||
/* only do insert, if lookup fails */
|
||||
if (chtbl_lookup(&(t->be->htbl_proxy), (void *) &asession_temp) != 0) {
|
||||
if ((asession_temp = pool_alloc(appsess)) == NULL) {
|
||||
if ((asession_temp = pool_alloc2(pool2_appsess)) == NULL) {
|
||||
/* free previously allocated memory */
|
||||
pool_free_to(apools.sessid, local_asession.sessid);
|
||||
pool_free2(apools.sessid, local_asession.sessid);
|
||||
Alert("Not enough memory process_cli():asession:calloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough memory process_cli():asession:calloc().\n");
|
||||
return;
|
||||
@ -4323,7 +4323,7 @@ void manage_client_side_cookies(struct session *t, struct buffer *req)
|
||||
chtbl_insert(&(t->be->htbl_proxy), (void *) asession_temp);
|
||||
} else {
|
||||
/* free previously allocated memory */
|
||||
pool_free_to(apools.sessid, local_asession.sessid);
|
||||
pool_free2(apools.sessid, local_asession.sessid);
|
||||
}
|
||||
|
||||
if (asession_temp->serverid == NULL) {
|
||||
@ -4771,7 +4771,7 @@ void manage_server_side_cookies(struct session *t, struct buffer *rtr)
|
||||
size_t server_id_len = strlen(t->srv->id) + 1;
|
||||
asession_temp = &local_asession;
|
||||
|
||||
if ((asession_temp->sessid = pool_alloc_from(apools.sessid, apools.ses_msize)) == NULL) {
|
||||
if ((asession_temp->sessid = pool_alloc2(apools.sessid)) == NULL) {
|
||||
Alert("Not enough Memory process_srv():asession->sessid:malloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough Memory process_srv():asession->sessid:malloc().\n");
|
||||
return;
|
||||
@ -4782,7 +4782,7 @@ void manage_server_side_cookies(struct session *t, struct buffer *rtr)
|
||||
|
||||
/* only do insert, if lookup fails */
|
||||
if (chtbl_lookup(&(t->be->htbl_proxy), (void *) &asession_temp) != 0) {
|
||||
if ((asession_temp = pool_alloc(appsess)) == NULL) {
|
||||
if ((asession_temp = pool_alloc2(pool2_appsess)) == NULL) {
|
||||
Alert("Not enough Memory process_srv():asession:calloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough Memory process_srv():asession:calloc().\n");
|
||||
return;
|
||||
@ -4793,11 +4793,11 @@ void manage_server_side_cookies(struct session *t, struct buffer *rtr)
|
||||
}/* end if (chtbl_lookup()) */
|
||||
else {
|
||||
/* free wasted memory */
|
||||
pool_free_to(apools.sessid, local_asession.sessid);
|
||||
pool_free2(apools.sessid, local_asession.sessid);
|
||||
} /* end else from if (chtbl_lookup()) */
|
||||
|
||||
if (asession_temp->serverid == NULL) {
|
||||
if ((asession_temp->serverid = pool_alloc_from(apools.serverid, apools.ser_msize)) == NULL) {
|
||||
if ((asession_temp->serverid = pool_alloc2(apools.serverid)) == NULL) {
|
||||
Alert("Not enough Memory process_srv():asession->sessid:malloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough Memory process_srv():asession->sessid:malloc().\n");
|
||||
return;
|
||||
@ -4941,7 +4941,7 @@ void get_srv_from_appsession(struct session *t, const char *begin, int len)
|
||||
/* First try if we already have an appsession */
|
||||
asession_temp = &local_asession;
|
||||
|
||||
if ((asession_temp->sessid = pool_alloc_from(apools.sessid, apools.ses_msize)) == NULL) {
|
||||
if ((asession_temp->sessid = pool_alloc2(apools.sessid)) == NULL) {
|
||||
Alert("Not enough memory process_cli():asession_temp->sessid:calloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough Memory process_cli():asession_temp->sessid:calloc().\n");
|
||||
return;
|
||||
@ -4954,9 +4954,9 @@ void get_srv_from_appsession(struct session *t, const char *begin, int len)
|
||||
|
||||
/* only do insert, if lookup fails */
|
||||
if (chtbl_lookup(&(t->be->htbl_proxy), (void *)&asession_temp)) {
|
||||
if ((asession_temp = pool_alloc(appsess)) == NULL) {
|
||||
if ((asession_temp = pool_alloc2(pool2_appsess)) == NULL) {
|
||||
/* free previously allocated memory */
|
||||
pool_free_to(apools.sessid, local_asession.sessid);
|
||||
pool_free2(apools.sessid, local_asession.sessid);
|
||||
Alert("Not enough memory process_cli():asession:calloc().\n");
|
||||
send_log(t->be, LOG_ALERT, "Not enough memory process_cli():asession:calloc().\n");
|
||||
return;
|
||||
@ -4967,7 +4967,7 @@ void get_srv_from_appsession(struct session *t, const char *begin, int len)
|
||||
}
|
||||
else {
|
||||
/* free previously allocated memory */
|
||||
pool_free_to(apools.sessid, local_asession.sessid);
|
||||
pool_free2(apools.sessid, local_asession.sessid);
|
||||
}
|
||||
|
||||
tv_add(&asession_temp->expire, &now, &t->be->appsession_timeout);
|
||||
|
Loading…
Reference in New Issue
Block a user