minor, check random port availability before using it
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/d738544e Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/d738544e Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/d738544e Branch: refs/heads/KYLIN-2624 Commit: d738544eeb03235ed2cf9e2f4509c1d09d98db8a Parents: 7df407d Author: Yang Li <liy...@apache.org> Authored: Sun May 7 09:33:45 2017 +0800 Committer: Yang Li <liy...@apache.org> Committed: Sun May 7 14:52:14 2017 +0800 ---------------------------------------------------------------------- .../org/apache/kylin/common/util/CheckUtil.java | 50 +++++++++++++++++++- .../kylin/rest/service/CacheServiceTest.java | 5 +- 2 files changed, 51 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/d738544e/core-common/src/main/java/org/apache/kylin/common/util/CheckUtil.java ---------------------------------------------------------------------- diff --git a/core-common/src/main/java/org/apache/kylin/common/util/CheckUtil.java b/core-common/src/main/java/org/apache/kylin/common/util/CheckUtil.java index ae189f7..0f75ff2 100644 --- a/core-common/src/main/java/org/apache/kylin/common/util/CheckUtil.java +++ b/core-common/src/main/java/org/apache/kylin/common/util/CheckUtil.java @@ -17,10 +17,16 @@ */ package org.apache.kylin.common.util; +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.ServerSocket; +import java.util.Random; + +import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CheckUtil { - public static final org.slf4j.Logger logger = LoggerFactory.getLogger(CheckUtil.class); + public static final Logger logger = LoggerFactory.getLogger(CheckUtil.class); public static boolean checkCondition(boolean condition, String message, Object... args) { if (condition) { @@ -30,4 +36,46 @@ public class CheckUtil { return false; } } + + public static int randomAvailablePort(int minPort, int maxPort) { + Random rand = new Random(); + for (int i = 0; i < 100; i++) { + int p = minPort + rand.nextInt(maxPort - minPort); + if (checkPortAvailable(p)) + return p; + } + throw new RuntimeException("Failed to get random available port between [" + minPort + "," + maxPort + ")"); + } + + /** + * Checks to see if a specific port is available. + * + * @param port the port to check for availability + */ + public static boolean checkPortAvailable(int port) { + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException e) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } } http://git-wip-us.apache.org/repos/asf/kylin/blob/d738544e/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java index 3601ec1..6410aaa 100644 --- a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java +++ b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java @@ -24,12 +24,12 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Arrays; -import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; import org.apache.kylin.common.KylinConfig; +import org.apache.kylin.common.util.CheckUtil; import org.apache.kylin.common.util.LocalFileMetadataTestCase; import org.apache.kylin.cube.CubeDescManager; import org.apache.kylin.cube.CubeInstance; @@ -74,8 +74,7 @@ public class CacheServiceTest extends LocalFileMetadataTestCase { public static void beforeClass() throws Exception { staticCreateTestMetadata(); - Random random = new Random(); - int port = random.nextInt(10000) + 40000; + int port = CheckUtil.randomAvailablePort(40000, 50000); logger.info("Chosen port for CacheServiceTest is " + port); configA = KylinConfig.getInstanceFromEnv(); configA.setProperty("kylin.server.cluster-servers", "localhost:" + port);