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