You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/05/03 19:49:05 UTC

cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_worker_lb.c

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 <sh...@il.ibm.com>                           *
    * 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 <pf...@dchain.com>
            */
  -        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:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>