mturk       2004/08/10 06:50:53

  Modified:    ajp/proxy proxy_util.c mod_proxy.h
  Log:
  Shared memory support. The shared memory is inside
  apache scoreboard. If it ever gets back ported we could use it on 2.0
  
  Revision  Changes    Path
  1.23      +45 -12    jakarta-tomcat-connectors/ajp/proxy/proxy_util.c
  
  Index: proxy_util.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/proxy_util.c,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- proxy_util.c      9 Aug 2004 15:07:20 -0000       1.22
  +++ proxy_util.c      10 Aug 2004 13:50:53 -0000      1.23
  @@ -16,6 +16,7 @@
   /* Utility routines for Apache proxy */
   #include "mod_proxy.h"
   #include "ap_mpm.h"
  +#include "scoreboard.h"
   #include "apr_version.h"
   
   #if (APR_MAJOR_VERSION < 1)
  @@ -23,6 +24,9 @@
   #define apr_socket_create apr_socket_create_ex
   #endif
   
  +/* Global balancer counter */
  +static int lb_workers = 0;
  +
   static int proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r);
   static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r);
   static int proxy_match_hostname(struct dirconn_entry *This, request_rec *r);
  @@ -1038,7 +1042,7 @@
               return "can not create thread mutex";
       }
   #endif
  -    
  +
       return NULL;
   }
   
  @@ -1137,52 +1141,76 @@
   }
   
   PROXY_DECLARE(void) 
  -ap_proxy_add_worker_to_balancer(proxy_balancer *balancer, proxy_worker *worker)
  +ap_proxy_add_worker_to_balancer(apr_pool_t *pool, proxy_balancer *balancer, 
proxy_worker *worker)
   {
       int i;
       double median, ffactor = 0.0;
  -    proxy_runtime_worker *runtime, *workers;
  +    proxy_runtime_worker *runtime, *workers;    
  +#if PROXY_HAS_SCOREBOARD
  +    lb_score *score;
  +#else
  +    void *score;
  +#endif
   
  +#if PROXY_HAS_SCOREBOARD
  +    int mpm_daemons;
  +
  +    ap_mpm_query(AP_MPMQ_HARD_LIMIT_DAEMONS, &mpm_daemons);
  +    /* Check if we are prefork or single child */
  +    if (worker->hmax && mpm_daemons > 1)
  +        score = ap_get_scoreboard_lb(getpid(), lb_workers);
  +    else
  +#endif
  +    {
  +        /* Use the plain memory */
  +        score = apr_pcalloc(pool, sizeof(proxy_runtime_stat));
  +    }
  +    if (!score)
  +        return;
       runtime = apr_array_push(balancer->workers);
       runtime->w = worker;
  +    runtime->s = (proxy_runtime_stat *)score;
  +    runtime->s->id = lb_workers;
  +    /* TODO: deal with the dynamic overflow */
  +    ++lb_workers;
   
       /* Recalculate lbfactors */
       workers = (proxy_runtime_worker *)balancer->workers->elts;
   
       for (i = 0; i < balancer->workers->nelts; i++) {
           /* Set to the original configuration */
  -        workers[i].lbfactor = workers[i].w->lbfactor;
  -        ffactor += workers[i].lbfactor;
  +        workers[i].s->lbfactor = workers[i].w->lbfactor;
  +        ffactor += workers[i].s->lbfactor;
       }
       if (ffactor < 100.0) {
           int z = 0;
           for (i = 0; i < balancer->workers->nelts; i++) {
  -            if (workers[i].lbfactor == 0.0) 
  +            if (workers[i].s->lbfactor == 0.0) 
                   ++z;
           }
           if (z) {
               median = (100.0 - ffactor) / z;
               for (i = 0; i < balancer->workers->nelts; i++) {
  -                if (workers[i].lbfactor == 0.0) 
  -                    workers[i].lbfactor = median;
  +                if (workers[i].s->lbfactor == 0.0) 
  +                    workers[i].s->lbfactor = median;
               }
           }
           else {
               median = (100.0 - ffactor) / balancer->workers->nelts;
               for (i = 0; i < balancer->workers->nelts; i++)
  -                workers[i].lbfactor += median;
  +                workers[i].s->lbfactor += median;
           }
       }
       else if (ffactor > 100.0) {
           median = (ffactor - 100.0) / balancer->workers->nelts;
           for (i = 0; i < balancer->workers->nelts; i++) {
  -            if (workers[i].lbfactor > median)
  -                workers[i].lbfactor -= median;
  +            if (workers[i].s->lbfactor > median)
  +                workers[i].s->lbfactor -= median;
           }
       } 
       for (i = 0; i < balancer->workers->nelts; i++) {
           /* Update the status entires */
  -        workers[i].lbstatus = workers[i].lbfactor;
  +        workers[i].s->lbstatus = workers[i].s->lbfactor;
       }
   }
   
  @@ -1756,4 +1784,9 @@
       ap_run_pre_connection(conn->connection, conn->sock);
   
       return OK;
  +}
  +
  +PROXY_DECLARE(int) ap_proxy_lb_workers(void)
  +{
  +    return (lb_workers + PROXY_DYNAMIC_BALANCER_LIMIT);
   }
  
  
  
  1.29      +25 -4     jakarta-tomcat-connectors/ajp/proxy/mod_proxy.h
  
  Index: mod_proxy.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/mod_proxy.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- mod_proxy.h       9 Aug 2004 15:06:24 -0000       1.28
  +++ mod_proxy.h       10 Aug 2004 13:50:53 -0000      1.29
  @@ -256,12 +256,18 @@
   
   /* Runtime worker status informations. Shared in scoreboard */
   typedef struct {
  -    proxy_balancer  *b;         /* balancer containing this worker */
  -    proxy_worker    *w;
  -    double          lbfactor;   /* dynamic lbfactor */
  +    int             id;         /* scoreboard id */
       double          lbstatus;   /* Current lbstatus */
  +    double          lbfactor;   /* dynamic lbfactor */
       apr_size_t      transfered; /* Number of bytes transfered to remote */
       apr_size_t      readed;     /* Number of bytes readed from remote */
  +} proxy_runtime_stat;
  +
  +/* Runtime worker. */
  +typedef struct {
  +    proxy_balancer     *b;         /* balancer containing this worker */
  +    proxy_worker       *w;
  +    proxy_runtime_stat *s;
   } proxy_runtime_worker;
   
   struct proxy_balancer {
  @@ -270,6 +276,11 @@
       const char *sticky;          /* sticky session identifier */
       int         sticky_force;    /* Disable failover for sticky sessions */
       apr_interval_time_t timeout; /* Timeout for waiting on free connection */
  +    /* XXX: Perhaps we will need the proc mutex too.
  +     * Altrough we are only using arithmetic operations
  +     * it may lead to a incorrect calculations.
  +     * For now use only the thread mutex.
  +     */
   #if APR_HAS_THREADS
       apr_thread_mutex_t  *mutex;  /* Thread lock for updating lb params */
   #endif
  @@ -368,7 +379,7 @@
   PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker, apr_pool_t 
*p, proxy_server_conf *conf, const char *url);
   PROXY_DECLARE(struct proxy_balancer *) ap_proxy_get_balancer(apr_pool_t *p, 
proxy_server_conf *conf, const char *url);
   PROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer, 
