You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by an...@apache.org on 2012/06/06 09:39:28 UTC

svn commit: r1346766 - in /openejb/trunk/openejb/server: openejb-client/src/main/java/org/apache/openejb/client/ openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/ openejb-server/src/main/java/org/apache/openejb/server/

Author: andygumbrecht
Date: Wed Jun  6 07:39:27 2012
New Revision: 1346766

URL: http://svn.apache.org/viewvc?rev=1346766&view=rev
Log:
ServiceLogger was doing a client host name resolution on every socket just for logging (ouch) - Changed to IP and static log level.
SocketConnectionFactory - Ensure a bad or lost connection gets discarded and cleaned up as early as possible.
Push StackTrace logging to debug level - An off the rails client could fill logs in minutes (dos).

Modified:
    openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/AbstractConnectionStrategy.java
    openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
    openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
    openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
    openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java

Modified: openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/AbstractConnectionStrategy.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/AbstractConnectionStrategy.java?rev=1346766&r1=1346765&r2=1346766&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/AbstractConnectionStrategy.java (original)
+++ openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/AbstractConnectionStrategy.java Wed Jun  6 07:39:27 2012
@@ -30,6 +30,8 @@ import java.util.Set;
  * @version $Rev$ $Date$
  */
 public abstract class AbstractConnectionStrategy implements ConnectionStrategy {
+
+    @Override
     public Connection connect(ClusterMetaData cluster, ServerMetaData server) throws IOException {
         final Set<URI> failed = Client.getFailed();
         final Set<URI> remaining = new HashSet<URI>();

Modified: openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java?rev=1346766&r1=1346765&r2=1346766&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java (original)
+++ openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java Wed Jun  6 07:39:27 2012
@@ -185,6 +185,44 @@ public class SocketConnectionFactory imp
             this.pool = pool;
         }
 
+        @Override
+        protected void finalize() throws Throwable {
+
+            try {
+
+                cleanUp();
+
+            } finally {
+                super.finalize();
+            }
+        }
+
+        private void cleanUp() {
+            if (null != in) {
+                try {
+                    in.close();
+                } catch (Throwable e) {
+                    //Ignore
+                }
+            }
+
+            if (null != out) {
+                try {
+                    out.close();
+                } catch (Throwable e) {
+                    //Ignore
+                }
+            }
+
+            if (null != socket) {
+                try {
+                    socket.close();
+                } catch (Throwable e) {
+                    //Ignore
+                }
+            }
+        }
+
         protected void open(final URI uri) throws IOException {
 
             /*-----------------------*/
@@ -206,30 +244,36 @@ public class SocketConnectionFactory imp
 
                 socket.setTcpNoDelay(true);
                 Client.fireEvent(new ConnectionOpened(uri));
+
             } catch (ConnectException e) {
-                throw new IOException("Cannot connect to server '" + uri.toString() + "'.  Check that the server is started and that the specified serverURL is correct.", e);
+                throw this.failure("Cannot connect to server '" + uri.toString() + "'.  Check that the server is started and that the specified serverURL is correct.", e);
 
             } catch (IOException e) {
-                throw new IOException("Cannot connect to server: '" + uri.toString() + "'.  Exception: " + e.getClass().getName() + " : " + e.getMessage(), e);
+                throw this.failure("Cannot connect to server: '" + uri.toString() + "'.  Exception: " + e.getClass().getName() + " : " + e.getMessage(), e);
 
             } catch (SecurityException e) {
-                throw new IOException("Cannot access server: '" + uri.toString() + "' due to security restrictions in the current VM: " + e.getClass().getName() + " : " + e.getMessage(), e);
+                throw this.failure("Cannot access server: '" + uri.toString() + "' due to security restrictions in the current VM: " + e.getClass().getName() + " : " + e.getMessage(), e);
 
             } catch (Throwable e) {
-                throw new IOException("Cannot  connect to server: '" + uri.toString() + "' due to an unkown exception in the OpenEJB client: " + e.getClass().getName() + " : " + e.getMessage(), e);
+                throw this.failure("Cannot  connect to server: '" + uri.toString() + "' due to an unknown exception in the OpenEJB client: " + e.getClass().getName() + " : " + e.getMessage(), e);
             }
 
         }
 
+        private IOException failure(final String err, final Throwable e) {
+            this.discard();
+            return new IOException(err, e);
+        }
+
         @Override
         public void discard() {
-            pool.put(null);
-            discarded = true;
             try {
-                socket.close();
-            } catch (Throwable e) {
-                //Ignore
+                pool.put(null);
+            } finally {
+                discarded = true;
+                cleanUp();
             }
+
             // don't bother unlocking it
             // it should never get used again
         }
@@ -258,35 +302,36 @@ public class SocketConnectionFactory imp
                 }
 
                 return new Input(in);
