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]