tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cos...@apache.org
Subject cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_worker_ajp13.c
Date Wed, 26 Jun 2002 02:41:39 GMT
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:tomcat-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-dev-help@jakarta.apache.org>


Mime
View raw message