From commits-return-28245-archive-asf-public=cust-asf.ponee.io@geode.apache.org Fri Sep 7 17:59:48 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id F1A0318078F for ; Fri, 7 Sep 2018 17:59:47 +0200 (CEST) Received: (qmail 99523 invoked by uid 500); 7 Sep 2018 15:59:47 -0000 Mailing-List: contact commits-help@geode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.apache.org Delivered-To: mailing list commits@geode.apache.org Received: (qmail 99506 invoked by uid 99); 7 Sep 2018 15:59:47 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 07 Sep 2018 15:59:47 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id 6B15685225; Fri, 7 Sep 2018 15:59:46 +0000 (UTC) Date: Fri, 07 Sep 2018 15:59:48 +0000 To: "commits@geode.apache.org" Subject: [geode] 05/07: Revert "[GEODE-5591] If there is a BindException we should always throw. (#2351)" MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit From: nnag@apache.org In-Reply-To: <153633598320.28903.4855087148992919025@gitbox.apache.org> References: <153633598320.28903.4855087148992919025@gitbox.apache.org> X-Git-Host: gitbox.apache.org X-Git-Repo: geode X-Git-Refname: refs/heads/release/1.7.0 X-Git-Reftype: branch X-Git-Rev: fb0ee0970dead958c8e7531451dd3e46e17af004 X-Git-NotificationType: diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated Message-Id: <20180907155946.6B15685225@gitbox.apache.org> This is an automated email from the ASF dual-hosted git repository. nnag pushed a commit to branch release/1.7.0 in repository https://gitbox.apache.org/repos/asf/geode.git commit fb0ee0970dead958c8e7531451dd3e46e17af004 Author: nabarun AuthorDate: Wed Sep 5 09:59:02 2018 -0700 Revert "[GEODE-5591] If there is a BindException we should always throw. (#2351)" This reverts commit b6eb8fa --- .../geode/internal/cache/wan/WANTestBase.java | 14 ++++-- .../cache/wan/misc/WANConfigurationJUnitTest.java | 15 ++++-- .../internal/cache/wan/GatewayReceiverImpl.java | 54 +++++++++++++++++----- 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/WANTestBase.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/WANTestBase.java index a091942..0b1af66 100644 --- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/WANTestBase.java +++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/WANTestBase.java @@ -37,7 +37,6 @@ import static org.apache.geode.distributed.ConfigurationProperties.REMOTE_LOCATO import static org.apache.geode.distributed.ConfigurationProperties.START_LOCATOR; import static org.apache.geode.test.dunit.Host.getHost; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -2018,9 +2017,16 @@ public class WANTestBase extends DistributedTestCase { fact.setManualStart(true); fact.setBindAddress("200.112.204.10"); GatewayReceiver receiver = fact.create(); - assertThatThrownBy(receiver::start) - .isInstanceOf(GatewayReceiverException.class) - .hasMessageContaining("No available free port found in the given range"); + try { + receiver.start(); + fail("Expected GatewayReceiver Exception"); + } catch (GatewayReceiverException gRE) { + logger.debug("Got the GatewayReceiverException", gRE); + assertTrue(gRE.getMessage().contains("Failed to create server socket on")); + } catch (IOException e) { + e.printStackTrace(); + fail("Test " + test.getName() + " failed to start GatewayReceiver on port " + port); + } } public static int createReceiverWithSSL(int locPort) { diff --git a/geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java b/geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java index 038b759..edcd55f 100644 --- a/geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java +++ b/geode-wan/src/integrationTest/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java @@ -437,18 +437,25 @@ public class WANConfigurationJUnitTest { public void test_ValidateGatewayReceiverAttributes_WrongBindAddress() { cache = new CacheFactory().set(MCAST_PORT, "0").create(); GatewayReceiverFactory fact = cache.createGatewayReceiverFactory(); - fact.setStartPort(50505); + fact.setStartPort(50504); fact.setMaximumTimeBetweenPings(1000); fact.setSocketBufferSize(4000); - fact.setEndPort(50505); + fact.setEndPort(70707); fact.setManualStart(true); fact.setBindAddress("200.112.204.10"); GatewayTransportFilter myStreamFilter1 = new MyGatewayTransportFilter1(); fact.addGatewayTransportFilter(myStreamFilter1); - GatewayReceiver receiver = fact.create(); - assertThatThrownBy(() -> receiver.start()).isInstanceOf(GatewayReceiverException.class); + try { + receiver.start(); + fail("Expected GatewayReceiverException"); + } catch (GatewayReceiverException gRE) { + assertTrue(gRE.getMessage().contains("Failed to create server socket on")); + } catch (IOException e) { + e.printStackTrace(); + fail("The test failed with IOException"); + } } @Test diff --git a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java index cd27029..0f0fc63 100644 --- a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java +++ b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java @@ -15,6 +15,8 @@ package org.apache.geode.internal.cache.wan; import java.io.IOException; +import java.net.BindException; +import java.net.SocketException; import java.net.UnknownHostException; import java.util.Arrays; import java.util.List; @@ -26,6 +28,7 @@ import org.apache.geode.cache.wan.GatewayReceiver; import org.apache.geode.cache.wan.GatewayTransportFilter; import org.apache.geode.distributed.internal.InternalDistributedSystem; import org.apache.geode.distributed.internal.ResourceEvent; +import org.apache.geode.internal.AvailablePort; import org.apache.geode.internal.cache.CacheServerImpl; import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.i18n.LocalizedStrings; @@ -143,9 +146,10 @@ public class GatewayReceiverImpl implements GatewayReceiver { logger.warn(LocalizedMessage.create(LocalizedStrings.GatewayReceiver_IS_ALREADY_RUNNING)); return; } - - for (int port = this.startPort; port <= this.endPort; port++) { - receiver.setPort(port); + boolean started = false; + this.port = getPortToStart(); + while (!started && this.port != -1) { + receiver.setPort(this.port); receiver.setSocketBufferSize(socketBufferSize); receiver.setMaximumTimeBetweenPings(timeBetPings); if (hostnameForSenders != null && !hostnameForSenders.isEmpty()) { @@ -156,19 +160,33 @@ public class GatewayReceiverImpl implements GatewayReceiver { ((CacheServerImpl) receiver).setGatewayTransportFilter(this.filters); try { receiver.start(); - this.port = port; - break; - } catch (IOException e) { - if (port == this.endPort) { - throw new GatewayReceiverException("No available free port found in the given range (" + - this.startPort + - "-" + - this.endPort + - ")", e); + started = true; + } catch (BindException be) { + if (be.getCause() != null + && be.getCause().getMessage().contains("assign requested address")) { + throw new GatewayReceiverException( + LocalizedStrings.SocketCreator_FAILED_TO_CREATE_SERVER_SOCKET_ON_0_1 + .toLocalizedString(new Object[] {bindAdd, this.port})); + } + // ignore as this port might have been used by other threads. + logger.warn(LocalizedMessage.create(LocalizedStrings.GatewayReceiver_Address_Already_In_Use, + this.port)); + this.port = getPortToStart(); + } catch (SocketException se) { + if (se.getMessage().contains("Address already in use")) { + logger.warn(LocalizedMessage + .create(LocalizedStrings.GatewayReceiver_Address_Already_In_Use, this.port)); + this.port = getPortToStart(); + + } else { + throw se; } } } + if (!started) { + throw new IllegalStateException("No available free port found in the given range."); + } logger .info(LocalizedMessage.create(LocalizedStrings.GatewayReceiver_STARTED_ON_PORT, this.port)); @@ -177,6 +195,18 @@ public class GatewayReceiverImpl implements GatewayReceiver { } + private int getPortToStart() { + // choose a random port from the given port range + int rPort; + if (this.startPort == this.endPort) { + rPort = this.startPort; + } else { + rPort = AvailablePort.getRandomAvailablePortInRange(this.startPort, this.endPort, + AvailablePort.SOCKET); + } + return rPort; + } + public void stop() { if (!isRunning()) { throw new GatewayReceiverException(