On Wed, 26 Jun 2002, GOMEZ Henri wrote: > 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.
Yes, I already did a bit of cleanup - and we can do more. Part of the complexity comes from the attempt to deal with both 2-thread/blocking and 1-thread scenarios, and keep the code common. The 1-thread scenario is used for JNI ( and could be used for doors and possibly other communication mechanism ). I personally think it's worth it, and it affects 2-3 methods in 2 files. As for 'recoverable' - it is more a matter of deciding when a request can no longer be 'recovered' and implementing acordingly. We should remove the second field too - which doesn't seem needed, and document the code more. But the fact is what we're trying to do is not trivial, there are many use-cases that have to be taken into account, and it's normal to have some complexity. Costin > >-----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]> > > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>