costin      02/05/10 17:06:58

  Modified:    jk/native2/common jk_worker_ajp13.c
  Log:
  Few ( bigger ) changes:
  
  - we no longer de-allocate the endpoint. The ep will store important statistics
  about request processing ( times, nr. of requests, etc ) - it's much better
  than the worker since an endpoint is active in a single thread, so we
  don't need atomic or syncs.
  
  - also check if we are connected ( right now we use sd, if it's <0 we
  assume it's not connected - we set it to -1 when we create the endpoint
  and after close, and set it to 0 if the channel doesn't do it - I could
  add a separate flag but I'm lazy today ).
  
  - few small fixes to make sure the endpoints are doing well.
  
  Revision  Changes    Path
  1.18      +75 -55    jakarta-tomcat-connectors/jk/native2/common/jk_worker_ajp13.c
  
  Index: jk_worker_ajp13.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_ajp13.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- jk_worker_ajp13.c 9 May 2002 23:47:31 -0000       1.17
  +++ jk_worker_ajp13.c 11 May 2002 00:06:58 -0000      1.18
  @@ -166,8 +166,6 @@
           ajp14->route=value;
       } else if( strcmp( name, "group" )==0 ) {
           ajp14->groups->add( env, ajp14->groups, value, ajp14 );
  -    } else if( strcmp( name, "cachesize" )==0 ) {
  -        ajp14->cache_sz=atoi( value );
       } else if( strcmp( name, "lb_factor" )==0 ) {
           ajp14->lb_factor=atoi( value );
       } else if( strcmp( name, "channel" )==0 ) {
  @@ -220,10 +218,14 @@
       ae->reuse = JK_FALSE;
       if( ae->worker->channel != NULL )
           ae->worker->channel->close( env, ae->worker->channel, ae );
  +    
       ae->cPool->reset( env, ae->cPool );
  -    ae->cPool->close( env, ae->cPool );
  -    ae->pool->reset( env, ae->pool );
  -    ae->pool->close( env, ae->pool );
  +    /* ae->cPool->close( env, ae->cPool ); */
  +
  +    /* Don't touch the ae->pool, the object has important
  +       statistics */
  +    /* ae->pool->reset( env, ae->pool ); */
  +    /*     ae->pool->close( env, ae->pool ); */
   }
   
   /** Connect a channel, implementing the logging protocol if ajp14
  @@ -252,6 +254,13 @@
           return JK_ERR;
       }
   
  +    /* We just reconnected, reset error state
  +     */
  +    ae->worker->in_error_state=0;
  +    
  +    /** XXX use a 'connected' field */
  +    if( ae->sd == -1 ) ae->sd=0;
  +    
       /* Check if we must execute a logon after the physical connect */
       if (ae->worker->secret == NULL)
           return JK_OK;
  @@ -294,7 +303,7 @@
                                 jk_endpoint_t   *e )
   {
       int attempt;
  -    int err;
  +    int err=JK_OK;
       
       /*
        * Try to send the request on a valid endpoint. If one endpoint
  @@ -306,11 +315,20 @@
       for(attempt = 0 ; attempt < JK_RETRIES ;attempt++) {
           jk_channel_t *channel= worker->channel;
   
  +        if( e->sd == -1 ) {
  +            err=jk2_worker_ajp14_connect(env, e);
  +            if( err!=JK_OK ) {
  +                env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                              "ajp14.service() failed to connect endpoint errno=%d 
%s\n",
  +                              errno, strerror( errno ));
  +                return err;
  +            }
  +        }
           /* e->request->dump(env, e->request, "Before sending "); */
           err=e->worker->channel->send( env, e->worker->channel, e,
                                         e->request );
  -
  -         if (err==JK_OK ) {
  +        e->request->dump( env, e->request, "Sent" );
  +        if (err==JK_OK ) {
               /* We sent the request, have valid endpoint */
               break;
           }
  @@ -323,11 +341,10 @@
           }
           
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                "ajp14.service() error sending, reconnect %s %s\n",
  -                      e->worker->mbean->name, e->worker->channelName);
  +                      "ajp14.service() error sending, reconnect %s %d %d %s\n",
  +                      e->worker->channelName, err, errno, strerror(errno));
   
           channel->close( env, channel, e );
  -
           err=jk2_worker_ajp14_connect(env, e); 
   
           if( err != JK_OK ) {
  @@ -386,10 +403,6 @@
                                          e->post );
       }
   
  -    if( e->worker->mbean->debug > 0 )
  -        env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                      "ajp14.service() processing callbacks %s\n", 
