costin 02/05/03 10:49:05 Modified: jk/native2/common jk_worker_lb.c Log: Try to fix the 'default worker' case. An lbfactor of 0 means the worker is used exclusively ( as long as it's alive). Revision Changes Path 1.5 +65 -27 jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c Index: jk_worker_lb.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- jk_worker_lb.c 25 Apr 2002 19:21:58 -0000 1.4 +++ jk_worker_lb.c 3 May 2002 17:49:04 -0000 1.5 @@ -60,7 +60,7 @@ * several workers. * * Author: Gal Shachor <[EMAIL PROTECTED]> * * Based on: * - * Version: $Revision: 1.4 $ * + * Version: $Revision: 1.5 $ * ***************************************************************************/ #include "jk_pool.h" @@ -114,17 +114,18 @@ double lb_min = 0.0; int i; char *session_route; + time_t now = 0; session_route = jk2_requtil_getSessionRoute(env, s); if(session_route) { for(i = 0 ; i < lb->num_of_workers ; i++) { - if(0 == strcmp(session_route, lb->lb_workers[i]->mbean->name)) { + if(0 == strcmp(session_route, lb->lb_workers[i]->route)) { if(attempt > 0 && lb->lb_workers[i]->in_error_state) { break; } else { return lb->lb_workers[i]; - } + } } } } @@ -133,7 +134,8 @@ for(i = 0 ; i < lb->num_of_workers ; i++) { if(lb->lb_workers[i]->in_error_state) { if(!lb->lb_workers[i]->in_recovering) { - time_t now = time(0); + if( now==0 ) + now = time(NULL); if((now - lb->lb_workers[i]->error_time) > WAIT_BEFORE_RECOVER) { @@ -146,14 +148,25 @@ } } } else { - if(lb->lb_workers[i]->lb_value < lb_min || !rc) { + if(lb->lb_workers[i]->lb_value == 0 ) { + /* That's the 'default' worker, it'll take all requests. + * All other workers are not used unless this is in error state. + * + * The 'break' will disable checking for recovery on other + * workers - but that doesn't matter as long as the default is alive. + */ + rc=lb->lb_workers[i]; + break; + } + if(lb->lb_workers[i]->lb_value < lb_min || + ( rc==NULL ) ) { lb_min = lb->lb_workers[i]->lb_value; rc = lb->lb_workers[i]; } } } - if ( !rc ) { + if ( rc==NULL ) { /* no workers found (rc is null), now try as hard as possible to get a worker anyway, pick one with largest error time.. */ for(i = 0 ; i < lb->num_of_workers ; i++) { @@ -164,7 +177,7 @@ not continue to be retried over and over again. */ if ( lb->lb_workers[i]->retry_count == 0 ) { - if ( rc ) { + if ( rc != NULL ) { /* pick the oldest failed worker */ if ( lb->lb_workers[i]->error_time < rc->error_time ) { rc = lb->lb_workers[i]; @@ -185,7 +198,8 @@ } if ( rc && rc->in_error_state ) { - time_t now = time(0); + if(now==0) + now = time(0); rc->in_recovering = JK_TRUE; rc->error_time = now; rc->retry_count++; @@ -193,7 +207,12 @@ } if(rc) { - rc->lb_value += rc->lb_factor; + if( rc->lb_value != 0 ) { + /* It it's the default, it'll remain the default - we don't + increase the factor + */ + rc->lb_value += rc->lb_factor; + } } return rc; @@ -232,7 +251,22 @@ /* */ char *instanceId=slot->name+7; char *data=slot->data; + jk_msg_t *msg; + int chCnt; + + msg=jk2_msg_ajp_create2( env, env->tmpPool, slot->data, slot->size); + chCnt=msg->getInt(env, msg ); + env->l->jkLog(env, env->l, JK_LOG_INFO, + "lb.updateWorkers() Reading %s %d channels \n", + slot->name, chCnt ); + + if( chCnt == 0 ) { + /* Remove all channels used by this tomcat instance */ + + } + /* Create all channels we don't have */ + /* XXX Not sure what's the best solution, we can do it in many ways */ } } @@ -313,11 +347,15 @@ s->jvm_route = s->pool->pstrdup(env, s->pool, rec->mbean->name); + rec->reqCnt++; + rc = rec->service(env, rec, s); if(rc==JK_OK) { if(rec->in_recovering) { - rec->lb_value = jk2_get_max_lb(rec) + ADDITINAL_WAIT_LOAD; + /* Don't change '0' XXX A special flag may avoid those strange tests */ + if( rec->lb_value != 0 ) + rec->lb_value = jk2_get_max_lb(rec) + ADDITINAL_WAIT_LOAD; } rec->in_error_state = JK_FALSE; rec->in_recovering = JK_FALSE; @@ -370,8 +408,8 @@ lb->lb_workers_size = 2 * lb->lb_workers_size; } lb->lb_workers = - lb->pool->alloc(env, lb->pool, - lb->lb_workers_size * sizeof(jk_worker_t *)); + lb->mbean->pool->alloc(env, lb->mbean->pool, + lb->lb_workers_size * sizeof(jk_worker_t *)); if(!lb->lb_workers) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "lb_worker.validate(): OutOfMemoryException\n"); @@ -389,13 +427,18 @@ continue; } - lb->lb_workers[currentWorker]=w; - - if( w->lb_factor == 0 ) - w->lb_factor = DEFAULT_LB_FACTOR; + if( w->lb_factor != 0 ) { + w->lb_factor = 1/ w->lb_factor; + lb->lb_workers[currentWorker]=w; + } else { + /* If == 0, then this is the default worker. Switch it with the first + worker to avoid looking too much for it. + */ + jk_worker_t *first=lb->lb_workers[0]; + lb->lb_workers[0]=w; + lb->lb_workers[currentWorker]=first; + } - w->lb_factor = - 1/ w->lb_factor; /* * Allow using lb in fault-tolerant mode. @@ -403,8 +446,7 @@ * a worker used only when principal is down or session route * point to it. Provided by Paul Frieden <[EMAIL PROTECTED]> */ - w->lb_value = - w->lb_factor; + w->lb_value = w->lb_factor; w->in_error_state = JK_FALSE; w->in_recovering = JK_FALSE; w->retry_count = 0; @@ -417,7 +459,7 @@ static int JK_METHOD jk2_lb_addWorker(jk_env_t *env, jk_worker_t *lb, char *name) { - name = lb->pool->pstrdup(env, lb->pool, name); + name = lb->mbean->pool->pstrdup(env, lb->mbean->pool, name); lb->lbWorkerMap->add(env, lb->lbWorkerMap, name, ""); env->l->jkLog(env, env->l, JK_LOG_INFO, @@ -437,7 +479,7 @@ char *tmp; if( strcmp( name, "balanced_workers") == 0 ) { - worker_names=jk2_config_split( env, lb->pool, + worker_names=jk2_config_split( env, lb->mbean->pool, value, NULL, &num_of_workers ); if( worker_names==NULL || num_of_workers==0 ) { env->l->jkLog(env, env->l, JK_LOG_ERROR, @@ -501,8 +543,6 @@ } */ - w->pool->close(env, w->pool); - return JK_OK; } @@ -526,8 +566,6 @@ return JK_ERR; } - w->pool=pool; - w->lb_workers = NULL; w->num_of_workers = 0; w->worker_private = NULL; @@ -535,7 +573,7 @@ w->destroy = jk2_lb_destroy; w->service = jk2_lb_service; - jk2_map_default_create(env,&w->lbWorkerMap, w->pool); + jk2_map_default_create(env,&w->lbWorkerMap, pool); result->setAttribute=jk2_lb_setProperty; result->object=w;
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>