costin      02/05/14 10:23:31

  Modified:    jk/native2/common jk_worker_lb.c
  Log:
  - Started to add the 'hwBalanceErr' support.
  
  - removed the config stuff - it's now in jk_config
  
  - we still check the shm head and call the config->update method. This
  is needed since /jkstatus will be called in one process, and we need
  all processes to update. In addition this is another mechanism to triger
  config reloading.
  
  - various cosmetic changes.
  
  Revision  Changes    Path
  1.14      +43 -221   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.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- jk_worker_lb.c    9 May 2002 23:47:31 -0000       1.13
  +++ jk_worker_lb.c    14 May 2002 17:23:31 -0000      1.14
  @@ -148,6 +148,13 @@
               */
               break;
           }
  +
  +        if( lb->hwBalanceErr > 0 ) {
  +            /* don't go to higher levels - we'll return an error
  +             */
  +            currentLevel=0;
  +            break;
  +        }
       }
   
       /** Reenable workers in error state if the timeout has passed.
  @@ -212,6 +219,11 @@
                       rc = w;
                   }
               }
  +
  +            if( lb->hwBalanceErr > 0 ) {
  +                /* Don't try higher levels, only level=0 */
  +                break;
  +            }
           }
   
           if( attempt >= error_workers ) {
  @@ -257,202 +269,6 @@
       return rc;
   }
   
  -/* Remove all channels used by this tomcat instance */
  -static int jk2_worker_lb_disableInstance( jk_env_t *env,
  -                                          jk_worker_t *lb,
  -                                          char *instanceId )
  -{
  -    int i;
  -    int level;
  -    
  -    for( level=0; level<JK_LB_LEVELS; level++ ) {
  -        for(i = 0 ; i < lb->workerCnt[level] ; i++) {
  -            jk_worker_t *w=lb->workerTables[level][i];
  -
  -            if( w->route != NULL &&
  -                strcmp( w->route, instanceId ) == 0 ) {
  -                env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                              "lb.updateWorkers() Gracefull shutdown %s %s\n",
  -                              w->channel->mbean->name, instanceId );
  -                w->in_error_state= JK_TRUE;
  -                w->mbean->disabled = JK_TRUE;
  -            }
  -        }
  -    }
  -    return JK_OK;
  -}
  -
  -static int jk2_worker_lb_registerChannel( jk_env_t *env,
  -                                          jk_worker_t *lb,
  -                                          char *instanceId,
  -                                          jk_msg_t *msg, jk_map_t *groups)
  -{
  -    char *chName;
  -    jk_map_t *chProp;
  -    int i;
  -    int found=JK_FALSE;
  -    jk_config_t *config;
  -    char *tmpBuf;
  -    jk_bean_t *chBean;
  -    int rc=JK_OK;
  -    int level;
  -
  -    jk2_map_default_create(env, &chProp, env->tmpPool);
  -
  -    chName=msg->getString( env, msg );
  -    if( chName==NULL ) 
  -        rc=JK_ERR;
  -    
  -    if( rc==JK_OK )
  -        rc=msg->getMap( env, msg, chProp );
  -    
  -    if( rc!=JK_OK ) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "lb.updateWorkers() can't read channel data %s %s\n",
  -                      chName, instanceId);
  -        return JK_ERR;
  -    }
  -
  -    for( level=0; level<JK_LB_LEVELS; level++ ) {
  -        for(i = 0 ; i < lb->workerCnt[level] ; i++) {
  -            jk_worker_t *w=lb->workerTables[level][i];
  -
  -            if( w->route &&
  -                strcmp( w->route, instanceId ) == 0 &&
  -                strcmp( w->channel->mbean->name, chName ) == 0 ) {
  -                /* XXX Create a new channel with the update properties,
  -                   Then replace it.
  -                   
  -                   At this moment we just re-enable the worker.
  -                */
  -                if( w->mbean->disabled || w->in_error_state ) {
  -                    env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                                  "lb.updateWorkers() re-enabling %s %s\n",
  -                                  w->channel->mbean->name, instanceId );
  -                    w->mbean->disabled=JK_FALSE;
  -                    w->in_error_state=JK_FALSE;
  -                }
  -                
  -                found=JK_TRUE;
  -                break;
  -            }
  -        }
  -    }
  -
  -    if( found==JK_TRUE ) {
  -        env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                      "lb.updateWorkers() already found %s %s\n",
  -                      chName, instanceId);
  -        return JK_OK;
  -    }
  -
  -    config=lb->workerEnv->config;
  -
  -    tmpBuf=(char *)env->tmpPool->calloc( env, env->tmpPool, strlen( chName ) + 10 );
  -    strcpy( tmpBuf, chName );
  -    strcat( tmpBuf, ".name" );
  -
  -    config->setPropertyString( env, config, tmpBuf, chName );
  -    chBean=env->getBean( env, chName );
  -    if( chBean==NULL ) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "lb.updateWorkers() can't create  %s\n",
  -                      chName );
  -        return JK_ERR;
  -    }
  -        
  -    for( i=0; i< chProp->size(env, chProp ); i++ ) {
  -        char *name=chProp->nameAt( env, chProp, i );
  -        char *value=chProp->valueAt( env, chProp, i );
  -
  -        config->setProperty( env, config, chBean, name, value );
  -    }
  -
  -    config->save( env, config, NULL );
  -
  -    env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                  "lb.updateWorkers() create  %s %s\n",
  -                  chName, instanceId );
  -    
  -    /* XXX Add it to the right groups */
  -    
  -    return JK_OK;
  -}
  -
  -/** Check the scoreboard, make updates in the 'live'
  -    config
  -*/
  -static int JK_METHOD jk2_lb_updateWorkers(jk_env_t *env,
  -                                          jk_worker_t *lb,
  -                                          jk_shm_t *shm)
  -{
  -    int rc;
  -    int i;
  -    int j;
  -    jk_map_t *groups;
  -
  -    if( shm== NULL || shm->head==NULL) return JK_ERR;
  -    
  -    JK_ENTER_CS(&lb->cs, rc);
  -    if(rc !=JK_TRUE) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "lb.updateWorkers() Can't enter critical section\n");
  -        return JK_ERR;
  -    }
  -    if( lb->ver == shm->head->lbVer ) {
  -        /* Was updated by some other thread */
  -        return JK_OK;
  -    }
  -
  -    /* Walk the shm and update any changed worker */
  -    env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                  "lb.updateWorkers() Updating workers %d %d\n",
  -                  lb->ver, shm->head->lbVer);
  -    for( i=1; i<shm->head->lastSlot; i++ ) {
  -        jk_shm_slot_t *slot= shm->getSlot( env, shm, i );
  -        if( strncmp( slot->name, "TOMCAT:", 7 ) == 0 ) {
  -            /* */
  -            char *instanceId=slot->name+7;
  -            char *data=slot->data;
  -            jk_msg_t *msg;
  -            int chCnt;
  -
  -            jk2_map_default_create(env, &groups, env->tmpPool);
  -
  -            msg=jk2_msg_ajp_create2( env, env->tmpPool, slot->data, slot->size);
  -            msg->checkHeader( env, msg , NULL);
  -
  -            msg->getByte(env, msg );
  -            msg->getString(env, msg );
  -
  -            msg->getMap( env, msg, groups );
  -
  -            /* The actual data */
  -            chCnt=msg->getInt(env, msg );
  -
  -            env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                          "lb.updateWorkers() Reading %s %d channels %d groups %p 
%p %p\n",
  -                          slot->name, chCnt, groups->size( env, groups ), 
slot->data, slot, shm->head);
  -            
  -            if( chCnt == 0 ) {
  -                jk2_worker_lb_disableInstance( env, lb, instanceId );
  -            } else {
  -                /* Create all channels we don't have */
  -                /* XXX Not sure what's the best solution, we can do it in many ways 
*/
  -                for( j=0; j< chCnt; j++ ) {
  -                    jk2_worker_lb_registerChannel( env, lb, instanceId, msg, groups 
);
  -                }
  -            }
  -            
  -        }
  -    }
  -
  -    lb->ver = shm->head->lbVer;
  -        
  -    JK_LEAVE_CS(&lb->cs, rc);
  -    return JK_OK;
  -}
  -
   
   /** Get the best worker and forward to it.
       Since we don't directly connect to anything, there's no
  @@ -484,8 +300,11 @@
              while somebody else is changing - but that's ok, we just check for
              equality.
           */
  -        if( lb->ver != wEnv->shm->head->lbVer ) {
  -            jk2_lb_updateWorkers(env, lb, wEnv->shm);
  +        /* We should check this periodically
  +         */
  +        if( wEnv->config->ver != wEnv->shm->head->lbVer ) {
  +            wEnv->config->update(env, wEnv->config, NULL );
  +            wEnv->config->ver = wEnv->shm->head->lbVer;
           }
       }
       
  @@ -502,6 +321,8 @@
               /* NULL record, no more workers left ... */
               env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                             "lb_worker.service() all workers in error or disabled 
