]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MAJOR] ported appsession to use mempools v2
authorWilly Tarreau <w@1wt.eu>
Sun, 13 May 2007 19:29:55 +0000 (21:29 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 13 May 2007 19:29:55 +0000 (21:29 +0200)
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.

include/common/appsession.h
src/appsession.c
src/haproxy.c
src/proto_http.c

index 8fa681cae1031ff46dcf89ea853fa85045106d61..46872986b4a8a64a755b68b5793920d5f71fdc2e 100644 (file)
@@ -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;
index bf26510e40a8e28cd5c9926e9b78f95defff7e9d..50554a50d07e2f064b12b787505e74728a6dc21a 100644 (file)
@@ -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 )
index c88bffcd4df3b3147e247e30599cedc04030ace3..7f5641c4f568b29f1d6ae137db70fddaf2afee38 100644 (file)
@@ -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() */
 
index d1bfdcf22f22a7c9372f08c760767d0f898acd1f..51d265cb908de70f867e0a2481e646d5dfdb263b 100644 (file)
@@ -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);