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]