+
             } catch (StreamCorruptedException e) {
-                throw new IOException("Cannot open input stream to server, the stream has been corrupted: " + e.getClass().getName() + " : " + e.getMessage());
+                throw this.failure("Cannot open input stream to server, the stream has been corrupted: " + e.getClass().getName(), e);
 
             } catch (IOException e) {
-                throw new IOException("Cannot open input stream to server: " + e.getClass().getName() + " : " + e.getMessage());
+                throw this.failure("Cannot open input stream to server: " + e.getClass().getName(), e);
 
             } catch (Throwable e) {
-                throw new IOException("Cannot open output stream to server: " + e.getClass().getName() + " : " + e.getMessage());
+                throw this.failure("Cannot open output stream to server: " + e.getClass().getName(), e);
             }
         }
 
         @Override
         public OutputStream getOuputStream() throws IOException {
-            /*----------------------------------*/
-            /* Openning output streams */
-            /*----------------------------------*/
+
             try {
+
                 if (out == null) {
                     out = new BufferedOutputStream(socket.getOutputStream());
                 }
+
                 return new Output(out);
+
             } catch (IOException e) {
-                throw new IOException("Cannot open output stream to server: " + e.getClass().getName() + " : " + e.getMessage());
+                throw this.failure("Cannot open output stream to server: " + e.getClass().getName(), e);
 
             } catch (Throwable e) {
-                throw new IOException("Cannot open output stream to server: " + e.getClass().getName() + " : " + e.getMessage());
+                throw this.failure("Cannot open output stream to server: " + e.getClass().getName(), e);
             }
         }