e->worker->channel->mbean->name);
  -
       err = e->worker->workerEnv->processCallbacks(env, e->worker->workerEnv,
                                                    e, s);
       
  @@ -515,31 +528,35 @@
   jk2_worker_ajp14_done(jk_env_t *env, jk_worker_t *we, jk_endpoint_t *e)
   {
       jk_worker_t *w;
  +    int rc=JK_OK;
       
       w= e->worker;
       
       if( e->cPool != NULL ) 
           e->cPool->reset(env, e->cPool);
  -    if (! w->in_error_state && w->endpointCache != NULL ) {
  -        int err=0;
  -        err=w->endpointCache->put( env, w->endpointCache, e );
  -        if( err==JK_OK ) {
  -            if( w->mbean->debug > 0 ) 
  -                env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                              "ajp14.done() return to pool %s\n",
  -                              w->mbean->name );
  -            return JK_OK;
  -        }
  -    }
   
  -    /* No reuse or put() failed */
  -
  -    jk2_close_endpoint(env, e);
  +    if( w->endpointCache == NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, "ajp14.done() No pool\n");
  +        return JK_ERR;
  +    }
  +    
  +    if ( w->in_error_state ) {
  +        jk2_close_endpoint(env, e);
  +        /*     if( w->mbean->debug > 0 )  */
  +        env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                      "ajp14.done() close endpoint %s error_state %d\n",
  +                      w->mbean->name, w->in_error_state );
  +    }
  +        
  +    rc=w->endpointCache->put( env, w->endpointCache, e );
  +    if( rc!=JK_OK ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, "ajp14.done() Error recycling 
ep\n");
  +        return rc;        
  +    }
       if( w->mbean->debug > 0 ) 
           env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                      "ajp14.done() close endpoint %s\n",
  +                      "ajp14.done() return to pool %s\n",
                         w->mbean->name );
  -    
       return JK_OK;
   }
   
  @@ -555,25 +572,29 @@
       if( ajp14->secret ==NULL ) {
       }
   
  -    if (ajp14->endpointCache != NULL ) {
  +    if( ajp14->endpointCache == NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, "ajp14.getEndpoint() No pool\n");
  +        return JK_ERR;
  +    }
   
  -        e=ajp14->endpointCache->get( env, ajp14->endpointCache );
  +    e=ajp14->endpointCache->get( env, ajp14->endpointCache );
   
  -        if (e!=NULL) {
  -            if( e->worker->mbean->debug > 0 )
  -                env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                              "ajp14.getEndpoint(): Reusing endpoint %s %s\n",
  -                              e->mbean->name, e->worker->mbean->name);
  -            *eP = e;
  -            return JK_OK;
  -        }
  +    if (e!=NULL) {
  +        *eP = e;
  +        return JK_OK;
       }
   
       jkb=env->createBean2( env,ajp14->pool,  "endpoint", NULL );
       if( jkb==NULL )
           return JK_ERR;
  +    if( ajp14->mbean->debug > 0 )
  +        env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                      "ajp14.getEndpoint(): Creating endpoint %s %s \n",
  +                      ajp14->mbean->name, jkb->name);
  +    
       e = (jk_endpoint_t *)jkb->object;
       e->worker = ajp14;
  +    e->sd=-1;
   
       *eP = e;
       return JK_OK;
  @@ -617,21 +638,20 @@
          ajp14->channel->mbean->disabled  )
           ajp14->mbean->disabled = JK_TRUE;
       
  -    if( ajp14->cache_sz == -1 )
  -        ajp14->cache_sz=JK_OBJCACHE_DEFAULT_SZ;
  -
  -    if (ajp14->cache_sz > 0) {
  -        ajp14->endpointCache=jk2_objCache_create( env, ajp14->pool  );
  +    ajp14->endpointCache=jk2_objCache_create( env, ajp14->pool  );
           
  -        if( ajp14->endpointCache != NULL ) {
  -            rc=ajp14->endpointCache->init( env, ajp14->endpointCache,
  -                                           ajp14->cache_sz );
  -            if( rc!= JK_OK ) {
  -                ajp14->endpointCache=NULL;
  -            }
  -        }
  -    } else {
  -        ajp14->endpointCache=NULL;
  +    if( ajp14->endpointCache == NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                      "ajp14.init(): error creating endpoint cache\n");
  +        return JK_ERR;
  +    }
  +    
  +    /* Will grow */
  +    rc=ajp14->endpointCache->init( env, ajp14->endpointCache, -1 );
  +    if( rc!= JK_OK ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                      "ajp14.init(): error creating endpoint cache\n");
  +        return JK_ERR;
       }
   
       if( ajp14->channel == NULL ) {
  
  
  

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

Reply via email to