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);

Reply via email to