You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2005/09/12 14:53:06 UTC

cvs commit: jakarta-tomcat-connectors/jk/native/common jk_lb_worker.c jk_shm.c jk_shm.h jk_status.c

mturk       2005/09/12 05:53:06

  Modified:    jk/native/common jk_lb_worker.c jk_shm.c jk_shm.h
                        jk_status.c
  Log:
  Fix bug #36525 by not using 64 bit ints in shared memory.
  For some strange reasons both Solaris and Irix are core dumping.
  To deal with long running data implement read and transferred as
  function of time, so that the troughput is stored rather then absolute
  value
  
  Revision  Changes    Path
  1.92      +39 -12    jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c
  
  Index: jk_lb_worker.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v
  retrieving revision 1.91
  retrieving revision 1.92
  diff -u -r1.91 -r1.92
  --- jk_lb_worker.c	14 Jun 2005 06:34:13 -0000	1.91
  +++ jk_lb_worker.c	12 Sep 2005 12:53:05 -0000	1.92
  @@ -225,12 +225,27 @@
   {
       unsigned int i;
       int total_factor = 0;
  -    jk_u64_t mytraffic = 0;
  -    jk_u64_t curmin = 0;
  +    size_t mytraffic = 0;
  +    size_t curmin = 0;
   
       worker_record_t *candidate = NULL;
       if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
           jk_shm_lock();
  +
  +    if (p->lbmethod == JK_LB_BYTRAFFIC) {
  +        double diff;
  +        time_t now = time(NULL);
  +        /* Update transfer rate for each worker */
  +        for (i = 0; i < p->num_of_workers; i++) {
  +            diff = difftime(now, p->lb_workers[i].s->service_time);
  +            if (diff > JK_SERVICE_TRANSFER_INTERVAL) {
  +                p->lb_workers[i].s->service_time = now;
  +                p->lb_workers[i].s->readed /= JK_SERVICE_TRANSFER_INTERVAL;
  +                p->lb_workers[i].s->transferred /= JK_SERVICE_TRANSFER_INTERVAL;
  +            }
  +        }
  +    }
  +
       /* First try to see if we have available candidate */
       for (i = 0; i < p->num_of_workers; i++) {
           /* Skip all workers that are not member of domain */
  @@ -248,14 +263,14 @@
                       candidate = &p->lb_workers[i];
               }
               else {
  -                mytraffic = (p->lb_workers[i].s->transferred/p->lb_workers[i].s->lb_factor) +
  -                            (p->lb_workers[i].s->readed/p->lb_workers[i].s->lb_factor);
  +                mytraffic = (p->lb_workers[i].s->transferred +
  +                             p->lb_workers[i].s->readed ) / p->lb_workers[i].s->lb_factor;
                   if (!candidate || mytraffic < curmin) {
                       candidate = &p->lb_workers[i];
                       curmin = mytraffic;
                   }
               }
  -        }        
  +        }
       }
   
       if (candidate) {
  @@ -313,12 +328,22 @@
                                                jk_logger_t *l)
   {
       unsigned int i;
  -    jk_u64_t mytraffic = 0;
  -    jk_u64_t curmin = 0;
  +    size_t mytraffic = 0;
  +    size_t curmin = 0;
       worker_record_t *candidate = NULL;
  +    double diff;
  +    time_t now = time(NULL);
   
       if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
           jk_shm_lock();
  +    for (i = 0; i < p->num_of_workers; i++) {
  +        diff = difftime(now, p->lb_workers[i].s->service_time);
  +        if (diff > JK_SERVICE_TRANSFER_INTERVAL) {
  +            p->lb_workers[i].s->service_time = now;
  +            p->lb_workers[i].s->readed /= JK_SERVICE_TRANSFER_INTERVAL;
  +            p->lb_workers[i].s->transferred /= JK_SERVICE_TRANSFER_INTERVAL;
  +        }
  +    }
       /* First try to see if we have available candidate */
       for (i = 0; i < p->num_of_workers; i++) {
           /* If the worker is in error state run
  @@ -587,8 +612,8 @@
                       jk_log(l, JK_LOG_DEBUG,
                              "service worker=%s jvm_route=%s",
                              rec->s->name, s->jvm_route);
  -                rec->s->elected++;
                   if (rc && end) {
  +                    rec->s->elected++;
                       /* Reset endpoint read and write sizes for
                        * this request.
                        */
  @@ -602,8 +627,10 @@
                           rec->s->max_busy = rec->s->busy;
                       service_stat = end->service(end, s, l, &is_service_error);
                       /* Update partial reads and writes if any */
  -                    rec->s->readed += end->rd;
  -                    rec->s->transferred += end->wr;
  +                    if (p->worker->lbmethod == JK_LB_BYTRAFFIC) {
  +                        rec->s->readed += end->rd;
  +                        rec->s->transferred += end->wr;
  +                    }
                       end->done(&end, l);
                       /* When returning the endpoint mark the worker as not busy.
                        * We have at least one endpoint free
  @@ -815,7 +842,7 @@
                   }
                   if (secret && (p->lb_workers[i].w->type == JK_AJP13_WORKER_TYPE ||
                       p->lb_workers[i].w->type == JK_AJP14_WORKER_TYPE)) {
  -                    ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].w->worker_private; 
  +                    ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].w->worker_private;
                       if (!aw->secret)
                           aw->secret = secret;
                   }
  
  
  
  1.19      +41 -1     jakarta-tomcat-connectors/jk/native/common/jk_shm.c
  
  Index: jk_shm.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_shm.c,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- jk_shm.c	28 Mar 2005 06:36:01 -0000	1.18
  +++ jk_shm.c	12 Sep 2005 12:53:05 -0000	1.19
  @@ -59,6 +59,9 @@
   static jk_shm_t jk_shmem = { 0, NULL, -1, -1, 0, NULL};
   static time_t jk_workers_modified_time = 0;
   static time_t jk_workers_access_time = 0;
  +#if defined (WIN32)
  +static HANDLE jk_shm_map = NULL;
  +#endif
   
   #if defined (WIN32) || defined(NETWARE)
   
  @@ -76,8 +79,37 @@
   
       jk_shmem.size =  JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
   
  +#if defined (WIN32)
  +    if (fname) {
  +        jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE,
  +                                       NULL,
  +                                       PAGE_READWRITE,
  +                                       0,
  +                                       sizeof(jk_shm_header_t) + sz,
  +                                       fname);
  +        if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE &&
  +            GetLastError() == ERROR_ALREADY_EXISTS)
  +            jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname);
  +        if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
  +            JK_TRACE_EXIT(l);
  +            return -1;
  +        }
  +        jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map,
  +                                                        FILE_MAP_ALL_ACCESS,
  +                                                        0,
  +                                                        0,
  +                                                        0);
  +    }
  +    else
  +#endif
       jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size);
       if (!jk_shmem.hdr) {
  +#if defined (WIN32)
  +        if (jk_shm_map) {
  +            CloseHandle(jk_shm_map);
  +            jk_shm_map = NULL;
  +        }
  +#endif
           JK_TRACE_EXIT(l);
           return -1;
       }
  @@ -120,6 +152,14 @@
   {
       if (jk_shmem.hdr) {
           int rc;
  +#if defined (WIN32)
  +        if (jk_shm_map) {
  +            UnmapViewOfFile(jk_shmem.hdr);
  +            CloseHandle(jk_shm_map);
  +            jk_shm_map = NULL;
  +        }
  +        else
  +#endif
           free(jk_shmem.hdr);
           JK_DELETE_CS(&(jk_shmem.cs), rc);
       }
  
  
  
  1.23      +10 -3     jakarta-tomcat-connectors/jk/native/common/jk_shm.h
  
  Index: jk_shm.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_shm.h,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- jk_shm.h	14 Jun 2005 06:34:13 -0000	1.22
  +++ jk_shm.h	12 Sep 2005 12:53:05 -0000	1.23
  @@ -50,6 +50,9 @@
   #define JK_SHM_DEF_SIZE     (JK_SHM_MAX_WORKERS * 1024)
   #define JK_SHM_ALIGN(x)     JK_ALIGN(x, 1024)
   
  +/* Use 1 minute for measuring read/write data */
  +#define JK_SERVICE_TRANSFER_INTERVAL    60
  +
   /** jk shm worker record structure */
   struct jk_shm_worker
   {
  @@ -80,10 +83,14 @@
       int     retries;
       /* Statistical data */
       volatile time_t  error_time;
  +    /* Service transfer rate time */
  +    volatile time_t  service_time;
       /* Number of bytes read from remote */
  -    volatile jk_u64_t readed;
  +    volatile size_t readed;
  +    volatile size_t rd;
       /* Number of bytes transferred to remote */
  -    volatile jk_u64_t transferred;
  +    volatile size_t transferred;
  +    volatile size_t wr;
       /* Number of times the worker was elected */
       volatile size_t  elected;
       /* Number of non 200 responses */
  
  
  
  1.45      +9 -9      jakarta-tomcat-connectors/jk/native/common/jk_status.c
  
  Index: jk_status.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_status.c,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- jk_status.c	14 Jun 2005 14:31:24 -0000	1.44
  +++ jk_status.c	12 Sep 2005 12:53:05 -0000	1.45
  @@ -166,7 +166,7 @@
   }
   
   /* Actually APR's apr_strfsize */
  -static char *status_strfsize(jk_u64_t size, char *buf)
  +static char *status_strfsize(size_t size, char *buf)
   {
       const char ord[] = "KMGTPE";
       const char *o = ord;
  @@ -376,7 +376,7 @@
           jk_printf(s, "    <jk:map type=\"%s\" uri=\"%s\" context=\"%s\" />\n",
                 status_val_match(uwr->match_type),
                 uwr->uri,
  -              uwr->context) ;        
  +              uwr->context) ;
       }
   }
   
  @@ -582,8 +582,8 @@
               "<tr><th>V</th><td>Load Balancer Value</td></tr>\n"
               "<tr><th>Acc</th><td>Number of requests</td></tr>\n"
               "<tr><th>Err</th><td>Number of failed requests</td></tr>\n"
  -            "<tr><th>Wr</th><td>Number of bytes transferred</td></tr>\n"
  -            "<tr><th>Rd</th><td>Number of bytes read</td></tr>\n"
  +            "<tr><th>Wr</th><td>Number of bytes transferred/min</td></tr>\n"
  +            "<tr><th>Rd</th><td>Number of bytes read/min</td></tr>\n"
               "<tr><th>Busy</th><td>Current number of busy connections</td></tr>\n"
               "<tr><th>Max</th><td>Maximum number of busy connections</td></tr>\n"
               "<tr><th>RR</th><td>Route redirect</td></tr>\n"
  @@ -626,10 +626,10 @@
               /* Skip non lb workers */
               continue;
           }
  -        jk_printf(s, "  <jk:balancer id=\"%d\" name=\"%s\" type=\"%s\" sticky=\"%s\" stickyforce=\"%s\" retries=\"%d\" recover=\"%d\" >\n", 
  +        jk_printf(s, "  <jk:balancer id=\"%d\" name=\"%s\" type=\"%s\" sticky=\"%s\" stickyforce=\"%s\" retries=\"%d\" recover=\"%d\" >\n",
                i,
                lb->s->name,
  -             status_worker_type(w->type), 
  +             status_worker_type(w->type),
                status_val_bool(lb->s->sticky_session),
                status_val_bool(lb->s->sticky_session_force),
                lb->s->retries,
  @@ -638,7 +638,7 @@
               worker_record_t *wr = &(lb->lb_workers[j]);
               ajp_worker_t *a = (ajp_worker_t *)wr->w->worker_private;
               /* TODO: descriptive status */
  -            jk_printf(s, "      <jk:member id=\"%d\" name=\"%s\" type=\"%s\" host=\"%s\" port=\"%d\" address=\"%s\" status=\"%s\"", 
  +            jk_printf(s, "      <jk:member id=\"%d\" name=\"%s\" type=\"%s\" host=\"%s\" port=\"%d\" address=\"%s\" status=\"%s\"",
                   j,
                   wr->s->name,
                   status_worker_type(wr->w->type),
  @@ -650,7 +650,7 @@
                                     wr->s->in_error_state,
                                     wr->s->in_recovering,
                                     wr->s->is_busy) );
  -                                      
  +
               jk_printf(s, " lbfactor=\"%d\"", wr->s->lb_factor);
               jk_printf(s, " lbvalue=\"%d\"", wr->s->lb_value);
               jk_printf(s, " elected=\"%u\"", wr->s->elected);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org