Author: rjung
Date: Mon Feb 22 23:15:19 2010
New Revision: 915107

URL: http://svn.apache.org/viewvc?rev=915107&view=rev
Log:
Add utility function ajp_abort_endpoint() which
- optionally shuts down the connection if valid
- decrements the connection counter
- sets the sd to JK_INVALID_SOCKET
- sets last_op to JK_AJP13_END_RESPONSE

Using it with shutdown=JK_FALSE is meant for the case
when a previous socket operation already implicitely
shut down the connection due to an error
(jk_is_socket_connected, jk_tcp_socket_recvfull,
jk_tcp_socket_sendfull).

Note that this adds two more connection counter decrements
and one more last_op setting.

Modified:
    tomcat/jk/trunk/native/common/jk_ajp_common.c

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=915107&r1=915106&r2=915107&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Mon Feb 22 23:15:19 2010
@@ -732,9 +732,23 @@
 }
 
 /*
- * Reset the endpoint (clean buf and close socket)
+ * Abort endpoint use
  */
+static void ajp_abort_endpoint(ajp_endpoint_t * ae, int shutdown, jk_logger_t 
*l)
+{
+    JK_TRACE_ENTER(l);
+    if (shutdown == JK_TRUE && IS_VALID_SOCKET(ae->sd)) {
+        jk_shutdown_socket(ae->sd, l);
+    }
+    ae->worker->s->connected--;
+    ae->sd = JK_INVALID_SOCKET;
+    ae->last_op = JK_AJP13_END_RESPONSE;
+    JK_TRACE_EXIT(l);
+}
 
+/*
+ * Reset the endpoint (clean buf and close socket)
+ */
 static void ajp_reset_endpoint(ajp_endpoint_t * ae, jk_logger_t *l)
 {
     JK_TRACE_ENTER(l);
@@ -743,11 +757,8 @@
         jk_log(l, JK_LOG_DEBUG,
         "(%s) resetting endpoint with sd = %u %s",
          ae->worker->name, ae->sd, ae->reuse? "" : "(socket shutdown)");
-    if (IS_VALID_SOCKET(ae->sd) && !ae->reuse) {
-        jk_shutdown_socket(ae->sd, l);
-        ae->sd = JK_INVALID_SOCKET;
-        ae->last_op = JK_AJP13_END_RESPONSE;
-        ae->worker->s->connected--;
+    if (!ae->reuse) {
+        ajp_abort_endpoint(ae, JK_TRUE, l);
     }
     jk_reset_pool(&(ae->pool));
     JK_TRACE_EXIT(l);
@@ -760,14 +771,11 @@
 {
     JK_TRACE_ENTER(l);
 
-    if (IS_VALID_SOCKET(ae->sd)) {
-        if (JK_IS_DEBUG_LEVEL(l))
-            jk_log(l, JK_LOG_DEBUG,
-                   "closing endpoint with sd = %u%s",
-                   ae->sd, ae->reuse ? "" : " (socket shutdown)");
-        jk_shutdown_socket(ae->sd, l);
-        ae->sd = JK_INVALID_SOCKET;
-    }
+    if (JK_IS_DEBUG_LEVEL(l))
+        jk_log(l, JK_LOG_DEBUG,
+               "closing endpoint with sd = %u%s",
+               ae->sd, ae->reuse ? "" : " (socket shutdown)");
+    ajp_abort_endpoint(ae, JK_TRUE, l);
     jk_close_pool(&(ae->pool));
     free(ae);
     JK_TRACE_EXIT(l);
@@ -867,9 +875,7 @@
             ae->last_errno = errno;
             jk_log(l, JK_LOG_INFO, "timeout in reply cpong");
             /* We can't trust this connection any more. */
-            jk_shutdown_socket(ae->sd, l);
-            ae->sd = JK_INVALID_SOCKET;
-            ae->last_op = JK_AJP13_END_RESPONSE;
+            ajp_abort_endpoint(ae, JK_TRUE, l);
             JK_TRACE_EXIT(l);
             return JK_FALSE;
         }
@@ -899,9 +905,7 @@
                        "Closing connection",
                        cmd);
                 /* We can't trust this connection any more. */
-                jk_shutdown_socket(ae->sd, l);
-                ae->sd = JK_INVALID_SOCKET;
-                ae->last_op = JK_AJP13_END_RESPONSE;
+                ajp_abort_endpoint(ae, JK_TRUE, l);
                 JK_TRACE_EXIT(l);
                 return JK_FALSE;
             }
@@ -975,10 +979,7 @@
                    "(%s) ajp14 worker logon to the backend server failed",
                    ae->worker->name);
             /* Close the socket if unable to logon */
-            jk_shutdown_socket(ae->sd, l);
-            ae->sd = JK_INVALID_SOCKET;
-            ae->last_op = JK_AJP13_END_RESPONSE;
-            ae->worker->s->connected--;
+            ajp_abort_endpoint(ae, JK_TRUE, l);
         }
     }
     /* XXX: Should we send a cping also after logon to validate the 
connection? */
@@ -1124,10 +1125,7 @@
         /* We've got a protocol error. */
         /* We can't trust this connection any more, */
         /* because we might have send already parts of the request. */
