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

2005-09-15 Thread mturk
mturk   2005/09/15 22:52:26

  Modified:jk/native/common jk_lb_worker.c jk_shm.c jk_shm.h
jk_status.c
  Log:
  Fix bug #36525 by properly aligning shared memory header struct.
  This patch was provided and investigated by Rainer Jung. Thaks!
  
  Also bring back 64 bit sizes, because the problem was not with them,
  but rather they've cause different struct alignment.
  
  Revision  ChangesPath
  1.94  +5 -5  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.93
  retrieving revision 1.94
  diff -u -r1.93 -r1.94
  --- jk_lb_worker.c14 Sep 2005 06:50:14 -  1.93
  +++ jk_lb_worker.c16 Sep 2005 05:52:26 -  1.94
  @@ -225,8 +225,8 @@
   {
   unsigned int i;
   int total_factor = 0;
  -size_t mytraffic = 0;
  -size_t curmin = 0;
  +jk_u64_t mytraffic = 0;
  +jk_u64_t curmin = 0;
   
   worker_record_t *candidate = NULL;
   if (p-lblock == JK_LB_LOCK_PESSIMISTIC)
  @@ -328,8 +328,8 @@
jk_logger_t *l)
   {
   unsigned int i;
  -size_t mytraffic = 0;
  -size_t curmin = 0;
  +jk_u64_t mytraffic = 0;
  +jk_u64_t curmin = 0;
   worker_record_t *candidate = NULL;
   double diff;
   time_t now = time(NULL);
  
  
  
  1.20  +33 -22jakarta-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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- jk_shm.c  12 Sep 2005 12:53:05 -  1.19
  +++ jk_shm.c  16 Sep 2005 05:52:26 -  1.20
  @@ -26,8 +26,8 @@
   #include jk_mt.h
   #include jk_shm.h
   
  -/** jk shm header record structure */
  -struct jk_shm_header
  +/** jk shm header core data structure */
  +struct jk_shm_header_data
   {
   /* Shared memory magic JK_SHM_MAGIC */
   char   magic[8];
  @@ -36,6 +36,17 @@
   unsigned int childs;
   unsigned int workers;
   time_t modified;
  +};
  +
  +typedef struct jk_shm_header_data jk_shm_header_data_t;
  +
  +/** jk shm header record structure */
  +struct jk_shm_header
  +{
  +union {
  +jk_shm_header_data_t data;
  +char alignbuf[JK_SHM_ALIGN(sizeof(jk_shm_header_data_t))];
  +};
   char   buf[1];
   };
   
  @@ -116,13 +127,13 @@
   jk_shmem.filename = memory;
   jk_shmem.fd   = 0;
   jk_shmem.attached = 0;
  -memcpy(jk_shmem.hdr-magic, shm_signature, 8);
  -jk_shmem.hdr-size = sz;
  +memcpy(jk_shmem.hdr-data.magic, shm_signature, 8);
  +jk_shmem.hdr-data.size = sz;
   JK_INIT_CS((jk_shmem.cs), rc);
   if (JK_IS_DEBUG_LEVEL(l))
   jk_log(l, JK_LOG_DEBUG,
  Initialized shared memory size=%u free=%u addr=%#lx,
  -   jk_shmem.size, jk_shmem.hdr-size, jk_shmem.hdr);
  +   jk_shmem.size, jk_shmem.hdr-data.size, jk_shmem.hdr);
   JK_TRACE_EXIT(l);
   return 0;
   }
  @@ -132,12 +143,12 @@
   JK_TRACE_ENTER(l);
   if (!jk_shm_open(fname, sz, l)) {
   jk_shmem.attached = 1;
  -jk_shmem.hdr-childs++;
  +jk_shmem.hdr-data.childs++;
   if (JK_IS_DEBUG_LEVEL(l))
   jk_log(l, JK_LOG_DEBUG,
  Attached shared memory [%d] size=%u free=%u addr=%#lx,
  -   jk_shmem.hdr-childs, jk_shmem.hdr-size,
  -   jk_shmem.hdr-size - jk_shmem.hdr-pos,
  +   jk_shmem.hdr-data.childs, jk_shmem.hdr-data.size,
  +   jk_shmem.hdr-data.size - jk_shmem.hdr-data.pos,
  jk_shmem.hdr);
   JK_TRACE_EXIT(l);
   return 0;
  @@ -306,20 +317,20 @@
   /* Clear shared memory */
   if (!attached) {
   memset(jk_shmem.hdr, 0, jk_shmem.size);
  -memcpy(jk_shmem.hdr-magic, shm_signature, 8);
  -jk_shmem.hdr-size = sz;
  +memcpy(jk_shmem.hdr-data.magic, shm_signature, 8);
  +jk_shmem.hdr-data.size = sz;
   if (JK_IS_DEBUG_LEVEL(l))
   jk_log(l, JK_LOG_DEBUG,
  Initialized shared memory size=%u free=%u addr=%#lx,
  -   jk_shmem.size, jk_shmem.hdr-size, jk_shmem.hdr);
  +   jk_shmem.size, jk_shmem.hdr-data.size, jk_shmem.hdr);
   }
   else {
  -jk_shmem.hdr-childs++;
  +jk_shmem.hdr-data.childs++;
   if (JK_IS_DEBUG_LEVEL(l))
   jk_log(l, JK_LOG_INFO,
  Attached shared memory [%d] size=%u free=%u addr=%#lx,
  -   jk_shmem.hdr-childs, jk_shmem.hdr-size,
  -   jk_shmem.hdr-size - jk_shmem.hdr-pos,
  +  

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

2005-09-12 Thread mturk
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  ChangesPath
  1.92  +39 -12jakarta-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.c14 Jun 2005 06:34:13 -  1.91
  +++ jk_lb_worker.c12 Sep 2005 12:53:05 -  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)) {