First, nice fixes! I always love how incredibly specific your fixes are. We should file some JIRAs for these. Maybe one for each line.
-David On Sep 6, 2012, at 12:39 AM, andygumbre...@apache.org wrote: > Author: andygumbrecht > Date: Thu Sep 6 07:39:07 2012 > New Revision: 1381492 > > URL: http://svn.apache.org/viewvc?rev=1381492&view=rev > Log: > Fix socket thrashing - ServerSocket timeout default should be 0 (wait > indefinitely for client) as 'close' will kill it. > Prevent 'Already bound' messages on quick restart with 'setReuseAddress'. > Allow socket linger on close. > > Modified: > > openejb/trunk/openejb/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java > > openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java > > 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=1381492&r1=1381491&r2=1381492&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 > Thu Sep 6 07:39:07 2012 > @@ -16,6 +16,12 @@ > */ > package org.apache.openejb.client; > > +import org.apache.openejb.client.event.ConnectionOpened; > +import org.apache.openejb.client.event.ConnectionPoolCreated; > +import org.apache.openejb.client.event.ConnectionPoolTimeout; > + > +import javax.net.ssl.SSLSocket; > +import javax.net.ssl.SSLSocketFactory; > import java.io.BufferedInputStream; > import java.io.BufferedOutputStream; > import java.io.IOException; > @@ -35,13 +41,6 @@ import java.util.concurrent.TimeUnit; > import java.util.concurrent.locks.Lock; > import java.util.concurrent.locks.ReentrantLock; > > -import javax.net.ssl.SSLSocket; > -import javax.net.ssl.SSLSocketFactory; > - > -import org.apache.openejb.client.event.ConnectionOpened; > -import org.apache.openejb.client.event.ConnectionPoolCreated; > -import org.apache.openejb.client.event.ConnectionPoolTimeout; > - > public class SocketConnectionFactory implements ConnectionFactory { > > private KeepAliveStyle keepAliveStyle = KeepAliveStyle.PING; > @@ -76,13 +75,13 @@ public class SocketConnectionFactory imp > //Ignore > } > } > - > - private String[] getEnabledCipherSuites(){ > + > + private String[] getEnabledCipherSuites() { > String property = System.getProperty(ENABLED_CIPHER_SUITES); > - if (property != null){ > + if (property != null) { > return property.split(","); > } else { > - return new String[]{ "SSL_DH_anon_WITH_RC4_128_MD5"}; > + return new String[]{"SSL_DH_anon_WITH_RC4_128_MD5"}; > } > } > > @@ -253,15 +252,18 @@ public class SocketConnectionFactory imp > > try { > if (uri.getScheme().equalsIgnoreCase("ejbds")) { > - final SSLSocket sslSocket = (SSLSocket) > SSLSocketFactory.getDefault().createSocket(address.getAddress(), > SocketConnectionFactory.this.timeoutSocket); > + final SSLSocket sslSocket = (SSLSocket) > SSLSocketFactory.getDefault().createSocket(); > sslSocket.setEnabledCipherSuites(enabledCipherSuites); > this.socket = sslSocket; > + > } else { > this.socket = new Socket(); > - this.socket.connect(address, > SocketConnectionFactory.this.timeoutSocket); > } > > this.socket.setTcpNoDelay(true); > + this.socket.setSoLinger(true, 10); > + this.socket.connect(address, > SocketConnectionFactory.this.timeoutSocket); > + > Client.fireEvent(new ConnectionOpened(uri)); > > } catch (ConnectException e) { > > Modified: > openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java > URL: > http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java?rev=1381492&r1=1381491&r2=1381492&view=diff > ============================================================================== > --- > openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java > (original) > +++ > openejb/trunk/openejb/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java > Thu Sep 6 07:39:07 2012 > @@ -30,6 +30,7 @@ import java.io.IOException; > import java.io.InputStream; > import java.io.OutputStream; > import java.net.InetAddress; > +import java.net.InetSocketAddress; > import java.net.ServerSocket; > import java.net.Socket; > import java.net.SocketException; > @@ -44,6 +45,7 @@ import java.util.concurrent.atomic.Atomi > import java.util.concurrent.locks.Lock; > import java.util.concurrent.locks.ReentrantLock; > > +@SuppressWarnings("UnusedDeclaration") > @Managed > public class ServiceDaemon implements ServerService { > > @@ -54,7 +56,7 @@ public class ServiceDaemon implements Se > > private SocketListener socketListener; > > - private int timeout = 1000; > + private int timeout = 0; > > private InetAddress inetAddress; > > @@ -68,7 +70,7 @@ public class ServiceDaemon implements Se > private StringTemplate discoveryUriFormat; > private URI serviceUri; > private Properties props; > - private String[] enabledCipherSuites; > + private String[] enabledCipherSuites; > > public ServiceDaemon(ServerService next) { > this.next = next; > @@ -122,7 +124,7 @@ public class ServiceDaemon implements Se > secure = options.get("secure", false); > > timeout = options.get("timeout", timeout); > - > + > enabledCipherSuites = options.get("enabledCipherSuites", > "SSL_DH_anon_WITH_RC4_128_MD5").split(","); > > next.init(props); > @@ -145,11 +147,14 @@ public class ServiceDaemon implements Se > serverSocket = factory.createServerSocket(port, backlog, > inetAddress); > ((SSLServerSocket) > serverSocket).setEnabledCipherSuites(enabledCipherSuites); > } else { > - serverSocket = new ServerSocket(port, backlog, > inetAddress); > + serverSocket = new ServerSocket(); > + serverSocket.setReuseAddress(true); > + serverSocket.bind(new InetSocketAddress(inetAddress, > port), backlog); > } > > - port = serverSocket.getLocalPort(); > serverSocket.setSoTimeout(timeout); > + port = serverSocket.getLocalPort(); > + > } catch (Exception e) { > throw new ServiceException("Service failed to open socket", > e); > } > @@ -288,6 +293,7 @@ public class ServiceDaemon implements Se > Socket socket = null; > try { > socket = serverSocket.accept(); > + socket.setSoLinger(true, 10); > socket.setTcpNoDelay(true); > > if (socket.isClosed()) { > @@ -310,8 +316,7 @@ public class ServiceDaemon implements Se > // It's up to the consumer of the socket > // to close it. > } catch (SocketTimeoutException e) { > - // we don't really care > - // log.debug("Socket timed-out",e); > + // Ignore - Should not get here on > serverSocket.setSoTimeout(0) > } catch (SocketException e) { > if (!stop.get()) { > log.debug("Socket error", e); > > >