-        jk_shutdown_socket(ae->sd, l);
-        ae->sd = JK_INVALID_SOCKET;
-        ae->last_op = JK_AJP13_END_RESPONSE;
-        ae->worker->s->connected--;
+        ajp_abort_endpoint(ae, JK_TRUE, l);
         JK_TRACE_EXIT(l);
         return JK_FATAL_ERROR;
     }
@@ -1146,9 +1144,7 @@
     jk_log(l, JK_LOG_INFO,
            "sendfull for socket %d returned %d (errno=%d)",
            ae->sd, rc, ae->last_errno);
-    ae->sd = JK_INVALID_SOCKET;
-    ae->last_op = JK_AJP13_END_RESPONSE;
-    ae->worker->s->connected--;
+    ajp_abort_endpoint(ae, JK_FALSE, l);
     JK_TRACE_EXIT(l);
     return JK_FALSE;
 }
@@ -1199,9 +1195,7 @@
                    ae->worker->name, 
jk_dump_hinfo(&ae->worker->worker_inet_addr, buf),
                    ae->last_errno);
         }
-        ae->sd = JK_INVALID_SOCKET;
-        ae->last_op = JK_AJP13_END_RESPONSE;
-        ae->worker->s->connected--;
+        ajp_abort_endpoint(ae, JK_FALSE, l);
         JK_TRACE_EXIT(l);
         return JK_FALSE;
     }
@@ -1224,10 +1218,7 @@
             }
             /* We've got a protocol error. */
             /* We can't trust this connection any more. */
-            jk_shutdown_socket(ae->sd, l);
-            ae->sd = JK_INVALID_SOCKET;
-            ae->last_op = JK_AJP13_END_RESPONSE;
-            ae->worker->s->connected--;
+            ajp_abort_endpoint(ae, JK_TRUE, l);
             JK_TRACE_EXIT(l);
             return JK_AJP_PROTOCOL_ERROR;
         }
@@ -1248,10 +1239,7 @@
             }
             /* We've got a protocol error. */
             /* We can't trust this connection any more. */
-            jk_shutdown_socket(ae->sd, l);
-            ae->sd = JK_INVALID_SOCKET;
-            ae->last_op = JK_AJP13_END_RESPONSE;
-            ae->worker->s->connected--;
+            ajp_abort_endpoint(ae, JK_TRUE, l);
             JK_TRACE_EXIT(l);
             return JK_AJP_PROTOCOL_ERROR;
         }
@@ -1267,10 +1255,7 @@
                jk_dump_hinfo(&ae->worker->worker_inet_addr, buf));
         /* We've got a protocol error. */
         /* We can't trust this connection any more. */
-        jk_shutdown_socket(ae->sd, l);
-        ae->sd = JK_INVALID_SOCKET;
-        ae->last_op = JK_AJP13_END_RESPONSE;
-        ae->worker->s->connected--;
+        ajp_abort_endpoint(ae, JK_TRUE, l);
         JK_TRACE_EXIT(l);
         return JK_AJP_PROTOCOL_ERROR;
     }
@@ -1299,9 +1284,7 @@
                    ae->worker->name, 
jk_dump_hinfo(&ae->worker->worker_inet_addr, buf),
                    ae->last_errno);
         }
-        ae->sd = JK_INVALID_SOCKET;
-        ae->last_op = JK_AJP13_END_RESPONSE;
-        ae->worker->s->connected--;
+        ajp_abort_endpoint(ae, JK_FALSE, l);
         JK_TRACE_EXIT(l);
         /* Although we have a connection, this is effectively a protocol error.
          * We received the AJP header packet, but not the packet payload
@@ -1470,10 +1453,7 @@
                 "(%s) did not receive END_RESPONSE, "
                 "closing socket %d",
                 ae->worker->name, ae->sd);
-        jk_shutdown_socket(ae->sd, l);
-        ae->sd = JK_INVALID_SOCKET;
-        ae->last_op = JK_AJP13_END_RESPONSE;
-        ae->worker->s->connected--;
+        ajp_abort_endpoint(ae, JK_TRUE, l);
     }
     /*
      * First try to check open connections...
@@ -1486,9 +1466,7 @@
                    "(%s) failed sending request, "
                    "socket %d is not connected any more (errno=%d)",
                    ae->worker->name, ae->sd, ae->last_errno);
-            ae->sd = JK_INVALID_SOCKET;
-            ae->last_op = JK_AJP13_END_RESPONSE;
-            ae->worker->s->connected--;
+            ajp_abort_endpoint(ae, JK_FALSE, l);
             err = JK_TRUE;
             err_conn++;
         }
@@ -2006,9 +1984,7 @@
                        "Tomcat is down, stopped or network problems 
(errno=%d)",
                        p->worker->name, p->last_errno);
                 /* We can't trust this connection any more. */
-                jk_shutdown_socket(p->sd, l);
-                p->sd = JK_INVALID_SOCKET;
-                p->worker->s->connected--;
+                ajp_abort_endpoint(p, JK_TRUE, l);
                 if (headeratclient == JK_FALSE) {
                     if (p->worker->recovery_opts & 
RECOVER_ABORT_IF_TCGETREQUEST)
                         op->recoverable = JK_FALSE;



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to