-
     }
 
     public class Input extends java.io.FilterInputStream {

Modified: openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java?rev=1346766&r1=1346765&r2=1346766&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java (original)
+++ openejb/trunk/openejb/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java Wed Jun  6 07:39:27 2012
@@ -18,7 +18,11 @@ package org.apache.openejb.server.ejbd;
 
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.ProxyInfo;
-import org.apache.openejb.client.*;
+import org.apache.openejb.client.EJBRequest;
+import org.apache.openejb.client.EjbObjectInputStream;
+import org.apache.openejb.client.ProtocolMetaData;
+import org.apache.openejb.client.RequestType;
+import org.apache.openejb.client.ServerMetaData;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.server.DiscoveryAgent;
 import org.apache.openejb.spi.ContainerSystem;
@@ -26,7 +30,11 @@ import org.apache.openejb.util.LogCatego
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
 
-import java.io.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
 import java.net.Socket;
 import java.rmi.RemoteException;
 import java.util.Properties;
@@ -177,35 +185,52 @@ public class EjbDaemon implements org.ap
                     break;
             }
         } catch (IllegalArgumentException iae) {
-            logger.error("\"" + protocolMetaData.getSpec() + "\" FAIL \"Unknown request type " + requestTypeByte);
+            final String msg = "\"" + protocolMetaData.getSpec() + "\" FAIL \"Unknown request type " + requestTypeByte;
+            if (logger.isDebugEnabled()) {
+                logger.error(msg, iae);
+            } else {
+                logger.error(msg + " - Debug for StackTrace");
+            }
         } catch (SecurityException e) {
-            logger.error("\"" + requestType + " " + protocolMetaData.getSpec() + "\" FAIL \"Security error - " + e.getMessage() + "\"", e);
+            final String msg = "\"" + requestType + " " + protocolMetaData.getSpec() + "\" FAIL \"Security error - " + e.getMessage() + "\"";
+            if (logger.isDebugEnabled()) {
+                logger.error(msg, e);
+            } else {
+                logger.error(msg + " - Debug for StackTrace");
+            }
         } catch (Throwable e) {
-            logger.error("\"" + requestType + " " + protocolMetaData.getSpec() + "\" FAIL \"Unexpected error - " + e.getMessage() + "\"", e);
+            final String msg = "\"" + requestType + " " + protocolMetaData.getSpec() + "\" FAIL \"Unexpected error - " + e.getMessage() + "\"";
+            if (logger.isDebugEnabled()) {
+                logger.error(msg, e);
+            } else {
+                logger.error(msg + " - Debug for StackTrace");
+            }
         } finally {
 
-            ClientObjectFactory.serverMetaData.remove();
-
-            if (null != oos) {
-
-                try {
-                    oos.flush();
-                } catch (Throwable e) {
-                    //Ignore
+            try {
+                ClientObjectFactory.serverMetaData.remove();
+            } finally {
+                if (null != oos) {
+
+                    try {
+                        oos.flush();
+                    } catch (Throwable e) {
+                        //Ignore
+                    }
+
+                    try {
+                        oos.close();
+                    } catch (Throwable e) {
+                        //Ignore
+                    }
                 }
 
-                try {
-                    oos.close();
-                } catch (Throwable e) {
-                    //Ignore
-                }
-            }
-
-            if (null != ois) {
-                try {
-                    ois.close();
-                } catch (Throwable e) {
-                    //Ignore
+                if (null != ois) {
+                    try {
+                        ois.close();
+                    } catch (Throwable e) {
+                        //Ignore
+                    }
                 }
             }
         }

Modified: openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java?rev=1346766&r1=1346765&r2=1346766&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java (original)
+++ openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceLogger.java Wed Jun  6 07:39:27 2012
@@ -19,7 +19,6 @@ package org.apache.openejb.server;
 import org.apache.openejb.monitoring.Managed;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
-import org.apache.openejb.util.Messages;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -36,23 +35,28 @@ import java.util.Properties;
 public class ServiceLogger extends ServerServiceFilter {
 
     private Logger logger;
+    private boolean debug = false;
 
     public ServiceLogger(ServerService next) {
         super(next);
     }
 
+    @Override
     public void init(Properties props) throws Exception {
 
-        logger = Logger.getInstance(LogCategory.OPENEJB_SERVER.createChild("service."+getName()), "org.apache.openejb.server.util.resources");
+        this.logger = Logger.getInstance(LogCategory.OPENEJB_SERVER.createChild("service." + getName()), "org.apache.openejb.server.util.resources");
+        this.debug = this.logger.isDebugEnabled();
 
         super.init(props);
     }
 
+    @Override
     public void service(InputStream in, OutputStream out) throws ServiceException, IOException {
         throw new UnsupportedOperationException("service(in,out)");
     }
 
     private static Method MDBput = null;
+
     static {
         try {
             final Class<?> MDC = ServiceLogger.class.getClassLoader().loadClass("org.apache.log4j.MDC");
@@ -62,6 +66,7 @@ public class ServiceLogger extends Serve
                     .info("can't find log4j MDC class");
         }
     }
+
     public static void MDCput(final String key, final String value) {
         if (MDBput != null) {
             try {
@@ -71,19 +76,31 @@ public class ServiceLogger extends Serve
             }
         }
     }
-    
+
+    @Override
     public void service(Socket socket) throws ServiceException, IOException {
+
         InetAddress client = socket.getInetAddress();
+        final String address = client.getHostAddress();
+        final String name = this.getName();
 
-        MDCput("HOST", client.getHostAddress());
-        MDCput("SERVER", getName());
+        MDCput("HOST", address);
+        MDCput("SERVER", name);
 
-        final long start = System.nanoTime();
         try {
+            final long start = System.nanoTime();
             super.service(socket);
-            logger.debug("[request] " + getName() + " " + socket.getPort() + " - " + client.getHostName() + " - " + (System.nanoTime() - start) + "ns");
+
+            if (this.debug) {
+                this.logger.debug("[request] for '" + name + "' by '" + address + "' took " + (System.nanoTime() - start) + "ns");
+            }
         } catch (Exception e) {
-            logger.error("[failure] " + socket.getPort() + " - " + client.getHostAddress() + ": " + e.getMessage(), e);
+            final String msg = "[Request failed] for '" + name + "' by '" + address + "' : " + e.getMessage();
+            if (this.debug) {
+                this.logger.error(msg, e);
+            } else {
+                this.logger.error(msg + " - Debug for StackTrace");
+            }
         }
     }
 }

Modified: openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java?rev=1346766&r1=1346765&r2=1346766&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java (original)
+++ openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServicePool.java Wed Jun  6 07:39:27 2012
@@ -84,11 +84,26 @@ public class ServicePool extends ServerS
                     if (stop.get()) return;
                     ServicePool.super.service(socket);
                 } catch (SecurityException e) {
-                    log.error("Security error: " + e.getMessage(), e);
+                    final String msg = "ServicePool: Security error: " + e.getMessage();
+                    if (log.isDebugEnabled()) {
+                        log.error(msg, e);
+                    } else {
+                        log.error(msg + " - Debug for StackTrace");
+                    }
                 } catch (IOException e) {
-                    log.debug("Unexpected IO error", e);
+                    final String msg = "ServicePool: Unexpected IO error: " + e.getMessage();
+                    if (log.isDebugEnabled()) {
+                        log.debug(msg, e);
+                    } else {
+                        log.warning(msg + " - Debug for StackTrace");
+                    }
                 } catch (Throwable e) {
-                    log.error("Unexpected error", e);
+                    final String msg = "ServicePool: Unexpected error: " + e.getMessage();
+                    if (log.isDebugEnabled()) {
+                        log.error(msg, e);
+                    } else {
+                        log.error(msg + " - Debug for StackTrace");
+                    }
                 } finally {
                     try {
                         // Once the thread is done with the socket, clean it up
@@ -101,7 +116,12 @@ public class ServicePool extends ServerS
                             socket.close();
                         }
                     } catch (Throwable t) {
-                        log.warning("Error while closing connection with client", t);
+                        final String msg = "ServicePool: Error closing socket";
+                        if (log.isDebugEnabled()) {
+                            log.debug(msg, t);
+                        } else {
+                            log.warning(msg);
+                        }
                     }
                 }
             }