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].