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

Reply via email to