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);
+ }
}
}
}