mturk       2004/12/16 02:56:03

  Modified:    jk/native/common jk_lb_worker.c
  Log:
  Make load balancer thread safe, since we can have a cross request
  corruption of data, so that we don't use the worker that some other
  thread marked as in error state.
  
  Revision  Changes    Path
  1.36      +25 -3     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.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- jk_lb_worker.c    7 Dec 2004 14:29:14 -0000       1.35
  +++ jk_lb_worker.c    16 Dec 2004 10:56:03 -0000      1.36
  @@ -28,6 +28,7 @@
   #include "jk_util.h"
   #include "jk_worker.h"
   #include "jk_lb_worker.h"
  +#include "jk_mt.h"
   
   /*
    * The load balancing code in this 
  @@ -86,6 +87,7 @@
       int local_worker_only;
       int sticky_session;
       int recover_wait_time;
  +    JK_CRIT_SEC cs; 
   };
   
   typedef struct lb_worker lb_worker_t;
  @@ -262,12 +264,20 @@
       int total_factor = 0;
       const char *search_type = search_types[search_id];
       int i;
  -
  +    
       *domain_id = -1;
   
  +    JK_ENTER_CS(&(p->cs), i);
  +    if (!i) {
  +        jk_log(l, JK_LOG_ERROR,
  +               "could not lock load balancer = %s\n",
  +               p->name);
  +        return NULL;
  +    }
       jk_log(l, JK_LOG_DEBUG,
              "searching for %s worker (%s)\n",
              search_type, search_string);
  +
       for (i = start; i < stop; i++) {
          jk_log(l, JK_LOG_DEBUG,
                "testing worker %s (%d) for match with %s (%s)\n",
  @@ -328,11 +338,13 @@
           jk_log(l, JK_LOG_DEBUG,
                  "found worker %s with new load %d in search with %s (%s)\n",
                  rc->name, rc->lb_value, search_type, search_string);
  +        JK_LEAVE_CS(&(p->cs), i);
           return rc;
       }
       jk_log(l, JK_LOG_DEBUG,
              "found no %s (%s) worker\n",
              search_type, search_string);
  +   JK_LEAVE_CS(&(p->cs), i);
       return rc;
   }
   
  @@ -669,6 +681,8 @@
       int i;
   
       lb_worker_t *p = (lb_worker_t *)pThis->worker_private;
  +    JK_TRACE_ENTER(log);
  +
       pThis->retries = jk_get_worker_retries(props, p->name,
                                              JK_RETRIES);
   
  @@ -679,6 +693,13 @@
       if (p->recover_wait_time < WAIT_BEFORE_RECOVER)
           p->recover_wait_time = WAIT_BEFORE_RECOVER;
   
  +    JK_INIT_CS(&(p->cs), i);
  +    if (i == JK_FALSE) {
  +        JK_TRACE_EXIT(log);
  +        return JK_FALSE;
  +    }
  +
  +    JK_TRACE_EXIT(log);
       return JK_TRUE;
   }
   
  @@ -712,10 +733,11 @@
       JK_TRACE_ENTER(l);
   
       if (pThis && *pThis && (*pThis)->worker_private) {
  +        unsigned int i;
           lb_worker_t *private_data = (*pThis)->worker_private;
   
           close_workers(private_data, private_data->num_of_workers, l);
  -
  +        JK_DELETE_CS(&(private_data->cs), i);
           jk_close_pool(&private_data->p);
           free(private_data);
   
  
  
  

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

Reply via email to