apr_pool_t *p, proxy_server_conf *conf, const char *url);
  -PROXY_DECLARE(void) ap_proxy_add_worker_to_balancer(proxy_balancer *balancer, 
proxy_worker *worker);
  +PROXY_DECLARE(void) ap_proxy_add_worker_to_balancer(apr_pool_t *pool, 
proxy_balancer *balancer, proxy_worker *worker);
   PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker, proxy_balancer 
**balancer, request_rec *r, proxy_server_conf *conf, char **url);
   PROXY_DECLARE(int) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, 
proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn,
                                                    apr_pool_t *ppool, apr_uri_t *uri, 
char **url, const char *proxyname, apr_port_t proxyport,
  @@ -378,6 +389,16 @@
   PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn);
   PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, 
proxy_conn_rec *conn, proxy_worker *worker, server_rec *s);
   PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, 
proxy_conn_rec *conn, conn_rec *c, server_rec *s);
  +
  +/* Scoreboard */
  +#if MODULE_MAGIC_NUMBER_MAJOR > 20020903
  +#define PROXY_HAS_SCOREBOARD 1
  +#else
  +#define PROXY_HAS_SCOREBOARD 0
  +#endif
  +/* The number of dynamic balancers that can be added */
  +#define PROXY_DYNAMIC_BALANCER_LIMIT    16
  +PROXY_DECLARE(int) ap_proxy_lb_workers(void);
   
   /* For proxy_util */
   extern module PROXY_DECLARE_DATA proxy_module;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to