mturk       2005/02/16 07:09:21

  Modified:    jk/native/apache-1.3 mod_jk.c
               jk/native/apache-2.0 mod_jk.c
               jk/native/common jk_ajp12_worker.c jk_ajp_common.c
                        jk_global.h jk_lb_worker.c jk_service.h
               jk/native/iis jk_isapi_plugin.c
  Log:
  Change the way how is_recoverable is handled. Instead this which
  was never used, use that value to return the specific http error code,
  namely 500 or 503.
  
  Revision  Changes    Path
  1.69      +5 -5      jakarta-tomcat-connectors/jk/native/apache-1.3/mod_jk.c
  
  Index: mod_jk.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/apache-1.3/mod_jk.c,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -r1.68 -r1.69
  --- mod_jk.c  15 Feb 2005 07:30:49 -0000      1.68
  +++ mod_jk.c  16 Feb 2005 15:09:20 -0000      1.69
  @@ -1637,6 +1637,7 @@
               struct timeval tv_begin, tv_end;
   #endif
               int rc = JK_FALSE;
  +            int is_error = JK_HTTP_SERVER_ERROR;
               apache_private_data_t private_data;
               jk_ws_service_t s;
               jk_pool_atom_t buf[SMALL_POOL_SIZE];
  @@ -1661,8 +1662,7 @@
               if (init_ws_service(&private_data, &s, conf)) {
                   jk_endpoint_t *end = NULL;
                   if (worker->get_endpoint(worker, &end, l)) {
  -                    int is_recoverable_error = JK_FALSE;
  -                    rc = end->service(end, &s, l, &is_recoverable_error);
  +                    rc = end->service(end, &s, l, &is_error);
   
                       if (s.content_read < s.content_length ||
                           (s.is_chunked && !s.no_more_chunks)) {
  @@ -1705,7 +1705,7 @@
                          " for worker=%s",
                          worker_name);
                   JK_TRACE_EXIT(l);
  -                return HTTP_INTERNAL_SERVER_ERROR;
  +                return is_error;
               }
               jk_close_pool(&private_data.p);
   
  @@ -1739,7 +1739,7 @@
                          " for worker=%s",
                          rc, worker_name);
                   JK_TRACE_EXIT(l);
  -                return HTTP_INTERNAL_SERVER_ERROR;
  +                return is_error;
               }
           }
           else {
  
  
  
  1.126     +5 -5      jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c
  
  Index: mod_jk.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c,v
  retrieving revision 1.125
  retrieving revision 1.126
  diff -u -r1.125 -r1.126
  --- mod_jk.c  15 Feb 2005 07:30:49 -0000      1.125
  +++ mod_jk.c  16 Feb 2005 15:09:20 -0000      1.126
  @@ -86,8 +86,8 @@
   #define __sys_timeval_h__
   #endif
   
  -#include "jk_ajp13.h"
   #include "jk_global.h"
  +#include "jk_ajp13.h"
   #include "jk_logger.h"
   #include "jk_map.h"
   #include "jk_pool.h"
  @@ -1797,6 +1797,7 @@
   #ifndef NO_GETTIMEOFDAY
               struct timeval tv_begin, tv_end;
   #endif
  +            int is_error = HTTP_INTERNAL_SERVER_ERROR;
               int rc = JK_FALSE;
               apache_private_data_t private_data;
               jk_ws_service_t s;
  @@ -1829,9 +1830,8 @@
                   /* worker->get_endpoint might fail if we are out of memory 
so check */
                   /* and handle it */
                   if (worker->get_endpoint(worker, &end, xconf->log)) {
  -                    int is_recoverable_error = JK_FALSE;
                       rc = end->service(end, &s, xconf->log,
  -                                      &is_recoverable_error);
  +                                      &is_error);
   
                       if (s.content_read < s.content_length ||
                           (s.is_chunked && !s.no_more_chunks)) {
  @@ -1915,7 +1915,7 @@
                          " for worker=%s",
                          rc, worker_name);
                   JK_TRACE_EXIT(xconf->log);
  -                return HTTP_INTERNAL_SERVER_ERROR;
  +                return is_error;
               }
           }
           else {
  
  
  
  1.24      +5 -5      
jakarta-tomcat-connectors/jk/native/common/jk_ajp12_worker.c
  
  Index: jk_ajp12_worker.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp12_worker.c,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- jk_ajp12_worker.c 16 Feb 2005 08:15:56 -0000      1.23
  +++ jk_ajp12_worker.c 16 Feb 2005 15:09:20 -0000      1.24
  @@ -85,15 +85,15 @@
   
   static int JK_METHOD service(jk_endpoint_t *e,
                                jk_ws_service_t *s,
  -                             jk_logger_t *l, int *is_recoverable_error)
  +                             jk_logger_t *l, int *is_error)
   {
       jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::service");
   
  -    if (e && e->endpoint_private && s && is_recoverable_error) {
  +    if (e && e->endpoint_private && s && is_error) {
           ajp12_endpoint_t *p = e->endpoint_private;
           unsigned attempt;
   
  -        *is_recoverable_error = JK_TRUE;
  +        *is_error = 0;
   
           for (attempt = 0; attempt < p->worker->connect_retry_attempts;
                attempt++) {
  @@ -113,7 +113,7 @@
                * After we are connected, each error that we are going to
                * have is probably unrecoverable
                */
  -            *is_recoverable_error = JK_FALSE;
  +            *is_error = JK_HTTP_SERVER_ERROR;
               jk_sb_open(&p->sb, p->sd);
               if (ajpv12_handle_request(p, s, l)) {
                   jk_log(l, JK_LOG_DEBUG,
  
  
  
  1.83      +14 -13    
jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c
  
  Index: jk_ajp_common.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c,v
  retrieving revision 1.82
  retrieving revision 1.83
  diff -u -r1.82 -r1.83
  --- jk_ajp_common.c   16 Feb 2005 11:08:14 -0000      1.82
  +++ jk_ajp_common.c   16 Feb 2005 15:09:20 -0000      1.83
  @@ -1562,7 +1562,7 @@
    */
   int JK_METHOD ajp_service(jk_endpoint_t *e,
                             jk_ws_service_t *s,
  -                          jk_logger_t *l, int *is_recoverable_error)
  +                          jk_logger_t *l, int *is_error)
   {
       int i, err;
       ajp_operation_t oper;
  @@ -1570,9 +1570,12 @@
   
       JK_TRACE_ENTER(l);
   
  -    if (e && e->endpoint_private && s && is_recoverable_error) {
  +    if (e && e->endpoint_private && s && is_error) {
           ajp_endpoint_t *p = e->endpoint_private;
           op->request = jk_b_new(&(p->pool));
  +        /* Presume there will be no errors */
  +        *is_error = JK_HTTP_OK;
  +
           jk_b_set_buffer_size(op->request, DEF_BUFFER_SZ);
           jk_b_reset(op->request);
   
  @@ -1589,7 +1592,7 @@
   
           p->left_bytes_to_send = s->content_length;
           p->reuse = JK_FALSE;
  -        *is_recoverable_error = JK_TRUE;
  +        *is_error = 0;
   
           s->secret = p->worker->secret;
   
  @@ -1597,7 +1600,7 @@
            * We get here initial request (in reqmsg)
            */
           if (!ajp_marshal_into_msgb(op->request, s, l, p)) {
  -            *is_recoverable_error = JK_FALSE;
  +            *is_error = JK_HTTP_SERVER_ERROR;
               JK_TRACE_EXIT(l);
               return JK_FALSE;
           }
  @@ -1622,7 +1625,7 @@
                    * (certainly in a big post)
                    */
                   if (!op->recoverable) {
  -                    *is_recoverable_error = JK_FALSE;
  +                    *is_error = JK_HTTP_SERVER_ERROR;
                       jk_log(l, JK_LOG_ERROR,
                              "sending request to tomcat failed "
                              "without recovery in send loop %d", i);
  @@ -1631,7 +1634,7 @@
                   }
   
                   /* Up to there we can recover */
  -                *is_recoverable_error = JK_TRUE;
  +                *is_error = 0;
   
                   err = ajp_get_reply(e, s, l, p, op);
                   if (err > 0) {
  @@ -1646,7 +1649,7 @@
                        * operation is no more recoverable
                        */
                       if (!op->recoverable) {
  -                        *is_recoverable_error = JK_FALSE;
  +                        *is_error = JK_HTTP_SERVER_ERROR;
                           jk_log(l, JK_LOG_ERROR,
                                  "receiving reply from tomcat failed "
                                  "without recovery in send loop %d", i);
  @@ -1662,11 +1665,8 @@
                       }
                   }
               }
  -            /* Get another connection from the pool */
  -            ajp_next_connection(&p, l);
  -
               if (err == JK_CLIENT_ERROR) {
  -                *is_recoverable_error = JK_FALSE;
  +                *is_error = JK_HTTP_SERVER_ERROR;
                   jk_log(l, JK_LOG_ERROR,
                          "Client connection aborted or network problems");
                   JK_TRACE_EXIT(l);
  @@ -1677,7 +1677,8 @@
                          "Sending request to tomcat failed,  "
                          "recoverable operation attempt=%d", i);
               }
  -
  +            /* Get another connection from the pool and try again */
  +            ajp_next_connection(&p, l);
           }
   
           /* Log the error only once per failed request. */
  
  
  
  1.44      +9 -1      jakarta-tomcat-connectors/jk/native/common/jk_global.h
  
  Index: jk_global.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_global.h,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- jk_global.h       15 Feb 2005 11:43:15 -0000      1.43
  +++ jk_global.h       16 Feb 2005 15:09:21 -0000      1.44
  @@ -171,6 +171,14 @@
   #define PATH_ENV_VARIABLE       ("LD_LIBRARY_PATH")
   #endif
   
  +/* HTTP Error codes
  + */
  +
  +#define JK_HTTP_SERVER_ERROR    500
  +#define JK_HTTP_SERVER_BUSY     503
  +#define JK_HTTP_OK              200
  +
  +
   /*
    * RECO STATUS
    */
  
  
  
  1.56      +58 -32    jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c
  
  Index: jk_lb_worker.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- jk_lb_worker.c    16 Feb 2005 13:46:30 -0000      1.55
  +++ jk_lb_worker.c    16 Feb 2005 15:09:21 -0000      1.56
  @@ -477,16 +477,16 @@
   
   static int JK_METHOD service(jk_endpoint_t *e,
                                jk_ws_service_t *s,
  -                             jk_logger_t *l, int *is_recoverable_error)
  +                             jk_logger_t *l, int *is_error)
   {
       JK_TRACE_ENTER(l);
   
  -    if (e && e->endpoint_private && s && is_recoverable_error) {
  +    if (e && e->endpoint_private && s && is_error) {
           lb_endpoint_t *p = e->endpoint_private;
           int attempt = 0;
  -
  +        int num_of_workers = p->worker->num_of_workers;
           /* you can not recover on another load balancer */
  -        *is_recoverable_error = JK_FALSE;
  +        *is_error = JK_HTTP_OK;
   
           /* set the recovery post, for LB mode */
           s->reco_buf = jk_b_new(s->pool);
  @@ -498,13 +498,13 @@
                      "service sticky_session=%d",
                      p->worker->s->sticky_session);
   
  -        while (1) {
  +        while (num_of_workers) {
               worker_record_t *rec =
                   get_most_suitable_worker(p->worker, s, attempt++, l);
               int rc;
   
               if (rec) {
  -                int is_recoverable = JK_FALSE;
  +                int is_service_error = JK_HTTP_OK;
                   jk_endpoint_t *end = NULL;
   
                   s->jvm_route = jk_pool_strdup(s->pool, rec->s->name);
  @@ -518,8 +518,12 @@
                   rec->s->elected++;
                   if (rc && end) {
                       int src;
  -                    end->rd = end->wr = 0;
  -                    src = end->service(end, s, l, &is_recoverable);
  +                    /* Reset endpoint read and write sizes for
  +                     * this request.
  +                     */
  +                    end->rd = end->wr = 0;                    
  +                    src = end->service(end, s, l, &is_service_error);
  +                    /* Update partial reads and writes if any */
                       rec->s->readed += end->rd;
                       rec->s->transferred += end->wr;
                       end->done(&end, l);
  @@ -531,46 +535,68 @@
                           return JK_TRUE;
                       }
                   }
  -                rec->s->errors++;
  -                /*
  -                 * Service failed !!!
  -                 *
  -                 * Time for fault tolerance (if possible)...
  -                 */
  -
  -                rec->s->in_error_state = JK_TRUE;
  -                rec->s->in_recovering = JK_FALSE;
  -                rec->s->error_time = time(0);
  -
  -                if (end && !is_recoverable) {
  +                if (end) {
                       /*
  -                     * Error is not recoverable - break with an error.
  +                    * Service failed !!!
  +                    *
  +                    * Time for fault tolerance (if possible)...
  +                    */
  +
  +                    rec->s->errors++;
  +                    rec->s->in_error_state = JK_TRUE;
  +                    rec->s->in_recovering = JK_FALSE;
  +                    rec->s->error_time = time(0);
  +
  +                    if (is_service_error > JK_HTTP_OK) {
  +                        /*
  +                        * Error is not recoverable - break with an error.
  +                        */
  +                        jk_log(l, JK_LOG_ERROR,
  +                            "unrecoverable error %d, request failed."
  +                            " Tomcat failed in the middle of request,"
  +                            " we can't recover to another instance.",
  +                            is_service_error);
  +                        *is_error = is_service_error;
  +                        JK_TRACE_EXIT(l);
  +                        return JK_FALSE;
  +                    }
  +                }
  +                else {
  +                    /* If we can not get the endpoint from the worker
  +                     * that does not mean that the worker is in error
  +                     * state. It means that the worker is busy.
  +                     * We will try another worker.
  +                     * To prevent infinite loop decrement worker count;
                        */
  -                    jk_log(l, JK_LOG_ERROR,
  -                           "unrecoverable error, request failed."
  -                           " Tomcat failed in the middle of request,"
  -                           " we can't recover to another instance.");
  -                    JK_TRACE_EXIT(l);
  -                    return JK_FALSE;
  +                    --num_of_workers;
                   }
  -
                   /* 
                    * Error is recoverable by submitting the request to
                    * another worker... Lets try to do that.
                    */
  -                jk_log(l, JK_LOG_DEBUG,
  -                       "recoverable error... will try to recover on other 
host");
  +                if (JK_IS_DEBUG_LEVEL(l))
  +                    jk_log(l, JK_LOG_DEBUG,
  +                           "recoverable error... will try to recover on 
other host");
               }
               else {
                   /* NULL record, no more workers left ... */
                   jk_log(l, JK_LOG_ERROR,
  -                       "lb: All tomcat instances failed, no more workers 
left.");
  +                       "All tomcat instances failed, no more workers left");
                   JK_TRACE_EXIT(l);
  +                *is_error = JK_HTTP_SERVER_ERROR;
                   return JK_FALSE;
               }
           }
  +        jk_log(l, JK_LOG_INFO,
  +               "All tomcat instances are busy, no more endpoints left. "
  +               "Rise cache_size to match the load");
  +        JK_TRACE_EXIT(l);
  +        /* Set error to Server busy */
  +        *is_error = JK_HTTP_SERVER_BUSY;
  +        return JK_FALSE;
       }
  -
  +    if (is_error)
  +        *is_error = JK_HTTP_SERVER_ERROR;
       JK_LOG_NULL_PARAMS(l);
       JK_TRACE_EXIT(l);
       return JK_FALSE;
  
  
  
  1.29      +5 -4      jakarta-tomcat-connectors/jk/native/common/jk_service.h
  
  Index: jk_service.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_service.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- jk_service.h      15 Feb 2005 08:52:53 -0000      1.28
  +++ jk_service.h      16 Feb 2005 15:09:21 -0000      1.29
  @@ -290,12 +290,13 @@
   
       /*
        * Forward a request to the servlet engine.  The request is described
  -     * by the jk_ws_service_t object.  I'm not sure exactly how
  -     * is_recoverable_error is being used.  
  +     * by the jk_ws_service_t object.
  +     * is_error is either 0 meaning recoverable or set to
  +     * the HTTP error code.
        */
       int (JK_METHOD * service) (jk_endpoint_t *e,
                                  jk_ws_service_t *s,
  -                               jk_logger_t *l, int *is_recoverable_error);
  +                               jk_logger_t *l, int *is_error);
   
       /*
        * Called when this particular endpoint has finished processing a
  
  
  
  1.39      +4 -3      jakarta-tomcat-connectors/jk/native/iis/jk_isapi_plugin.c
  
  Index: jk_isapi_plugin.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native/iis/jk_isapi_plugin.c,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- jk_isapi_plugin.c 13 Feb 2005 12:26:24 -0000      1.38
  +++ jk_isapi_plugin.c 16 Feb 2005 15:09:21 -0000      1.39
  @@ -927,14 +927,15 @@
                   /* Update retries for this worker */
                   s.retries = worker->retries;
                   if (worker->get_endpoint(worker, &e, logger)) {
  -                    int recover = JK_FALSE;
  -                    if (e->service(e, &s, logger, &recover)) {
  +                    int is_error = JK_HTTP_SERVER_ERROR;
  +                    if (e->service(e, &s, logger, &is_error)) {
                           rc = HSE_STATUS_SUCCESS;
                           lpEcb->dwHttpStatusCode = HTTP_STATUS_OK;
                           jk_log(logger, JK_LOG_DEBUG,
                                  "service() returned OK");
                       }
                       else {
  +                        lpEcb->dwHttpStatusCode = is_error;
                           jk_log(logger, JK_LOG_ERROR,
                                  "service() failed");
                       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to