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]>