Author: mturk
Date: Tue Mar 20 23:58:38 2007
New Revision: 520777
URL: http://svn.apache.org/viewvc?view=rev&rev=520777
Log:
Make sure that any change to shared memory is protected by shm lock if the
pessimistic locking is configured.
Modified:
tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c?view=diff&rev=520777&r1=520776&r2=520777
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Tue Mar 20 23:58:38
2007
@@ -864,18 +864,29 @@
s->route = rec->r;
prec = rec;
- if (rec->s->state == JK_LB_STATE_RECOVER)
- rec->s->state = JK_LB_STATE_PROBE;
-
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"service worker=%s route=%s",
rec->s->name, s->route);
+
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
+ if (rec->s->state == JK_LB_STATE_RECOVER)
+ rec->s->state = JK_LB_STATE_PROBE;
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+
while ((!(r=rec->w->get_endpoint(rec->w, &end, l)) || !end) &&
(retry < p->worker->s->retries)) {
retry++;
retry_wait *=2;
+
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
if (retry_wait > JK_LB_MAX_RETRY_WAIT)
retry_wait = JK_LB_MAX_RETRY_WAIT;
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"could not get free endpoint for worker"
@@ -889,8 +900,12 @@
* as in error if the retry number is
* greater then the number of retries.
*/
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
if (rec->s->state != JK_LB_STATE_ERROR)
rec->s->state = JK_LB_STATE_BUSY;
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
jk_log(l, JK_LOG_INFO,
"could not get free endpoint for worker %s (%d
retries)",
rec->s->name, retry);
@@ -973,8 +988,6 @@
if (service_stat == JK_TRUE) {
rec->s->state = JK_LB_STATE_OK;
rec->s->error_time = 0;
- if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
- jk_shm_unlock();
rc = JK_TRUE;
}
else if (service_stat == JK_CLIENT_ERROR) {
@@ -985,8 +998,6 @@
rec->s->client_errors++;
rec->s->state = JK_LB_STATE_OK;
rec->s->error_time = 0;
- if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
- jk_shm_unlock();
jk_log(l, JK_LOG_INFO,
"unrecoverable error %d, request failed."
" Client failed in the middle of request,"
@@ -1004,9 +1015,6 @@
rec->s->errors++;
rec->s->state = JK_LB_STATE_ERROR;
rec->s->error_time = time(NULL);
- if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
- jk_shm_unlock();
-
if (is_service_error != JK_HTTP_SERVER_BUSY) {
/*
* Error is not recoverable - break with an error.
@@ -1024,6 +1032,8 @@
"service failed, worker %s is in error state",
rec->s->name);
}
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
}
if ( rc == -1 ) {
/*
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]