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.