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

bschuchardt 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 d707e2c  GEODE-4300 Server logs warning message when protobuf client 
closes socket
d707e2c is described below

commit d707e2cb1ef35b67f4caad78e968b2107bf17006
Author: Bruce Schuchardt <[email protected]>
AuthorDate: Wed Jan 24 11:51:03 2018 -0800

    GEODE-4300 Server logs warning message when protobuf client closes socket
    
    Inhibit logging of a warning message on IOExceptions if the socket is
    closed.
    
    This closes #1335
---
 .../sockets/GenericProtocolServerConnection.java   |  6 +-
 .../cache/tier/sockets/ServerConnection.java       |  4 -
 .../OutputCapturingServerConnectionTest.java       | 94 ++++++++++++++++++++++
 3 files changed, 98 insertions(+), 6 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/GenericProtocolServerConnection.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/GenericProtocolServerConnection.java
index 374d54b..f08ac83 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/GenericProtocolServerConnection.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/GenericProtocolServerConnection.java
@@ -62,8 +62,8 @@ public class GenericProtocolServerConnection extends 
ServerConnection {
 
   @Override
   protected void doOneMessage() {
+    Socket socket = this.getSocket();
     try {
-      Socket socket = this.getSocket();
       InputStream inputStream = socket.getInputStream();
       OutputStream outputStream = socket.getOutputStream();
 
@@ -77,7 +77,9 @@ public class GenericProtocolServerConnection extends 
ServerConnection {
       setClientDisconnectedException(e);
       logger.debug("Encountered EOF while processing message: {}", e);
     } catch (IOException | IncompatibleVersionException e) {
-      logger.warn(e);
+      if (!socket.isClosed()) { // GEODE-4300, IOException may be thrown 
thrown on EOF
+        logger.warn(e);
+      }
       this.setFlagProcessMessagesAsFalse();
       setClientDisconnectedException(e);
     } finally {
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java
index d4e5969..99919fa 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ServerConnection.java
@@ -1707,10 +1707,6 @@ public abstract class ServerConnection implements 
Runnable {
     this.processMessages = false;
   }
 
-  boolean getFlagProcessMessages() {
-    return this.processMessages;
-  }
-
   public InternalLogWriter getLogWriter() {
     return this.logWriter; // TODO:LOG:CONVERT: remove getLogWriter after 
callers are converted
   }
diff --git 
a/geode-protobuf/src/test/java/org/apache/geode/internal/cache/tier/sockets/OutputCapturingServerConnectionTest.java
 
b/geode-protobuf/src/test/java/org/apache/geode/internal/cache/tier/sockets/OutputCapturingServerConnectionTest.java
new file mode 100644
index 0000000..929b725
--- /dev/null
+++ 
b/geode-protobuf/src/test/java/org/apache/geode/internal/cache/tier/sockets/OutputCapturingServerConnectionTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+package org.apache.geode.internal.cache.tier.sockets;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.SystemOutRule;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.cache.IncompatibleVersionException;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.client.protocol.ClientProtocolProcessor;
+import org.apache.geode.internal.cache.tier.CachedRegionHelper;
+import org.apache.geode.internal.cache.tier.CommunicationMode;
+import org.apache.geode.internal.security.SecurityService;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+
+@Category(UnitTest.class)
+public class OutputCapturingServerConnectionTest {
+
+  @Rule
+  public SystemOutRule systemOutRule = new SystemOutRule().enableLog();
+
+  @Test
+  public void testEOFDoesNotCauseWarningMessage() throws IOException, 
IncompatibleVersionException {
+    Socket socketMock = mock(Socket.class);
+    
when(socketMock.getInetAddress()).thenReturn(InetAddress.getByName("localhost"));
+    when(socketMock.isClosed()).thenReturn(true);
+
+    AcceptorImpl acceptorStub = mock(AcceptorImpl.class);
+    ClientProtocolProcessor clientProtocolProcessor = 
mock(ClientProtocolProcessor.class);
+    doThrow(new 
IOException()).when(clientProtocolProcessor).processMessage(any(), any());
+
+    ServerConnection serverConnection =
+        getServerConnection(socketMock, clientProtocolProcessor, acceptorStub);
+
+    String expectedMessage = "invoking doOneMessage";
+    String unexpectedMessage = "IOException";
+
+    // Create some stdout content so we can tell that the capture worked.
+    System.out.println(expectedMessage);
+
+    serverConnection.doOneMessage();
+
+    // verify that an IOException wasn't logged
+    String stdoutCapture = systemOutRule.getLog();
+    assertTrue(stdoutCapture.contains(expectedMessage));
+    assertFalse(stdoutCapture.contains(unexpectedMessage));
+  }
+
+  private GenericProtocolServerConnection getServerConnection(Socket 
socketMock,
+      ClientProtocolProcessor clientProtocolProcessorMock, AcceptorImpl 
acceptorStub)
+      throws UnknownHostException {
+    ClientHealthMonitor clientHealthMonitorMock = 
mock(ClientHealthMonitor.class);
+    
when(acceptorStub.getClientHealthMonitor()).thenReturn(clientHealthMonitorMock);
+    InetSocketAddress inetSocketAddressStub = 
InetSocketAddress.createUnresolved("localhost", 9071);
+    InetAddress inetAddressStub = mock(InetAddress.class);
+    
when(socketMock.getInetAddress()).thenReturn(InetAddress.getByName("localhost"));
+    
when(socketMock.getRemoteSocketAddress()).thenReturn(inetSocketAddressStub);
+    when(socketMock.getInetAddress()).thenReturn(inetAddressStub);
+
+    return new GenericProtocolServerConnection(socketMock, 
mock(InternalCache.class),
+        mock(CachedRegionHelper.class), mock(CacheServerStats.class), 0, 0, "",
+        CommunicationMode.ProtobufClientServerProtocol.getModeNumber(), 
acceptorStub,
+        clientProtocolProcessorMock, mock(SecurityService.class));
+  }
+
+}

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to