Could one of the more senior jtc committers review this for me please? The problem was that jk_lb_refresh was being called for each channel parsed and adding all the workers to the workersTable each time. The result was that the first channel was added to the table n+1 times (where n = total number of workers), the second channel was added n times and the third channel n-1, etc. Consequently the table was getting overrun.
I believe this problem may also account for the first channel(s) getting more load because of the extra copies in the table. -Kurt ----- Original Message ----- From: <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Monday, March 08, 2004 6:01 PM Subject: cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_worker_lb.c > truk 2004/03/08 15:01:07 > > Modified: jk/native2/common jk_worker_lb.c > Log: > Fix bug 23483 > > Only add worker to the workerTable if it is not already there. > Add check for maximum workers too. > > Revision Changes Path > 1.38 +21 -5 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.37 > retrieving revision 1.38 > diff -u -r1.37 -r1.38 > --- jk_worker_lb.c 27 Feb 2004 08:34:18 -0000 1.37 > +++ jk_worker_lb.c 8 Mar 2004 23:01:06 -0000 1.38 > @@ -448,7 +448,8 @@ > char *name = lb->lbWorkerMap->nameAt( env, lb->lbWorkerMap, i); > jk_worker_t *w= env->getByName( env, name ); > int level=0; > - int pos=0; > + int pos; > + int workerCnt; > > if( w== NULL ) { > env->l->jkLog(env, env->l, JK_LOG_ERROR, > @@ -463,12 +464,27 @@ > /* It's like disabled */ > if( level >= JK_LB_LEVELS ) continue; > > - pos=lb->workerCnt[level]++; > + /* check if worker is already in the table */ > + workerCnt = lb->workerCnt[level]; > + for(pos = 0 ; pos < workerCnt ; pos++) { > + if( lb->workerTables[level][pos] == w ) { > + break; > + } > + } > + > + if( pos == workerCnt ) { > + if( pos == JK_LB_MAX_WORKERS ) { > + env->l->jkLog(env, env->l, JK_LOG_ERROR, > + "lb_worker.init(): maximum lb workers reached %s\n", name); > + continue; > + } > + pos=lb->workerCnt[level]++; > > - lb->workerTables[level][pos]=w; > + lb->workerTables[level][pos]=w; > > - w->lb_value = w->lb_factor; > - w->in_error_state = JK_FALSE; > + w->lb_value = w->lb_factor; > + w->in_error_state = JK_FALSE; > + } > } > > return JK_OK; > > > > > -------------------------------------------------------------------- - > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]