This part of code in jk 1.2/2.0 is really a spaghetti :[ I spent many times in it, and I think we should refactor it at least in jk2.
Certainly after aplha release. - Henri Gomez ___[_]____ EMAIL : [EMAIL PROTECTED] (. .) PGP KEY : 697ECEDD ...oOOo..(_)..oOOo... PGP Fingerprint : 9DF8 1EA8 ED53 2F39 DC9B 904A 364F 80E6 >-----Original Message----- >From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] >Sent: Wednesday, June 26, 2002 4:42 AM >To: [EMAIL PROTECTED] >Subject: cvs commit: jakarta-tomcat-connectors/jk/native2/common >jk_worker_ajp13.c > > >costin 2002/06/25 19:41:39 > > Modified: jk/native2/common jk_worker_ajp13.c > Log: > Another attempt to fix the 'tomcat restart' problem. > > send ( with either write or send() ) doesn't detect if >tomcat is disconnected - > only the first receive does report the error. > > What we do is use the 'recoverable' field to mark if tomcat >has already > started to process the request ( i.e. we received at least >one packet - > probably the HEAD, in which case the error can't be recovered ). > > If this is just a tomcat restart, we'll save the post body ( >initial chunk ), > and resend it. The logic is a bit tricky - but I think I got >it right this > time ( it affected the case that a POST is made just after restart ) > > Revision Changes Path > 1.34 +17 -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.33 > retrieving revision 1.34 > diff -u -r1.33 -r1.34 > --- jk_worker_ajp13.c 20 Jun 2002 18:45:01 -0000 1.33 > +++ jk_worker_ajp13.c 26 Jun 2002 02:41:39 -0000 1.34 > @@ -299,10 +299,12 @@ > { > int err=JK_OK; > int attempt; > + int has_post_body=JK_FALSE; > + jk_channel_t *channel= worker->channel; > > e->recoverable = JK_TRUE; > s->is_recoverable_error = JK_TRUE; > - > + > /* > * Try to send the request on a valid endpoint. If one endpoint > * fails, close the channel and try again ( maybe >tomcat was restarted ) > @@ -311,7 +313,6 @@ > * a load-balancing configuration > */ > for(attempt = 0 ; attempt < JK_RETRIES ;attempt++) { > - jk_channel_t *channel= worker->channel; > > if( e->sd == -1 ) { > err=jk2_worker_ajp13_connect(env, e); > @@ -322,6 +323,9 @@ > e->worker->in_error_state=JK_TRUE; > return err; > } > + if( worker->mbean->debug > 0 ) > + env->l->jkLog(env, env->l, JK_LOG_INFO, > + "ajp13.service() connecting >to endpoint \n"); > } > > err=e->worker->channel->send( env, e->worker->channel, e, > @@ -332,7 +336,6 @@ > > if (err!=JK_OK ) { > /* Can't send - bad endpoint, try again */ > - > env->l->jkLog(env, env->l, JK_LOG_ERROR, > "ajp13.service() error sending, >reconnect %s %d %d %s\n", > e->worker->channelName, err, >errno, strerror(errno)); > @@ -346,7 +349,7 @@ > request was sent ( we're receiving data from >client, can be slow, no > need to delay - we can do that in paralel. ( not >very sure this is > very usefull, and it brakes the protocol ) ! */ > - if (s->is_chunked || s->left_bytes_to_send > 0) { > + if (has_post_body || s->is_chunked || >s->left_bytes_to_send > 0) { > /* 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 > @@ -354,6 +357,8 @@ > */ > 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" ); > @@ -363,17 +368,20 @@ > /* 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 \n"); > + "ajp13.service() Error >receiving initial post %d %d %d\n", err, errno, attempt); > return JK_ERR; > } > + has_post_body=JK_TRUE; > err= e->worker->channel->send( env, >e->worker->channel, e, > e->post ); > if( err != JK_OK ) { > /* e->recoverable = JK_FALSE; */ > - s->is_recoverable_error = JK_FALSE; > + /* s->is_recoverable_error >= JK_FALSE; */ > env->l->jkLog(env, env->l, JK_LOG_ERROR, > - "ajp13.service() Error >receiving initial post \n"); > - return JK_ERR; > + "ajp13.service() Error >sending initial post %d %d %d\n", err, errno, attempt); > + jk2_close_endpoint(env, e); > + continue; > + /* return JK_ERR; */ > } > } > > @@ -399,6 +407,7 @@ > err); > jk2_close_endpoint(env, e ); > } > + > if( err==JK_OK ) > return err; > } > > > > >-- >To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>