costin      02/04/11 17:23:07

  Modified:    jk/native2/common jk_worker_lb.c
  Log:
  Fix and test the lb worker.
  
  We'll refresh the internal fields every time a new lb worker is added
  ( it could happen at runtime - until now it was fixed )
  
  Revision  Changes    Path
  1.2       +97 -57    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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- jk_worker_lb.c    20 Mar 2002 23:39:36 -0000      1.1
  +++ jk_worker_lb.c    12 Apr 2002 00:23:07 -0000      1.2
  @@ -60,7 +60,7 @@
    *              several workers.                                           *
    * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
    * Based on:                                                               *
  - * Version:     $Revision: 1.1 $                                           *
  + * Version:     $Revision: 1.2 $                                           *
    ***************************************************************************/
   
   #include "jk_pool.h"
  @@ -112,7 +112,9 @@
       jk_worker_t *rc = NULL;
       double lb_min = 0.0;    
       int i;
  -    char *session_route = jk2_requtil_getSessionRoute(env, s);
  +    char *session_route;
  +
  +    session_route = jk2_requtil_getSessionRoute(env, s);
          
       if(session_route) {
           for(i = 0 ; i < p->num_of_workers ; i++) {
  @@ -176,9 +178,16 @@
       s->realWorker=NULL;
   
       while(1) {
  -        jk_worker_t *rec = jk2_get_most_suitable_worker(env, w, s, attempt++);
  +        jk_worker_t *rec;
           int rc;
   
  +        if( w->num_of_workers==1 ) {
  +            /* A single worker - no need to search */
  +            rec=w->lb_workers[0];
  +        } else {
  +            rec=jk2_get_most_suitable_worker(env, w, s, attempt++);
  +        }
  +        
           s->is_recoverable_error = JK_FALSE;
   
           if(rec == NULL) {
  @@ -233,6 +242,65 @@
       return JK_FALSE;
   }
   
  +/** Init internal structures.
  +    Called any time the config changes
  +*/
  +static int JK_METHOD jk2_lb_initLbArray(jk_env_t *env, jk_worker_t *_this)
  +{
  +    int currentWorker=0;
  +    int i;
  +    _this->num_of_workers=_this->lbWorkerMap->size( env, _this->lbWorkerMap);
  +
  +    if( _this->lb_workers_size < _this->num_of_workers ) {
  +        if( _this->lb_workers_size==0 ) {
  +            _this->lb_workers_size=10;
  +        } else {
  +            _this->lb_workers_size = 2 * _this->lb_workers_size;
  +        }
  +        _this->lb_workers =
  +            _this->pool->alloc(env, _this->pool, 
  +                               _this->lb_workers_size * sizeof(jk_worker_t *));
  +        if(!_this->lb_workers) {
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                          "lb_worker.validate(): OutOfMemoryException\n");
  +            return JK_FALSE;
  +        }
  +    }    
  +
  +    for(i = 0 ; i < _this->num_of_workers ; i++) {
  +        char *name = _this->lbWorkerMap->nameAt( env, _this->lbWorkerMap, i);
  +        jk_worker_t *w= env->getByName( env, name );
  +        if( w== NULL ) {
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                          "lb_worker.init(): no worker found %s\n", name);
  +           _this->num_of_workers--;
  +            continue;
  +        }
  +        
  +        _this->lb_workers[currentWorker]=w;
  +
  +        if( _this->lb_workers[currentWorker]->lb_factor == 0 )
  +            _this->lb_workers[currentWorker]->lb_factor = DEFAULT_LB_FACTOR;
  +        
  +        _this->lb_workers[currentWorker]->lb_factor =
  +            1/ _this->lb_workers[currentWorker]->lb_factor;
  +
  +        /* 
  +         * Allow using lb in fault-tolerant mode.
  +         * Just set lbfactor in worker.properties to 0 to have 
  +         * a worker used only when principal is down or session route
  +         * point to it. Provided by Paul Frieden <[EMAIL PROTECTED]>
  +         */
  +        _this->lb_workers[currentWorker]->lb_value =
  +            _this->lb_workers[currentWorker]->lb_factor;
  +        _this->lb_workers[currentWorker]->in_error_state = JK_FALSE;
  +        _this->lb_workers[currentWorker]->in_recovering  = JK_FALSE;
  +
  +        currentWorker++;
  +    }
  +    return JK_TRUE;
  +}
  +
   static int JK_METHOD jk2_lb_setProperty(jk_env_t *env, jk_bean_t *mbean, 
                                           char *name, void *valueP)
   {
  @@ -257,62 +325,31 @@
           for(i = 0 ; i < num_of_workers ; i++) {
               char *name = _this->pool->pstrdup(env, _this->pool, worker_names[i]);
               _this->lbWorkerMap->add(env, _this->lbWorkerMap, name, "");
  +            env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                          "lb_worker.setAttribute(): Adding %s %s\n", 
_this->mbean->name, name);
           }
  +        jk2_lb_initLbArray( env, _this );
           return JK_TRUE;
       }
       return JK_FALSE;
   }
  -    
  +
  +
   static int JK_METHOD jk2_lb_init(jk_env_t *env, jk_worker_t *_this)
   {
       int err;
       char **worker_names;
       int i = 0;
  -    int currentWorker=0;
       char *tmp;
   
       int num_of_workers=_this->lbWorkerMap->size( env, _this->lbWorkerMap);
  -    _this->lb_workers =
  -        _this->pool->alloc(env, _this->pool, 
  -                           num_of_workers * sizeof(jk_worker_t *));
  -    
  -    if(!_this->lb_workers) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "lb_worker.validate(): OutOfMemoryException\n");
  -        return JK_FALSE;
  -    }
   
  -    for(i = 0 ; i < num_of_workers ; i++) {
  -        char *name = _this->lbWorkerMap->nameAt( env, _this->lbWorkerMap, i);
  -        jk_worker_t *w= env->getByName( env, name );
  -        if( w== NULL )
  -            continue;
  +    err=jk2_lb_initLbArray(env, _this );
  +    if( err != JK_TRUE )
  +        return err;
           
  -        _this->lb_workers[currentWorker]=w;
  -
  -        if( _this->lb_workers[currentWorker]->lb_factor == 0 )
  -            _this->lb_workers[currentWorker]->lb_factor = DEFAULT_LB_FACTOR;
  -        
  -        _this->lb_workers[currentWorker]->lb_factor =
  -            1/ _this->lb_workers[currentWorker]->lb_factor;
  -
  -        /* 
  -         * Allow using lb in fault-tolerant mode.
  -         * Just set lbfactor in worker.properties to 0 to have 
  -         * a worker used only when principal is down or session route
  -         * point to it. Provided by Paul Frieden <[EMAIL PROTECTED]>
  -         */
  -        _this->lb_workers[currentWorker]->lb_value =
  -            _this->lb_workers[currentWorker]->lb_factor;
  -        _this->lb_workers[currentWorker]->in_error_state = JK_FALSE;
  -        _this->lb_workers[currentWorker]->in_recovering  = JK_FALSE;
  -        currentWorker++;
  -    }
  -    
  -    _this->num_of_workers=currentWorker;
  -
       env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                  "lb.validate() %s %d workers\n",
  +                  "lb.init() %s %d workers\n",
                     _this->mbean->name, _this->num_of_workers );
   
       return JK_TRUE;
  @@ -346,7 +383,7 @@
   int JK_METHOD jk2_worker_lb_factory(jk_env_t *env,jk_pool_t *pool,
                                       jk_bean_t *result, char *type, char *name)
   {
  -    jk_worker_t *_this;
  +    jk_worker_t *w;
       
       if(NULL == name ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
  @@ -354,28 +391,31 @@
           return JK_FALSE;
       }
       
  -    _this = (jk_worker_t *)pool->calloc(env, pool, sizeof(jk_worker_t));
  +    w = (jk_worker_t *)pool->calloc(env, pool, sizeof(jk_worker_t));
   
  -    if(_this==NULL) {
  +    if(w==NULL) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
                         "lb_worker.factory() OutOfMemoryException\n");
           return JK_FALSE;
       }
   
  -    _this->pool=pool;
  +    w->pool=pool;
   
  -    _this->lb_workers = NULL;
  -    _this->num_of_workers = 0;
  -    _this->worker_private = NULL;
  -    _this->init           = jk2_lb_init;
  -    _this->destroy        = jk2_lb_destroy;
  -    _this->service        = jk2_lb_service;
  +    w->lb_workers = NULL;
  +    w->num_of_workers = 0;
  +    w->worker_private = NULL;
  +    w->init           = jk2_lb_init;
  +    w->destroy        = jk2_lb_destroy;
  +    w->service        = jk2_lb_service;
      
  -    jk2_map_default_create(env,&_this->lbWorkerMap, _this->pool);
  +    jk2_map_default_create(env,&w->lbWorkerMap, w->pool);
  +
  +    result->setAttribute=jk2_lb_setProperty;
  +    result->object=w;
  +    w->mbean=result;
   
  -    result->setAttribute    = jk2_lb_setProperty;
  -    result->object=_this;
  -    _this->mbean=result;
  +    w->workerEnv=env->getByName( env, "workerEnv" );
  +    w->workerEnv->addWorker( env, w->workerEnv, w );
       
       return JK_TRUE;
   }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to