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]