From: Willy Tarreau Date: Sun, 13 May 2007 19:29:55 +0000 (+0200) Subject: [MAJOR] ported appsession to use mempools v2 X-Git-Tag: v1.3.11~1^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63963c62e7077f2a89a1cc8b2a2fca6f20e50d34;p=thirdparty%2Fhaproxy.git [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. --- diff --git a/include/common/appsession.h b/include/common/appsession.h index 8fa681cae1..46872986b4 100644 --- a/include/common/appsession.h +++ b/include/common/appsession.h @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -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; diff --git a/src/appsession.c b/src/appsession.c index bf26510e40..50554a50d0 100644 --- a/src/appsession.c +++ b/src/appsession.c @@ -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 #include #include +#include #include #include @@ -27,7 +29,7 @@ #include -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 ) diff --git a/src/haproxy.c b/src/haproxy.c index c88bffcd4d..7f5641c4f5 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -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() */ diff --git a/src/proto_http.c b/src/proto_http.c index d1bfdcf22f..51d265cb90 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -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);