state\n");
  +            /* XXX set hwBalanceErr status */
  +            /* XXX nice message or redirect */
               return JK_ERR;
           }
   
  @@ -515,9 +336,6 @@
           
           s->jvm_route = rec->route;
   
  -        /* It may be better to do this on the endpoint */
  -        rec->reqCnt++;
  -
           s->realWorker = rec;
   
           rc = rec->service(env, rec, s);
  @@ -539,7 +357,6 @@
            */
           rec->in_error_state = JK_TRUE;
           rec->error_time     = time(0);
  -        rec->errCnt++;
           
           if(!s->is_recoverable_error) {
               /* Error is not recoverable - break with an error. */
  @@ -600,19 +417,9 @@
       return JK_OK;
   }
   
  -static int JK_METHOD jk2_lb_addWorker(jk_env_t *env, jk_worker_t *lb, 
  -                                      char *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,
  -                  "lb_worker.setAttribute(): Adding to %s: %s\n", 
lb->mbean->localName, name);
  -
  -}
   
   static char *jk2_worker_lb_multiValueInfo[]={"worker", NULL };
  -static char *jk2_worker_lb_setAttributeInfo[]={"debug", NULL };
  +static char *jk2_worker_lb_setAttributeInfo[]={"hwBalanceErr", NULL };
   
   static int JK_METHOD jk2_lb_setAttribute(jk_env_t *env, jk_bean_t *mbean, 
                                            char *name, void *valueP)
  @@ -626,16 +433,29 @@
       char *tmp;
       
       if( strcmp( name, "worker") == 0 ) {
  -        jk2_lb_addWorker( env, lb, value);
  +        if( lb->lbWorkerMap->get( env, lb->lbWorkerMap, name) != NULL ) {
  +            /* Already added */
  +            return JK_OK;
  +        }
  +        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,
  +                      "lb_worker.setAttribute(): Adding to %s: %s\n", 
lb->mbean->localName, name);
  +
           jk2_lb_refresh( env, lb );
           return JK_OK;
  +    } else if( strcmp( name, "hwBalanceErr") == 0 ) {
  +        lb->hwBalanceErr=atoi( value );
       }
  +
       return JK_ERR;
   }
   
   
  -static int JK_METHOD jk2_lb_init(jk_env_t *env, jk_worker_t *lb)
  +static int JK_METHOD jk2_lb_init(jk_env_t *env, jk_bean_t *bean)
   {
  +    jk_worker_t *lb=bean->object;
       int err;
       char **worker_names;
       int i = 0;
  @@ -646,9 +466,8 @@
       if( err != JK_OK )
           return err;
   
  -    lb->ver=0;
  -    if( lb->workerEnv->shm != NULL && lb->workerEnv->shm->head != NULL) 
  -        jk2_lb_updateWorkers(env, lb, lb->workerEnv->shm);
  +    /*     if( lb->workerEnv->shm != NULL && lb->workerEnv->shm->head != NULL)  */
  +    /*         jk2_lb_updateWorkers(env, lb, lb->workerEnv->shm); */
   
       env->l->jkLog(env, env->l, JK_LOG_INFO,
                     "lb.init() %s %d workers\n",
  @@ -657,8 +476,9 @@
       return JK_OK;
   }
   
  -static int JK_METHOD jk2_lb_destroy(jk_env_t *env, jk_worker_t *w)
  +static int JK_METHOD jk2_lb_destroy(jk_env_t *env, jk_bean_t *bean)
   {
  +    jk_worker_t *w=bean->object;
       /* Workers are destroyed by the workerEnv. It is possible
          that a worker is part of more than a lb.
          Nothing to clean up so far.
  @@ -688,8 +508,6 @@
       }
   
       w->worker_private = NULL;
  -    w->init           = jk2_lb_init;
  -    w->destroy        = jk2_lb_destroy;
       w->service        = jk2_lb_service;
       
       for( i=0; i<JK_LB_LEVELS; i++ ) {
  @@ -698,11 +516,15 @@
       
       jk2_map_default_create(env,&w->lbWorkerMap, pool);
   
  +    result->init           = jk2_lb_init;
  +    result->destroy        = jk2_lb_destroy;
       result->setAttribute=jk2_lb_setAttribute;
       result->multiValueInfo=jk2_worker_lb_multiValueInfo;
       result->setAttributeInfo=jk2_worker_lb_setAttributeInfo;
       result->object=w;
       w->mbean=result;
  +
  +    w->hwBalanceErr=0;
   
       w->workerEnv=env->getByName( env, "workerEnv" );
       w->workerEnv->addWorker( env, w->workerEnv, w );
  
  
  

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

Reply via email to