hgomez 2003/10/16 00:51:48 Modified: jk/native2/common jk_handler_logon.c jk_channel_un.c jk_mutex.c jk_channel_apr_socket.c jk_channel_socket.c jk_handler_response.c jk_channel_jni.c jk_channel.c jk_worker_ajp13.c jk/native2/include jk_channel.h jk_workerEnv.h jk_worker.h Log: Start to port back jk cping/cpong Revision Changes Path 1.22 +3 -3 jakarta-tomcat-connectors/jk/native2/common/jk_handler_logon.c Index: jk_handler_logon.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_logon.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- jk_handler_logon.c 25 Sep 2003 15:23:23 -0000 1.21 +++ jk_handler_logon.c 16 Oct 2003 07:51:48 -0000 1.22 @@ -179,7 +179,7 @@ if (nego == 0xFFFFFFFF) { env->l->jkLog(env, env->l, JK_LOG_ERROR, - "handler.log_ok() can't get negociated data\n"); + "handler.logok() can't get negociated data\n"); return JK_HANDLER_FATAL; } @@ -187,7 +187,7 @@ if (! sname) { env->l->jkLog(env, env->l, JK_LOG_ERROR, - "handler.logon() Error getting servlet engine name\n"); + "handler.logok() Error getting servlet engine name\n"); return JK_HANDLER_FATAL; } 1.17 +17 -0 jakarta-tomcat-connectors/jk/native2/common/jk_channel_un.c Index: jk_channel_un.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_un.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- jk_channel_un.c 4 Mar 2003 23:56:37 -0000 1.16 +++ jk_channel_un.c 16 Oct 2003 07:51:48 -0000 1.17 @@ -238,6 +238,22 @@ return rc; } + +/* + * Wait input event on socket for timeout ms + */ +static int JK_METHOD jk2_channel_un_hasinput(jk_env_t *env, + jk_channel_t *ch, + jk_endpoint_t *endpoint, + int timeout) + +{ + /* + * Should implements the select/poll for UN here + */ + return (JK_TRUE) ; +} + /** connect to Tomcat (jk_open_socket) */ static int JK_METHOD jk2_channel_un_open(jk_env_t *env, @@ -490,6 +506,7 @@ ch->send= jk2_channel_un_send; ch->open= jk2_channel_un_open; ch->close= jk2_channel_un_close; + ch->hasinput= jk2_channel_un_hasinput; ch->is_stream=JK_TRUE; ch->serverSide=JK_FALSE; 1.6 +3 -3 jakarta-tomcat-connectors/jk/native2/common/jk_mutex.c Index: jk_mutex.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_mutex.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- jk_mutex.c 4 Feb 2003 07:39:58 -0000 1.5 +++ jk_mutex.c 16 Oct 2003 07:51:48 -0000 1.6 @@ -83,17 +83,17 @@ switch( code ) { case MUTEX_LOCK: { if( mutex->mbean->debug > 0 ) - env->l->jkLog(env, env->l, JK_LOG_DEBUG, "mutex.open()\n"); + env->l->jkLog(env, env->l, JK_LOG_DEBUG, "mutex.lock()\n"); return mutex->lock(env, mutex); } case MUTEX_TRYLOCK: { if( mutex->mbean->debug > 0 ) - env->l->jkLog(env, env->l, JK_LOG_DEBUG, "mutex.close()\n"); + env->l->jkLog(env, env->l, JK_LOG_DEBUG, "mutex.trylock()\n"); return mutex->tryLock(env, mutex); } case MUTEX_UNLOCK: { if( mutex->mbean->debug > 0 ) - env->l->jkLog(env, env->l, JK_LOG_DEBUG, "mutex.recv()\n"); + env->l->jkLog(env, env->l, JK_LOG_DEBUG, "mutex.unlock()\n"); return mutex->unLock(env, mutex); } }/* switch */ 1.32 +61 -1 jakarta-tomcat-connectors/jk/native2/common/jk_channel_apr_socket.c Index: jk_channel_apr_socket.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_apr_socket.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- jk_channel_apr_socket.c 30 Sep 2003 13:42:02 -0000 1.31 +++ jk_channel_apr_socket.c 16 Oct 2003 07:51:48 -0000 1.32 @@ -91,6 +91,7 @@ short port; int keepalive; int timeout; + int }; typedef struct jk_channel_apr_private jk_channel_apr_private_t; @@ -111,6 +112,11 @@ jk_endpoint_t *endpoint); +static char *jk2_channel_apr_socket_getAttributeInfo[]={"host", "port", "keepalive", "timeout", "nodelay", "graceful", + "debug", "disabled", NULL }; +static char *jk2_channel_apr_socket_setAttributeInfo[]={"host", "port", "keepalive", "timeout", "nodelay", "graceful", + "debug", "disabled", NULL }; + static int JK_METHOD jk2_channel_apr_setProperty(jk_env_t *env, jk_bean_t *mbean, char *name, void *valueP) @@ -136,6 +142,36 @@ return JK_OK; } +static void * JK_METHOD jk2_channel_apr_socket_getAttribute(jk_env_t *env, jk_bean_t *bean, + char *name ) +{ + jk_channel_t *ch=(jk_channel_t *)bean->object; + jk_channel_socket_private_t *socketInfo= + (jk_channel_socket_private_t *)(ch->_privatePtr); + + if( strcmp( name, "name" )==0 ) { + return bean->name; + } else if( strcmp( "host", name ) == 0 ) { + return socketInfo->host; + } else if( strcmp( "port", name ) == 0 ) { + return jk2_env_itoa( env, socketInfo->port ); + } else if( strcmp( "nodelay", name ) == 0 ) { + return jk2_env_itoa( env, socketInfo->ndelay ); + } else if( strcmp( "keepalive", name ) == 0 ) { + return jk2_env_itoa( env, socketInfo->keepalive ); + } else if( strcmp( "timeout", name ) == 0 ) { + return jk2_env_itoa( env, socketInfo->timeout ); + } else if( strcmp( "graceful", name ) == 0 ) { + return jk2_env_itoa( env, ch->worker->graceful ); + } else if( strcmp( "debug", name ) == 0 ) { + return jk2_env_itoa( env, ch->mbean->debug ); + } else if( strcmp( "disabled", name ) == 0 ) { + return jk2_env_itoa( env, ch->mbean->disabled ); + } + return NULL; +} + + /** resolve the host IP ( jk_resolve ) and initialize the channel. */ static int JK_METHOD jk2_channel_apr_init(jk_env_t *env, @@ -185,6 +221,22 @@ return rc; } +/* + * Wait input event on socket for timeout ms + */ +static int JK_METHOD jk2_channel_apr_hasinput(jk_env_t *env, + jk_channel_t *ch, + jk_endpoint_t *endpoint, + int timeout) + +{ + /* + * Should implements the APR select/poll for socket here + */ + return (JK_TRUE) ; +} + + /** private: resolve the address on init */ static int JK_METHOD jk2_channel_apr_resolve(jk_env_t *env, @@ -497,12 +549,20 @@ ch->send= jk2_channel_apr_send; ch->open= jk2_channel_apr_open; ch->close= jk2_channel_apr_close; + ch->hasinput= jk2_channel_apr_hasinput; + ch->is_stream=JK_TRUE; result->setAttribute= jk2_channel_apr_setProperty; + result->getAttribute= jk2_channel_apr_socket_getAttribute; + result->init= jk2_channel_apr_init; + result->getAttributeInfo=jk2_channel_apr_socket_getAttributeInfo; + result->multiValueInfo=NULL; + result->setAttributeInfo=jk2_channel_apr_socket_setAttributeInfo; + ch->mbean=result; result->object= ch; - result->init= jk2_channel_apr_init; + ch->workerEnv=env->getByName( env, "workerEnv" ); ch->workerEnv->addChannel( env, ch->workerEnv, ch ); 1.57 +34 -1 jakarta-tomcat-connectors/jk/native2/common/jk_channel_socket.c Index: jk_channel_socket.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_socket.c,v retrieving revision 1.56 retrieving revision 1.57 diff -u -r1.56 -r1.57 --- jk_channel_socket.c 29 Aug 2003 13:08:57 -0000 1.56 +++ jk_channel_socket.c 16 Oct 2003 07:51:48 -0000 1.57 @@ -238,6 +238,39 @@ return rc; } +/* + * Wait input event on socket for timeout ms + */ +static int JK_METHOD jk2_channel_socket_hasinput(jk_env_t *env, + jk_channel_t *ch, + jk_endpoint_t *endpoint, + int timeout) +{ + fd_set rset; + fd_set eset; + struct timeval tv; + int rc; + + FD_ZERO(&rset); + FD_ZERO(&eset); + FD_SET(endpoint->sd, &rset); + FD_SET(endpoint->sd, &eset); + + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + + rc = select(ae->sd + 1, &rset, NULL, &eset, &tv); + + if ((rc < 1) || (FD_ISSET(endpoint->sd, &eset))) + { + env->l->jkLog(env, env->l, JK_LOG_ERROR, "jk2_channel_socket_isinput: " + "error during select [%d]\n", rc); + return JK_FALSE; + } + + return ((FD_ISSET(endpoint->sd, &rset)) ? JK_TRUE : JK_FALSE) ; +} + /** private: resolve the address on init */ static int JK_METHOD jk2_channel_socket_resolve(jk_env_t *env, char *host, short port, @@ -704,13 +737,13 @@ ch->send= jk2_channel_socket_send; ch->open= jk2_channel_socket_open; ch->close= jk2_channel_socket_close; + ch->hasinput = jk2_channel_socket_hasinput; ch->is_stream=JK_TRUE; result->setAttribute= jk2_channel_socket_setAttribute; result->getAttribute= jk2_channel_socket_getAttribute; result->init= jk2_channel_socket_init; - result->getAttributeInfo=jk2_channel_socket_getAttributeInfo; result->multiValueInfo=NULL; result->setAttributeInfo=jk2_channel_socket_setAttributeInfo; 1.29 +14 -0 jakarta-tomcat-connectors/jk/native2/common/jk_handler_response.c Index: jk_handler_response.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_response.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- jk_handler_response.c 13 Mar 2003 18:30:46 -0000 1.28 +++ jk_handler_response.c 16 Oct 2003 07:51:48 -0000 1.29 @@ -255,6 +255,14 @@ return JK_HANDLER_FATAL; } +/** PONG Reply handler + */ +static int JK_METHOD jk2_handler_getPong(jk_env_t *env, void *target, + jk_endpoint_t *ae, jk_msg_t *msg ) +{ + return JK_HANDLER_LAST; +} + static int JK_METHOD jk2_handler_response_invoke(jk_env_t *env, jk_bean_t *bean, jk_endpoint_t *ep, int code, jk_msg_t *msg, int raw) { @@ -269,6 +277,8 @@ return jk2_handler_endResponse(env, target, ep, msg ); case JK_HANDLE_AJP13_GET_BODY_CHUNK: return jk2_handler_getChunk(env, target, ep, msg ); + case JK_HANDLE_AJP13_PONG_REPLY: + return jk2_handler_getPong(env, target, ep, msg ); } return JK_OK; } @@ -292,6 +302,10 @@ wEnv->registerHandler( env, wEnv, "handler.response", "getChunk", JK_HANDLE_AJP13_GET_BODY_CHUNK, jk2_handler_getChunk, NULL ); + + wEnv->registerHandler( env, wEnv, "handler.response", + "pongResponse", JK_HANDLE_AJP13_PONG_REPLY, + jk2_handler_getPong, NULL ); return JK_OK; } 1.42 +17 -0 jakarta-tomcat-connectors/jk/native2/common/jk_channel_jni.c Index: jk_channel_jni.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_jni.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -r1.41 -r1.42 --- jk_channel_jni.c 4 Feb 2003 07:39:59 -0000 1.41 +++ jk_channel_jni.c 16 Oct 2003 07:51:48 -0000 1.42 @@ -144,6 +144,22 @@ return JK_OK; } +/* + * Wait input event for timeout ms + */ +static int JK_METHOD jk2_channel_jni_hasinput(jk_env_t *env, + jk_channel_t *ch, + jk_endpoint_t *endpoint, + int timeout) + +{ + /* + * No delay in such case + */ + return (JK_TRUE) ; +} + + /** Assume the jni-worker or someone else started * tomcat and initialized what is needed. */ @@ -637,6 +653,7 @@ ch->send= jk2_channel_jni_send; ch->open= jk2_channel_jni_open; ch->close= jk2_channel_jni_close; + ch->hasinput= jk2_channel_jni_hasinput; ch->beforeRequest= jk2_channel_jni_beforeRequest; ch->afterRequest= jk2_channel_jni_afterRequest; 1.9 +9 -0 jakarta-tomcat-connectors/jk/native2/common/jk_channel.c Index: jk_channel.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- jk_channel.c 4 Feb 2003 07:39:59 -0000 1.8 +++ jk_channel.c 16 Oct 2003 07:51:48 -0000 1.9 @@ -140,6 +140,15 @@ rc=ch->send(env, ch, ep, msg); return rc; } + case CH_HASINPUT: { + if( ch->mbean->debug > 0 ) + env->l->jkLog(env, env->l, JK_LOG_DEBUG, "ch.hasinput()\n"); + if( ch->serverSide ) + msg->serverSide=JK_TRUE; + if( ch->hasinput != NULL ) + rc=ch->hasinput(env, ch, ep, 1000); /* Well we should handle timeout better isn't it ? */ + return rc; + } }/* switch */ return JK_ERR; } 1.50 +109 -8 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.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- jk_worker_ajp13.c 25 Sep 2003 15:23:22 -0000 1.49 +++ jk_worker_ajp13.c 16 Oct 2003 07:51:48 -0000 1.50 @@ -84,12 +84,14 @@ /* -------------------- Impl -------------------- */ static char *jk2_worker_ajp13_getAttributeInfo[]={ "lb_factor", "lb_value", "debug", "channel", "level", "route", "routeRedirect", "errorState", "graceful", "groups", "disabled", - "epCount", "errorTime", NULL }; + "epCount", "errorTime", "connectTimeout", "replyTimeout", + "prepostTimeout", NULL }; static char *jk2_worker_ajp13_multiValueInfo[]={"group", NULL }; static char *jk2_worker_ajp13_setAttributeInfo[]={"debug", "channel", "route", "routeRedirect","secretkey", "group", "graceful", - "disabled", "lb_factor", "level", NULL }; + "disabled", "lb_factor", "level", "connectTimeout", "replyTimeout", + "prepostTimeout", NULL }; static void * JK_METHOD jk2_worker_ajp13_getAttribute(jk_env_t *env, jk_bean_t *bean, char *name ) { @@ -121,6 +123,12 @@ return jk2_env_itoa( env, worker->in_error_state ); } else if (strcmp( name, "graceful" )==0 ) { return jk2_env_itoa( env, worker->graceful ); + } else if (strcmp( name, "connectTimeout" )==0 ) { + return jk2_env_itoa( env, worket->connect_timeout); + } else if (strcmp( name, "replyTimeout" )==0 ) { + return jk2_env_itoa( env, worker->reply_timeout); + } else if (strcmp( name, "prepostTimeout" )==0 ) { + return jk2_env_itoa( env, worker->prepost_timeout); } else if (strcmp( name, "disabled" )==0 ) { return jk2_env_itoa( env, bean->disabled ); } else if (strcmp( name, "epCount" )==0 ) { @@ -152,6 +160,12 @@ ajp13->routeRedirect=value; } else if( strcmp( name, "graceful" )==0 ) { ajp13->graceful=atoi( value ); + } else if( strcmp( name, "connectTimeout" )==0 ) { + ajp13->connect_timeout=atoi( value ); + } else if( strcmp( name, "replyTimeout" )==0 ) { + ajp13->reply_timeout=atoi( value ); + } else if( strcmp( name, "prepostTimeout" )==0 ) { + ajp13->prepost_timeout=atoi( value ); } else if( strcmp( name, "disabled" )==0 ) { mbean->disabled=atoi( value ); } else if( strcmp( name, "group" )==0 ) { @@ -171,14 +185,21 @@ return JK_OK; } +/* Webserver ask container to take control (logon phase) */ #define JK_AJP13_PING (unsigned char)8 +/* Webserver check if container is alive, since container should respond by cpong */ +#define JK_AJP13_CPING (unsigned char)10 + +/* Container response to cping request */ +#define JK_AJP13_CPONG (unsigned char)9 + /* * Build the ping cmd. Tomcat will get control and will be able * to send any command. * * +-----------------------+ - * | PING CMD (1 byte) | + * | PING CMD (1 byte) | * +-----------------------+ * * XXX Add optional Key/Value set . @@ -200,6 +221,32 @@ } +/* + * Build the cping cmd. Tomcat should respond by a cpong. + * + * +-----------------------+ + * | CPING CMD (1 byte) | + * +-----------------------+ + * + * XXX Add optional Key/Value set . + * + */ +int jk2_serialize_cping(jk_env_t *env, jk_msg_t *msg, + jk_endpoint_t *ae) +{ + int rc; + + /* To be on the safe side */ + msg->reset(env, msg); + + rc= msg->appendByte( env, msg, JK_AJP13_CPING); + if (rc!=JK_OK ) + return JK_ERR; + + return JK_OK; +} + + /* * Close the endpoint (clean buf and close socket) */ @@ -225,6 +272,50 @@ /* ae->pool->close( env, ae->pool ); */ } +/** Check if a channel is alive, send a cping and wait for a cpong + during timeoutms + */ +static int jk2_check_alive(jk_env_t *env, jk_endpoint_t *ae, int timeout) { + + jk_channel_t *channel=ae->worker->channel; + jk_msg_t * msg=ae->reply; +; + + jk2_serialize_cping( env, msg, ae ); + err = ae->worker->channel->send( env, ae->worker->channel, ae, msg ); + + if (err != JK_OK) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "ajp13.checkalive() can't send cping request to %s\n", + ae->worker->mbean->name); + + return JK_ERR; + } + + if (ae->worker->channel->hasinput(env, ae->worker->channel, ae, + timeout) != JK_TRUE) { + + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "ajp13.checkalive() can't get cpong reply from %s in %d ms\n", + ae->worker->mbean->name, timeout); + + return JK_ERR; + } + + err = ae->worker->channel->recv( env, ae->worker->channel, ae, msg ); + + if (err != JK_OK) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "ajp13.checkalive() can't read cpong reply from %s\n", + ae->worker->mbean->name); + + return JK_ERR; + } + + + return JK_OK; +} + /** Connect a channel, implementing the logging protocol if ajp13 */ static int jk2_worker_ajp13_connect(jk_env_t *env, jk_endpoint_t *ae) { @@ -262,6 +353,11 @@ /** XXX use a 'connected' field */ if( ae->sd == -1 ) ae->sd=0; + if (ae->worker->connect_timeout != 0 ) + if (jk2_check_alive(env, ae, ae->worker->connect_timeout) != JK_OK) + return JK_ERR; + } + /* Check if we must execute a logon after the physical connect */ if (ae->worker->secret == NULL) return JK_OK; @@ -269,15 +365,15 @@ /* Do the logon process */ env->l->jkLog(env, env->l, JK_LOG_INFO, "ajp13.connect() logging in\n" ); - /* use the reply buffer - it's a new channel, it is cetainly not + /* use the reply buffer - it's a new channel, it is certainly not in use. The request and post buffers are probably in use if this is a reconnect */ msg=ae->reply; - jk2_serialize_ping( env, msg, ae ); - - err = ae->worker->channel->send( env, ae->worker->channel, ae, msg ); - + /* send a ping message to told container to take control (logon phase) */ + jk2_serialize_ping( env, msg, ae ); + err = ae->worker->channel->send( env, ae->worker->channel, ae, msg ); + /* Move to 'slave' mode, listening to messages */ err=ae->worker->workerEnv->processCallbacks( env, ae->worker->workerEnv, ae, NULL); @@ -485,6 +581,11 @@ s->left_bytes_to_send = s->content_length; s->content_read=0; + if (w->prepost_timeout != 0) { + if (jk2_check_alive(env, ae, ae->worker->prepost_timeout) != JK_OK) + return JK_ERR; + } + /* * We get here initial request (in reqmsg) */ 1.19 +6 -0 jakarta-tomcat-connectors/jk/native2/include/jk_channel.h Index: jk_channel.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_channel.h,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- jk_channel.h 4 Feb 2003 07:40:32 -0000 1.18 +++ jk_channel.h 16 Oct 2003 07:51:48 -0000 1.19 @@ -78,6 +78,7 @@ #define CH_CLOSE 5 #define CH_READ 6 #define CH_WRITE 7 +#define CH_HASINPUT 8 typedef struct jk_channel jk_channel_t; @@ -146,6 +147,11 @@ int (JK_METHOD *recv)(struct jk_env *env, jk_channel_t *_this, struct jk_endpoint *endpoint, struct jk_msg *msg ); + + /** Check if something is available in input on the communication channel + */ + int (JK_METHOD *hasinput)(struct jk_env *env, jk_channel_t *_this, + struct jk_endpoint *endpoint, int timeout); /** Called before request processing, to initialize resources. All following calls will be in the same thread. 1.29 +4 -1 jakarta-tomcat-connectors/jk/native2/include/jk_workerEnv.h Index: jk_workerEnv.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_workerEnv.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- jk_workerEnv.h 4 Feb 2003 07:40:32 -0000 1.28 +++ jk_workerEnv.h 16 Oct 2003 07:51:48 -0000 1.29 @@ -106,6 +106,9 @@ /* Marks the end of response. */ #define JK_HANDLE_AJP13_END_RESPONSE 5 +/* Get a PONG reply from the servlet container. */ +#define JK_HANDLE_AJP13_PONG_REPLY 9 + /* Second Login Phase (servlet engine -> web server), md5 seed is received */ #define JK_HANDLE_LOGON_SEED 0x11 1.32 +17 -1 jakarta-tomcat-connectors/jk/native2/include/jk_worker.h Index: jk_worker.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_worker.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- jk_worker.h 8 Apr 2003 04:00:24 -0000 1.31 +++ jk_worker.h 16 Oct 2003 07:51:48 -0000 1.32 @@ -217,6 +217,22 @@ session IDs matching the worker will be forwarded, nothing else */ int graceful; + /** Delay in ms at connect time for Tomcat to respond to a PING request + * at connect time (ensure that Tomcat is not HOLDED) + */ + int connect_timeout; + + /** When set, indicate delay in ms to wait a reply. + * Warning it will mark as invalid long running request, should be set with + * care but could be usefull to detect an HOLDED Tomcat. + */ + int reply_timeout; + + /** Delay in ms for Tomcat to respond to a PING request before + * webserver start sending the request (ensure that Tomcat is not HOLDED) + */ + int prepost_timeout; + /* Worker priority. * Workers with lower priority are allways preffered - regardless of lb_value * This is user to represent 'local' workers ( we can call it 'proximity' or 'distance' )
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]