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 3651a9a GEODE-5646 Client throws ToDataException when locator is shutting down 3651a9a is described below commit 3651a9a9b3819948da18e02b7fc64c3493f6d886 Author: Bruce Schuchardt <bschucha...@pivotal.io> AuthorDate: Mon Aug 27 15:22:47 2018 -0700 GEODE-5646 Client throws ToDataException when locator is shutting down Catch and handle ToDataException. Reviewed by mhanson --- .../AutoConnectionSourceImplJUnitTest.java | 24 ++++++++++++++++++++++ .../client/internal/AutoConnectionSourceImpl.java | 16 +++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java index 6176e13..3758049 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java @@ -19,6 +19,11 @@ import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.powermock.api.mockito.PowerMockito.when; import java.io.IOException; import java.net.ConnectException; @@ -47,6 +52,7 @@ import org.junit.contrib.java.lang.system.RestoreSystemProperties; import org.junit.experimental.categories.Category; import org.apache.geode.CancelCriterion; +import org.apache.geode.ToDataException; import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.GemFireCache; @@ -57,6 +63,7 @@ import org.apache.geode.cache.client.SubscriptionNotEnabledException; import org.apache.geode.cache.client.internal.locator.ClientConnectionRequest; import org.apache.geode.cache.client.internal.locator.ClientConnectionResponse; import org.apache.geode.cache.client.internal.locator.LocatorListResponse; +import org.apache.geode.cache.client.internal.locator.ServerLocationRequest; import org.apache.geode.cache.query.QueryService; import org.apache.geode.distributed.DistributedSystem; import org.apache.geode.distributed.internal.DistributionConfig; @@ -74,6 +81,7 @@ import org.apache.geode.internal.cache.tier.InternalClientMembership; import org.apache.geode.internal.cache.tier.sockets.TcpServerFactory; import org.apache.geode.management.membership.ClientMembershipEvent; import org.apache.geode.management.membership.ClientMembershipListener; +import org.apache.geode.test.dunit.NetworkUtils; import org.apache.geode.test.junit.categories.ClientServerTest; @SuppressWarnings("deprecation") @@ -234,6 +242,22 @@ public class AutoConnectionSourceImplJUnitTest { } @Test + public void testSourceHandlesToDataException() throws IOException, ClassNotFoundException { + TcpClient mockConnection = mock(TcpClient.class); + when(mockConnection.requestToServer(isA(InetSocketAddress.class), any(Object.class), + isA(Integer.class), isA(Boolean.class))).thenThrow(new ToDataException("testing")); + try { + InetSocketAddress address = new InetSocketAddress(NetworkUtils.getServerHostName(), 1234); + source.queryOneLocatorUsingConnection(new HostAddress(address, "locator[1234]"), mock( + ServerLocationRequest.class), mockConnection); + verify(mockConnection).requestToServer(isA(InetSocketAddress.class), + isA(ServerLocationRequest.class), isA(Integer.class), isA(Boolean.class)); + } catch (NoAvailableLocatorsException expected) { + // do nothing + } + } + + @Test public void testServerLocationUsedInListenerNotification() throws Exception { final ClientMembershipEvent[] listenerEvents = new ClientMembershipEvent[1]; diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java index efb39d6..a1c87a4 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java +++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImpl.java @@ -32,6 +32,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.logging.log4j.Logger; +import org.apache.geode.ToDataException; import org.apache.geode.cache.client.NoAvailableLocatorsException; import org.apache.geode.cache.client.internal.PoolImpl.PoolTask; import org.apache.geode.cache.client.internal.locator.ClientConnectionRequest; @@ -188,10 +189,17 @@ public class AutoConnectionSourceImpl implements ConnectionSource { private ServerLocationResponse queryOneLocator(HostAddress locator, ServerLocationRequest request) { + return queryOneLocatorUsingConnection(locator, request, tcpClient); + } + + + ServerLocationResponse queryOneLocatorUsingConnection(HostAddress locator, + ServerLocationRequest request, + TcpClient locatorConnection) { Object returnObj = null; try { pool.getStats().incLocatorRequests(); - returnObj = tcpClient.requestToServer(locator.getSocketInetAddressNoLookup(), request, + returnObj = locatorConnection.requestToServer(locator.getSocketInetAddressNoLookup(), request, connectionTimeout, true); ServerLocationResponse response = (ServerLocationResponse) returnObj; pool.getStats().incLocatorResponses(); @@ -199,7 +207,11 @@ public class AutoConnectionSourceImpl implements ConnectionSource { reportLiveLocator(locator.getSocketInetAddressNoLookup()); } return response; - } catch (IOException ioe) { + } catch (IOException | ToDataException ioe) { + if (ioe instanceof ToDataException) { + logger.warn("Encountered ToDataException when communicating with a locator. " + + "This is expected if the locator is shutting down.", ioe); + } reportDeadLocator(locator.getSocketInetAddressNoLookup(), ioe); updateLocatorInLocatorList(locator); return null;