mturk       2005/02/16 23:14:20

  Modified:    jk/native/common jk_ajp_common.c
  Log:
  Fix getting next socket from pool and add is_connected checking if
  socket_timeout is set. Also no need to reconect if is_connected or
  cping/cpong failed, because tomcat is either dead or disconnected.
  Use another worker instead, marking this one in error state.
  
  Revision  Changes    Path
  1.85      +82 -47    
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.84
  retrieving revision 1.85
  diff -u -r1.84 -r1.85
  --- jk_ajp_common.c   16 Feb 2005 15:28:28 -0000      1.84
  +++ jk_ajp_common.c   17 Feb 2005 07:14:19 -0000      1.85
  @@ -720,24 +720,22 @@
    * Try another connection from cache
    */
   
  -static void ajp_next_connection(ajp_endpoint_t **ae, jk_logger_t *l)
  +static void ajp_next_connection(ajp_endpoint_t *ae, jk_logger_t *l)
   {
       int rc;
  -    ajp_worker_t *aw = (*ae)->worker;
  -
  -    /* Close existing endpoint socket */
  -    jk_close_socket((*ae)->sd);
  -    (*ae)->sd = -1;
  +    ajp_worker_t *aw = ae->worker;
   
       JK_ENTER_CS(&aw->cs, rc);
       if (rc) {
           unsigned int i;
  +        /* Close existing endpoint socket */
  +        jk_close_socket(ae->sd);
  +        ae->sd = -1;
           for (i = 0; i < aw->ep_cache_sz; i++) {
               /* Find cache slot with usable socket */
               if (aw->ep_cache[i] && aw->ep_cache[i]->sd > 0) {
  -                ajp_endpoint_t *e = aw->ep_cache[i];
  -                aw->ep_cache[i] = *ae;
  -                *ae = e;
  +                ae->sd = aw->ep_cache[i]->sd;
  +                 aw->ep_cache[i]->sd = -1;
                   break;
               }
           }
  @@ -837,7 +835,8 @@
       for (attempt = 0; attempt < ae->worker->connect_retry_attempts; 
attempt++) {
           ae->sd = jk_open_socket(&ae->worker->worker_inet_addr,
                                   ae->worker->keepalive,
  -                                ae->worker->socket_timeout, l);
  +                                ae->worker->socket_timeout,
  +                                ae->worker->socket_buf, l);
           if (ae->sd >= 0) {
               jk_log(l, JK_LOG_DEBUG,
                      "connected sd = %d to %s",
  @@ -845,6 +844,17 @@
   
               /* set last_access */
               ae->last_access = time(NULL);
  +            if (ae->worker->socket_timeout) {
  +                int rc = 0;
  +                if ((rc = jk_is_socket_connected(ae->sd, 
ae->worker->socket_timeout)) != 1) {
  +                        jk_log(l, JK_LOG_INFO,
  +                            "Socket is not connected any more (status=%d)", 
rc);
  +                    jk_close_socket(ae->sd);
  +                    ae->sd = -1;
  +                    JK_TRACE_EXIT(l);
  +                    return JK_FALSE;
  +                }
  +            }
               /* Check if we must execute a logon after the physical connect */
               if (ae->worker->logon != NULL) {
                   rc = ae->worker->logon(ae, l);
  @@ -1148,13 +1158,22 @@
        */
       while ((ae->sd > 0)) {
           err = 0;
  -
           /* handle cping/cpong before request if timeout is set */
           if (ae->worker->prepost_timeout != 0) {
               if (ajp_handle_cping_cpong(ae, ae->worker->prepost_timeout, l) ==
                   JK_FALSE)
                   err++;
           }
  +        else if (ae->worker->socket_timeout) {
  +            int rc = 0;
  +            if ((rc = jk_is_socket_connected(ae->sd, 
ae->worker->socket_timeout)) != 1) {
  +                    jk_log(l, JK_LOG_INFO,
  +                           "Socket is not connected any more (status=%d)", 
rc);
  +                jk_close_socket(ae->sd);
  +                ae->sd = -1;
  +                err++;
  +            }
  +        }
   
           /* If we got an error or can't send data, then try to get a pooled
            * connection and try again.  If we are succesful, break out of this
  @@ -1163,7 +1182,7 @@
               (ajp_connection_tcp_send_message(ae, op->request, l) == 
JK_FALSE)) {
               jk_log(l, JK_LOG_INFO,
                      "Error sending request. Will try another pooled 
connection");
  -            ajp_next_connection(&ae, l);
  +            ajp_next_connection(ae, l);
           }
           else
               break;
  @@ -1173,7 +1192,14 @@
        * If we failed to reuse a connection, try to reconnect.
        */
       if (ae->sd < 0) {
  -
  +        
  +        if (err) {
  +            /* XXX: If err is set, the tomcat is either dead or disconnected 
*/
  +            jk_log(l, JK_LOG_INFO,
  +                   "All endpoints are disconnected or dead");
  +            JK_TRACE_EXIT(l);
  +            return JK_FALSE;
  +        }
           /* no need to handle cping/cpong here since it should be at 
connection time */
   
           if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
  @@ -1639,7 +1665,7 @@
                   err = ajp_get_reply(e, s, l, p, op);
                   if (err > 0) {
                       JK_TRACE_EXIT(l);
  -                    return (JK_TRUE);
  +                    return JK_TRUE;
                   }
   
                   if (err != JK_CLIENT_ERROR) {
  @@ -1675,17 +1701,17 @@
               else {
                   jk_log(l, JK_LOG_INFO,
                          "Sending request to tomcat failed,  "
  -                       "recoverable operation attempt=%d", i);
  +                       "recoverable operation attempt=%d", i + 1);
               }
               /* Get another connection from the pool and try again */
  -            ajp_next_connection(&p, l);
  +            ajp_next_connection(p, l);
           }
   
           /* Log the error only once per failed request. */
           jk_log(l, JK_LOG_ERROR,
                  "Error connecting to tomcat. Tomcat is probably not started "
  -               "or is listening on the wrong port. worker=%s failed errno = 
%d",
  -               p->worker->name, errno);
  +               "or is listening on the wrong port. worker=%s failed",
  +               p->worker->name);
   
       }
       else {
  @@ -1789,6 +1815,9 @@
           p->socket_timeout =
               jk_get_worker_socket_timeout(props, p->name, 
AJP_DEF_SOCKET_TIMEOUT);
   
  +        p->socket_buf =
  +            jk_get_worker_socket_buffer(props, p->name, 512);
  +
           p->keepalive =
               jk_get_worker_socket_keepalive(props, p->name, JK_FALSE);
   
  @@ -1836,6 +1865,10 @@
                      p->socket_timeout);
   
               jk_log(l, JK_LOG_DEBUG,
  +                   "setting socket buffer size to %d",
  +                   p->socket_buf);
  +
  +            jk_log(l, JK_LOG_DEBUG,
                      "setting connection recycle timeout to %d",
                      p->recycle_timeout);
   
  @@ -1890,6 +1923,9 @@
                       JK_TRACE_EXIT(l);
                       return JK_FALSE;
                   }
  +                jk_log(l, JK_LOG_DEBUG,
  +                    "Initialized endpont cache slot %d %#lx:%#lx",
  +                    i, p->ep_cache[i], &(p->ep_cache[i]->pool));
               }
               JK_INIT_CS(&(p->cs), i);
               if (i == JK_FALSE) {
  @@ -1922,23 +1958,20 @@
       JK_TRACE_ENTER(l);
   
       if (pThis && *pThis && (*pThis)->worker_private) {
  +        unsigned int i;
           ajp_worker_t *aw = (*pThis)->worker_private;
   
           if (JK_IS_DEBUG_LEVEL(l))
               jk_log(l, JK_LOG_DEBUG,
  -                   "up to %d endpoint to close",
  +                   "up to %d endpoints to close",
                      aw->ep_cache_sz);
   
  -        if (aw->ep_cache_sz) {
  -            unsigned int i;
  -            for (i = 0; i < aw->ep_cache_sz; i++) {
  -                if (aw->ep_cache[i]) {
  -                    ajp_close_endpoint(aw->ep_cache[i], l);
  -                }
  -            }
  -            free(aw->ep_cache);
  -            JK_DELETE_CS(&(aw->cs), i);
  +        for (i = 0; i < aw->ep_cache_sz; i++) {
  +            if (aw->ep_cache[i])
  +                ajp_close_endpoint(aw->ep_cache[i], l);
           }
  +        free(aw->ep_cache);
  +        JK_DELETE_CS(&(aw->cs), i);
   
           if (aw->login) {
                /* take care of removing previously allocated data */
  @@ -1978,6 +2011,7 @@
                       break;
                   }
               }
  +            *e = NULL;
               JK_LEAVE_CS(&w->cs, rc);
               if (i >= 0) {
                   if (JK_IS_DEBUG_LEVEL(l))
  @@ -1985,7 +2019,6 @@
                               "recycling connection cache slot=%d for worker 
%s",
                               i, p->worker->name);
                   JK_TRACE_EXIT(l);
  -                *e = NULL;
                   return JK_TRUE;
               }
               jk_log(l, JK_LOG_INFO,
  @@ -2018,27 +2051,26 @@
   
           JK_ENTER_CS(&aw->cs, rc);
           if (rc) {
  -            unsigned int i;
  -            for (i = 0; i < aw->ep_cache_sz; i++) {
  -                if (aw->ep_cache[i]) {
  -                    ae = aw->ep_cache[i];
  -                    aw->ep_cache[i] = NULL;
  +            unsigned int i, slot;
  +            for (slot = 0; slot < aw->ep_cache_sz; slot++) {
  +                if (aw->ep_cache[slot]) {
  +                    ae = aw->ep_cache[slot];
  +                    aw->ep_cache[slot] = NULL;
                       break;
                   }
               }
               /* Handle enpoint cache timeouts */
  -            if (ae && aw->cache_timeout) {
  +            if (aw->cache_timeout) {
                   for (i = 0; i < aw->ep_cache_sz; i++) {
                       /* Skip the cached enty */
  -                    if (aw->ep_cache[i] && (ae != aw->ep_cache[i])) {
  -                        int elapsed =
  -                            (int)(now - ae->last_access);
  +                    if (aw->ep_cache[i]) {
  +                        int elapsed = (int)(now - 
aw->ep_cache[i]->last_access);
                           if (elapsed > aw->cache_timeout) {
                               aw->ep_cache[i]->reuse = JK_FALSE;
                               ajp_reset_endpoint(aw->ep_cache[i], l);
                               if (JK_IS_DEBUG_LEVEL(l))
                                   jk_log(l, JK_LOG_DEBUG,
  -                                        "cleaning cache slot = %d elapsed 
%u",
  +                                        "cleaning cache slot=%d elapsed %u",
                                           i, elapsed);
                           }
                       }
  @@ -2046,25 +2078,28 @@
               }
               JK_LEAVE_CS(&aw->cs, rc);
               if (ae) {
  -                if (ae->sd > 0) {
  +                if (ae->sd > 0 && aw->recycle_timeout > 0) {
                       /* Handle timeouts for open sockets */
                       int elapsed = (int)(now - ae->last_access);
                       if (JK_IS_DEBUG_LEVEL(l))
                           jk_log(l, JK_LOG_DEBUG,
  -                                "time elapsed since last request = %u 
seconds",
  -                                elapsed);
  -                    if (aw->recycle_timeout > 0 &&
  -                        elapsed > aw->recycle_timeout) {
  +                               "time elapsed since last request = %u 
seconds",
  +                               elapsed);
  +                    if (elapsed > aw->recycle_timeout) {
                           ae->reuse = JK_FALSE;
                           ajp_reset_endpoint(ae, l);
                           if (JK_IS_DEBUG_LEVEL(l))
                               jk_log(l, JK_LOG_DEBUG,
  -                                    "reached connection recycle timeout, 
closed sd = %d",
  -                                    ae->sd);
  +                                    "reached connection recycle timeout, 
closed cache slot=%d",
  +                                    slot);
                       }
                   }
                   ae->last_access = now;
                   *je = &ae->endpoint;
  +                if (JK_IS_DEBUG_LEVEL(l))
  +                    jk_log(l, JK_LOG_DEBUG,
  +                           "acquired connection cache slot=%d",
  +                           slot);
                   JK_TRACE_EXIT(l);
                   return JK_TRUE;
               }
  
  
  

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

Reply via email to