You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by go...@apache.org on 2018/03/30 18:13:18 UTC

[geode] branch develop updated: GEODE-3563: use a timeout for newly created sockets in TcpConduit.run() (#1671)

This is an automated email from the ASF dual-hosted git repository.

gosullivan pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new b55215d  GEODE-3563: use a timeout for newly created sockets in TcpConduit.run() (#1671)
b55215d is described below

commit b55215dcb64c86554d531b0b475e85f013e76fc6
Author: Galen O'Sullivan <go...@pivotal.io>
AuthorDate: Fri Mar 30 11:13:15 2018 -0700

    GEODE-3563: use a timeout for newly created sockets in TcpConduit.run() (#1671)
    
    * GEODE-3563: use a timeout in SocketCreator.ConfigureServerSSLSocket()
    
    Also close newly accepted sockets in TcpConduit.run() if SSL
    configuration fails (or any other IOException).
    
    * Add units.
    
    * Rename to startHandshakeIfSocketIsSSL for clarity.
---
 .../distributed/internal/tcpserver/TcpServer.java  |  5 +--
 .../internal/cache/tier/sockets/AcceptorImpl.java  |  3 +-
 .../apache/geode/internal/net/SocketCreator.java   |  7 +++-
 .../org/apache/geode/internal/tcp/TCPConduit.java  | 37 +++++++++++++---------
 .../geode/internal/net/DummySocketCreator.java     |  8 ++---
 .../internal/net/SSLSocketIntegrationTest.java     |  5 +--
 .../geode/internal/net/SocketCreatorJUnitTest.java | 17 ++++++++++
 7 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java
index 169b09d..778e3d9 100755
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/tcpserver/TcpServer.java
@@ -345,7 +345,6 @@ public class TcpServer {
       }
       handler.shutDown();
       synchronized (this) {
-        // this.shutDown = true;
         this.notifyAll();
       }
     }
@@ -360,9 +359,7 @@ public class TcpServer {
       long startTime = DistributionStats.getStatTime();
       DataInputStream input = null;
       try {
-
-        socket.setSoTimeout(READ_TIMEOUT);
-        getSocketCreator().configureServerSSLSocket(socket);
+        getSocketCreator().startHandshakeIfSocketIsSSL(socket, READ_TIMEOUT);
 
         try {
           input = new DataInputStream(socket.getInputStream());
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
index d060ed2..83d3156 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
@@ -1549,8 +1549,7 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
   }
 
   private CommunicationMode getCommunicationModeForNonSelector(Socket socket) throws IOException {
-    socket.setSoTimeout(this.acceptTimeout);
-    this.socketCreator.configureServerSSLSocket(socket);
+    this.socketCreator.startHandshakeIfSocketIsSSL(socket, this.acceptTimeout);
     byte communicationModeByte = (byte) socket.getInputStream().read();
     if (communicationModeByte == -1) {
       throw new EOFException();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java b/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java
index 9478953..31456c0 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/net/SocketCreator.java
@@ -968,8 +968,12 @@ public class SocketCreator {
 
   /**
    * Will be a server socket... this one simply registers the listeners.
+   *
+   * @param timeout the socket's timeout will be set to this (in milliseconds).
    */
-  public void configureServerSSLSocket(Socket socket) throws IOException {
+  public void startHandshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
+    socket.setSoTimeout(timeout);
+
     if (socket instanceof SSLSocket) {
       SSLSocket sslSocket = (SSLSocket) socket;
       try {
@@ -990,6 +994,7 @@ public class SocketCreator {
               ex);
           throw ex;
         }
+        // else ignore
       }
     }
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java b/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java
index 9483e08..5487039 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/tcp/TCPConduit.java
@@ -598,9 +598,8 @@ public class TCPConduit implements Runnable {
               LocalizedStrings.TCPConduit_UNABLE_TO_SHUT_DOWN_LISTENER_WITHIN_0_MS_UNABLE_TO_INTERRUPT_SOCKET_ACCEPT_DUE_TO_JDK_BUG_GIVING_UP,
               Integer.valueOf(LISTENER_CLOSE_TIMEOUT)));
         }
-      } catch (IOException e) {
-      } catch (InterruptedException e) {
-        // Ignore, we're trying to stop already.
+      } catch (IOException | InterruptedException e) {
+        // we're already trying to shutdown, ignore
       } finally {
         this.hsPool.shutdownNow();
       }
@@ -689,7 +688,7 @@ public class TCPConduit implements Runnable {
                 ex);
             break;
           }
-          socketCreator.configureServerSSLSocket(othersock);
+          socketCreator.startHandshakeIfSocketIsSSL(othersock, idleConnectionTimeout);
         }
         if (stopped) {
           try {
@@ -705,11 +704,19 @@ public class TCPConduit implements Runnable {
 
       } catch (ClosedByInterruptException cbie) {
         // safe to ignore
-      } catch (ClosedChannelException e) {
-        break; // we're dead
-      } catch (CancelException e) {
+      } catch (ClosedChannelException | CancelException e) {
         break;
-      } catch (Exception e) {
+      } catch (IOException e) {
+        this.getStats().incFailedAccept();
+
+        try {
+          if (othersock != null) {
+            othersock.close();
+          }
+        } catch (IOException ignore) {
+
+        }
+
         if (!stopped) {
           if (e instanceof SocketException && "Socket closed".equalsIgnoreCase(e.getMessage())) {
             // safe to ignore; see bug 31156
@@ -737,17 +744,17 @@ public class TCPConduit implements Runnable {
                 }
               }
             }
+          } else if ("Too many open files".equals(e.getMessage())) {
+            getConTable().fileDescriptorsExhausted();
           } else {
-            this.getStats().incFailedAccept();
-            if (e instanceof IOException && "Too many open files".equals(e.getMessage())) {
-              getConTable().fileDescriptorsExhausted();
-            } else {
-              logger.warn(e.getMessage(), e);
-            }
+            logger.warn(e.getMessage(), e);
           }
+
         }
-        // connections.cleanupLowWater();
+      } catch (Exception e) {
+        logger.warn(e.getMessage(), e);
       }
+
       if (!stopped && socket.isClosed()) {
         // NOTE: do not check for distributed system closing here. Messaging
         // may need to occur during the closing of the DS or cache
diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/DummySocketCreator.java b/geode-core/src/test/java/org/apache/geode/internal/net/DummySocketCreator.java
index 6928b6f..e061f14 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/net/DummySocketCreator.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/net/DummySocketCreator.java
@@ -35,12 +35,8 @@ public class DummySocketCreator extends SocketCreator {
   }
 
   @Override
-  public void configureServerSSLSocket(Socket socket) throws IOException {
-    this.socketSoTimeouts.add(socket.getSoTimeout());
+  public void startHandshakeIfSocketIsSSL(Socket socket, int timeout) throws IOException {
+    this.socketSoTimeouts.add(timeout);
     throw new SSLException("This is a test SSLException");
   }
-
-  public List<Integer> getSocketSoTimeouts() {
-    return socketSoTimeouts;
-  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java
index 704beb6..af06241 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/net/SSLSocketIntegrationTest.java
@@ -209,7 +209,7 @@ public class SSLSocketIntegrationTest {
       Awaitility.await("connect to server socket").atMost(30, TimeUnit.SECONDS).until(() -> {
         try {
           Socket clientSocket = socketCreator.connectForClient(
-              SocketCreator.getLocalHost().getHostAddress(), serverSocketPort, 2000);
+              SocketCreator.getLocalHost().getHostAddress(), serverSocketPort, 500);
           clientSocket.close();
           System.err.println(
               "client successfully connected to server but should not have been able to do so");
@@ -254,7 +254,8 @@ public class SSLSocketIntegrationTest {
     Thread serverThread = new Thread(new MyThreadGroup(this.testName.getMethodName()), () -> {
       try {
         Socket socket = serverSocket.accept();
-        SocketCreatorFactory.getSocketCreatorForComponent(CLUSTER).configureServerSSLSocket(socket);
+        SocketCreatorFactory.getSocketCreatorForComponent(CLUSTER)
+            .startHandshakeIfSocketIsSSL(socket, 15000);
         ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
         messageFromClient.set((String) ois.readObject());
       } catch (IOException | ClassNotFoundException e) {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java
index 2fcd7f6..33d34bb 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/net/SocketCreatorJUnitTest.java
@@ -14,6 +14,12 @@
  */
 package org.apache.geode.internal.net;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.net.Socket;
+
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
@@ -37,6 +43,17 @@ public class SocketCreatorJUnitTest {
 
   }
 
+  @Test
+  public void testConfigureServerSSLSocketSetsSoTimeout() throws Exception {
+    final SocketCreator socketCreator = new SocketCreator(mock(SSLConfig.class));
+    final Socket socket = mock(Socket.class);
+
+    final int timeout = 1938236;
+    socketCreator.startHandshakeIfSocketIsSSL(socket, timeout);
+
+    verify(socket).setSoTimeout(timeout);
+  }
+
   private String getSingleKeyKeystore() {
     return TestUtil.getResourcePath(getClass(), "/ssl/trusted.keystore");
   }

-- 
To stop receiving notification emails like this one, please contact
gosullivan@apache.org.