hgomez 2004/02/13 00:40:42 Modified: jk/native2/common jk_requtil.c jk_worker_lb.c jk_msg_ajp.c jk_worker_ajp13.c jk/native2/server/apache2 mod_jk2.c jk/native2/include jk_msg.h jk_service.h jk/native2/server/aolserver nsjk2.c jk/native2/server/dsapi jk_dsapi_plugin.c jk/native2/server/isapi jk_isapi_plugin.c jk/native2/server/apache13 mod_jk2.c Log: Port the POST recovery in LB mode from jk.
Need some tests of course Revision Changes Path 1.30 +1 -1 jakarta-tomcat-connectors/jk/native2/common/jk_requtil.c Index: jk_requtil.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_requtil.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- jk_requtil.c 25 Sep 2003 15:23:22 -0000 1.29 +++ jk_requtil.c 13 Feb 2004 08:40:41 -0000 1.30 @@ -752,7 +752,7 @@ } env->l->jkLog(env, env->l, JK_LOG_ERROR, - "handler.marshapPostHead() - error len=%d\n", len); + "handler.marshalPostHead() - error len=%d\n", len); return JK_ERR; } /* -------------------- Query decoding -------------------- */ 1.35 +4 -0 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.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- jk_worker_lb.c 30 Oct 2003 20:08:36 -0000 1.34 +++ jk_worker_lb.c 13 Feb 2004 08:40:41 -0000 1.35 @@ -365,6 +365,10 @@ wEnv->config->ver = wEnv->shm->head->lbVer; } } + + /* Initialize here the recovery POST buffer */ + s->reco_buf = jk2_msg_ajp_create( env, s->pool, 0); + s->reco_status = RECO_INITED; while(1) { int rc; 1.23 +24 -0 jakarta-tomcat-connectors/jk/native2/common/jk_msg_ajp.c Index: jk_msg_ajp.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_msg_ajp.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- jk_msg_ajp.c 25 Sep 2003 15:23:23 -0000 1.22 +++ jk_msg_ajp.c 13 Feb 2004 08:40:41 -0000 1.23 @@ -468,6 +468,29 @@ } +/** + * Copy the msg buf into another one, sort of clone. + * + * Returns -1 on error, else number of bytes copied + */ +static int jk2_msg_ajp_copy(jk_env_t *env, jk_msg_t *msg, jk_msg_t *dmsg) +{ + if (dmsg == NULL) + return -1; + + if(msg->len > dmsg->maxlen ) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "msgAjp.copy(): destination buffer too small %d/%d\n", + msg->len, dmsg->maxlen); + return -2; + } + + memcpy(dmsg->buf, msg->buf, msg->len); + dmsg->len = msg->len; + dmsg->pos = msg->pos; + + return dmsg->len; +} /** * Special method. Will read data from the server and add them as @@ -539,6 +562,7 @@ msg->appendMap=jk2_msg_ajp_appendMap; msg->appendFromServer=jk2_msg_ajp_appendFromServer; + msg->copy=jk2_msg_ajp_copy; msg->getByte=jk2_msg_ajp_getByte; msg->getInt=jk2_msg_ajp_getInt; 1.54 +48 -16 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.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- jk_worker_ajp13.c 29 Jan 2004 14:17:41 -0000 1.53 +++ jk_worker_ajp13.c 13 Feb 2004 08:40:41 -0000 1.54 @@ -447,28 +447,61 @@ Note that chunking will continue to work - using the normal read. */ - if (has_post_body || s->left_bytes_to_send > 0) { + if (has_post_body || s->left_bytes_to_send > 0 || s->reco_status == RECO_FILLED) { /* We never sent any POST data and we check it we have to send at * least of block of data (max 8k). These data will be kept in reply * for resend if the remote Tomcat is down, a fact we will learn only * doing a read (not yet) */ - if( attempt==0 ) - err=jk2_serialize_postHead( env, e->post, s, e ); - else - err=JK_OK; /* We already have the initial body chunk */ - - if( e->worker->mbean->debug > 10 ) - e->request->dump( env, e->request, "Post head" ); - if (err != JK_OK ) { - /* the browser stop sending data, no need to recover */ - /* e->recoverable = JK_FALSE; */ - s->is_recoverable_error = JK_FALSE; - env->l->jkLog(env, env->l, JK_LOG_ERROR, - "ajp13.service() Error receiving initial post %d %d %d\n", err, errno, attempt); - return JK_ERR; + /* If we have the service recovery buffer FILLED and we're in first attempt */ + /* recopy the recovery buffer in post instead of reading it from client */ + if ( s->reco_status == RECO_FILLED && (attempt==0) ) { + /* Get in post buf the previously saved POST */ + + if (s->reco_buf->copy(env, s->reco_buf, e->post) < 0) { + s->is_recoverable_error = JK_FALSE; + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "ajp13.service() can't use the LB recovery buffer, aborting\n"); + return JK_ERR; + } + + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "ajp13.service() using the LB recovery buffer\n"); } + else + { + if( attempt==0 ) + err=jk2_serialize_postHead( env, e->post, s, e ); + else + err=JK_OK; /* We already have the initial body chunk */ + + if( e->worker->mbean->debug > 10 ) + e->request->dump( env, e->request, "Post head" ); + + if (err != JK_OK ) { + /* the browser stop sending data, no need to recover */ + /* e->recoverable = JK_FALSE; */ + s->is_recoverable_error = JK_FALSE; + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "ajp13.service() Error receiving initial post %d %d %d\n", err, errno, attempt); + return JK_ERR; + } + + /* If a recovery buffer exist (LB mode), save here the post buf */ + if (s->reco_status == RECO_INITED) { + /* Save the post for recovery if needed */ + if (e->post->copy(env, e->post, s->reco_buf) < 0) { + s->is_recoverable_error = JK_FALSE; + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "ajp13.service() can't save the LB recovery buffer, aborting\n"); + return JK_ERR; + } + else + s->reco_status = RECO_FILLED; + } + } + has_post_body=JK_TRUE; err= e->worker->channel->send( env, e->worker->channel, e, e->post ); @@ -482,7 +515,6 @@ /* return JK_ERR; */ } } - err = e->worker->workerEnv->processCallbacks(env, e->worker->workerEnv, e, s); 1.66 +5 -2 jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk2.c Index: mod_jk2.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk2.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -r1.65 -r1.66 --- mod_jk2.c 9 Feb 2004 12:01:22 -0000 1.65 +++ mod_jk2.c 13 Feb 2004 08:40:42 -0000 1.66 @@ -760,9 +760,12 @@ /* XXX we should reuse the request itself !!! */ jk2_service_apache2_init( env, s ); - + s->pool = rPool; s->init( env, s, worker, r ); + + /* reset the reco_status, will be set to INITED in LB mode */ + s->reco_status = RECO_NONE; s->is_recoverable_error = JK_FALSE; s->uriEnv = uriEnv; 1.15 +9 -0 jakarta-tomcat-connectors/jk/native2/include/jk_msg.h Index: jk_msg.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_msg.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- jk_msg.h 24 Sep 2002 22:45:18 -0000 1.14 +++ jk_msg.h 13 Feb 2004 08:40:42 -0000 1.15 @@ -196,6 +196,15 @@ struct jk_endpoint *ae, int len ); + /** + * Clone the msg buf into another one, sort of clone. + * + * Returns -1 on error, else number of bytes copied + */ + int (*copy)(struct jk_env *env, + struct jk_msg *_this, + struct jk_msg *dst); + void *_privatePtr; /* Temporary, don't use */ 1.21 +21 -1 jakarta-tomcat-connectors/jk/native2/include/jk_service.h Index: jk_service.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_service.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- jk_service.h 30 Oct 2003 20:11:33 -0000 1.20 +++ jk_service.h 13 Feb 2004 08:40:42 -0000 1.21 @@ -126,6 +126,20 @@ #define SC_M_MKACTIVITY (unsigned char)27 +/* + * RECOVERY STATUS + * + * The recovery buffer status is RECO_NONE unless we're using a LB service. + * In such case, the status is RECO_INITED. + * The first real worker will detect this special status and will fill the + * recovery buffer with initial POST data. In case of failure, the next worker + * will use this recovery buffer to feed tomcat with the saved initial POST data. + */ + +#define RECO_NONE 0x00 +#define RECO_INITED 0x01 +#define RECO_FILLED 0x02 + /* * The web server service 'class'. An instance of this class is created @@ -276,6 +290,12 @@ int outSize; char *outBuf; apr_time_t startTime; + + /* + * Area to get POST data for fail-over recovery in POST (used in LB mode) + */ + struct jk_msg *reco_buf; + int reco_status; /** printf style output. Formats in the tmp buf, then calls write */ 1.3 +4 -0 jakarta-tomcat-connectors/jk/native2/server/aolserver/nsjk2.c Index: nsjk2.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/aolserver/nsjk2.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- nsjk2.c 9 Jun 2003 19:46:06 -0000 1.2 +++ nsjk2.c 13 Feb 2004 08:40:42 -0000 1.3 @@ -286,6 +286,10 @@ s->pool = rPool; s->init( env, s, worker, conn ); + + /* reset the reco_status, will be set to INITED in LB mode */ + s->reco_status = RECO_NONE; + s->is_recoverable_error = JK_FALSE; s->uriEnv = uriEnv; rc = worker->service(env, worker, s); 1.5 +4 -1 jakarta-tomcat-connectors/jk/native2/server/dsapi/jk_dsapi_plugin.c Index: jk_dsapi_plugin.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/dsapi/jk_dsapi_plugin.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- jk_dsapi_plugin.c 29 Jan 2004 16:23:50 -0000 1.4 +++ jk_dsapi_plugin.c 13 Feb 2004 08:40:42 -0000 1.5 @@ -974,6 +974,9 @@ jk2_requtil_initRequest(env, &s); + /* reset the reco_status, will be set to INITED in LB mode */ + s.reco_status = RECO_NONE; + s.pool = rPool; s.is_recoverable_error = JK_FALSE; s.response_started = JK_FALSE; 1.58 +5 -1 jakarta-tomcat-connectors/jk/native2/server/isapi/jk_isapi_plugin.c Index: jk_isapi_plugin.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/jk_isapi_plugin.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -r1.57 -r1.58 --- jk_isapi_plugin.c 6 Feb 2003 23:34:45 -0000 1.57 +++ jk_isapi_plugin.c 13 Feb 2004 08:40:42 -0000 1.58 @@ -503,6 +503,10 @@ jk2_service_iis_init( env, s ); s->pool = rPool; + + /* reset the reco_status, will be set to INITED in LB mode */ + s->reco_status = RECO_NONE; + s->is_recoverable_error = JK_FALSE; s->response_started = JK_FALSE; s->content_read = 0; 1.30 +4 -1 jakarta-tomcat-connectors/jk/native2/server/apache13/mod_jk2.c Index: mod_jk2.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache13/mod_jk2.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- mod_jk2.c 10 Nov 2003 11:05:33 -0000 1.29 +++ mod_jk2.c 13 Feb 2004 08:40:42 -0000 1.30 @@ -569,6 +569,9 @@ s->pool = rPool; s->init( env, s, worker, r ); + /* reset the reco_status, will be set to INITED in LB mode */ + s->reco_status = RECO_NONE; + s->is_recoverable_error = JK_FALSE; s->uriEnv = uriEnv; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]