Hi all,

Since there was some concerns regarding binary compatibility, here is the
patch that uses different approach.

1. Revert the patch with changes to scoreboard structures
2. Add an extra hook that is run during ap_reopen_scoreboard with detached
param.

We will use our own shm, opening by hooking pre_mpm, and attaching in child
on reopen_scoreboard.

This will resolve any binary compatibility concerns.


Regards,
MT.
Index: scoreboard.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/include/scoreboard.h,v
retrieving revision 1.53
diff -u -r1.53 scoreboard.h
--- scoreboard.h    29 Jul 2004 15:18:40 -0000  1.53
+++ scoreboard.h    29 Jul 2004 18:28:21 -0000
@@ -124,7 +124,6 @@
                                          * should still be serving requests.
                                          */
     apr_time_t restart_time;
-    int             lb_limit;
 } global_score;
 
 /* stuff which the parent generally writes and the children rarely read */
@@ -138,13 +137,6 @@
                              */
 };
 
-/* stuff which is lb specific */
-typedef struct lb_score lb_score;
-struct lb_score{
-    /* TODO: make a real stuct from this */
-    unsigned char data[1024];
-};
-
 /* Scoreboard is now in 'local' memory, since it isn't updated once created,
  * even in forked architectures.  Child created-processes (non-fork) will
  * set up these indicies into the (possibly relocated) shmem records.
@@ -153,7 +145,6 @@
     global_score *global;
     process_score *parent;
     worker_score **servers;
-    lb_score     **balancers;
 } scoreboard;
 
 typedef struct ap_sb_handle_t ap_sb_handle_t;
@@ -179,7 +170,6 @@
 AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y);
 AP_DECLARE(process_score *) ap_get_scoreboard_process(int x);
 AP_DECLARE(global_score *) ap_get_scoreboard_global(void);
-AP_DECLARE(lb_score *) ap_get_scoreboard_lb(int child_num, int lb_num);
 
 AP_DECLARE_DATA extern scoreboard *ap_scoreboard_image;
 AP_DECLARE_DATA extern const char *ap_scoreboard_fname;
@@ -198,11 +188,13 @@
 AP_DECLARE_HOOK(int, pre_mpm, (apr_pool_t *p, ap_scoreboard_e sb_type))
 
 /**
-  * proxy load balancer
-  * @return the number of load balancer workers.
+  * Hook for reopening scoreboard, reopen scoreboard.
+  * @param detached Non-zero if this is a seperate child process. 
+  * @ingroup hooks
+  * @return OK or DECLINE on success; anything else is a error
   */  
-APR_DECLARE_OPTIONAL_FN(int, ap_proxy_lb_workers,
-                        (void));
+AP_DECLARE_HOOK(int, reopen_scoreboard, (int detached))
+
 
 /* for time_process_request() in http_main.c */
 #define START_PREQUEST 1

Index: scoreboard.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/scoreboard.c,v
retrieving revision 1.75
diff -u -r1.75 scoreboard.c
--- scoreboard.c    28 Jul 2004 22:50:54 -0000  1.75
+++ scoreboard.c    29 Jul 2004 18:33:01 -0000
@@ -53,21 +53,23 @@
 
 APR_HOOK_STRUCT(
     APR_HOOK_LINK(pre_mpm)
+    APR_HOOK_LINK(reopen_scoreboard)
 )
  
 AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_mpm,
                           (apr_pool_t *p, ap_scoreboard_e sb_type),
                           (p, sb_type),OK,DECLINED)
 
-static APR_OPTIONAL_FN_TYPE(ap_proxy_lb_workers)
-                                *proxy_lb_workers;
+AP_IMPLEMENT_HOOK_RUN_ALL(int,reopen_scoreboard,
+                          (int detached),
+                          (detached),OK,DECLINED)
 
 struct ap_sb_handle_t {
     int child_num;
     int thread_num;
 };
 
-static int server_limit, thread_limit, lb_limit;
+static int server_limit, thread_limit;
 static apr_size_t scoreboard_size;
 
 /*
@@ -93,18 +95,9 @@
     ap_mpm_query(AP_MPMQ_HARD_LIMIT_THREADS, &thread_limit);
     ap_mpm_query(AP_MPMQ_HARD_LIMIT_DAEMONS, &server_limit);
 
-    if (!proxy_lb_workers)
-        proxy_lb_workers = APR_RETRIEVE_OPTIONAL_FN(ap_proxy_lb_workers);
-    if (proxy_lb_workers)
-        lb_limit = proxy_lb_workers();
-    else
-        lb_limit = 0;
-
     scoreboard_size = sizeof(global_score);
     scoreboard_size += sizeof(process_score) * server_limit;
     scoreboard_size += sizeof(worker_score) * server_limit * thread_limit;
-    if (lb_limit)
-        scoreboard_size += sizeof(lb_score) * server_limit * lb_limit;
 
     return scoreboard_size;
 }
@@ -116,8 +109,7 @@
     
     ap_calc_scoreboard_size();
     ap_scoreboard_image = 
-        calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *) +
-               server_limit * lb_limit * sizeof(lb_score *));
+        calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *));
     more_storage = shared_score;
     ap_scoreboard_image->global = (global_score *)more_storage;
     more_storage += sizeof(global_score);
@@ -129,19 +121,9 @@
         ap_scoreboard_image->servers[i] = (worker_score *)more_storage;
         more_storage += thread_limit * sizeof(worker_score);
     }
-    if (lb_limit) {
-        ap_scoreboard_image->balancers = 
-            (lb_score **)((char*)ap_scoreboard_image + sizeof(scoreboard) +
-                               server_limit * sizeof(worker_score *));
-        for (i = 0; i < server_limit; i++) {
-            ap_scoreboard_image->balancers[i] = (lb_score *)more_storage;
-            more_storage += lb_limit * sizeof(lb_score);
-        }
-    }    
     ap_assert(more_storage == (char*)shared_score + scoreboard_size);
     ap_scoreboard_image->global->server_limit = server_limit;
     ap_scoreboard_image->global->thread_limit = thread_limit;
-    ap_scoreboard_image->global->lb_limit     = lb_limit;
 }
 
 /**
@@ -245,6 +227,7 @@
     if (*shm) {
         *shm = ap_scoreboard_shm;
     }
+    ap_run_reopen_scoreboard(detached);
 #endif
     return APR_SUCCESS;
 }
@@ -285,13 +268,6 @@
             memset(ap_scoreboard_image->servers[i], 0,
                    sizeof(worker_score) * thread_limit);
         }
-        /* Clean up the lb workers data */
-        if (lb_limit) {
-            for (i = 0; i < server_limit; i++) {
-                memset(ap_scoreboard_image->balancers[i], 0,
-                       sizeof(lb_score) * lb_limit);
-            }
-        }        
         return OK;
     }
 
@@ -493,13 +469,4 @@
 AP_DECLARE(global_score *) ap_get_scoreboard_global()
 {
     return ap_scoreboard_image->global;
-}
-
-AP_DECLARE(lb_score *) ap_get_scoreboard_lb(int child_num, int lb_num)
-{
-    if (((child_num < 0) || (server_limit < child_num)) ||
-        ((lb_num < 0) || (lb_limit < lb_num))) {
-        return(NULL); /* Out of range */
-    }
-    return &ap_scoreboard_image->balancers[child_num][lb_num];
 }

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to