diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/SparkSQLEngine.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/SparkSQLEngine.scala
index 2d7367fe5..a78b13c1b 100644
--- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/SparkSQLEngine.scala
+++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/SparkSQLEngine.scala
@@ -45,7 +45,7 @@ import org.apache.kyuubi.ha.HighAvailabilityConf._
import org.apache.kyuubi.ha.client.RetryPolicies
import org.apache.kyuubi.service.Serverable
import org.apache.kyuubi.session.SessionHandle
-import org.apache.kyuubi.util.{SignalRegister, ThreadUtils}
+import org.apache.kyuubi.util.{JavaUtils, SignalRegister, ThreadUtils}
import org.apache.kyuubi.util.ThreadUtils.scheduleTolerableRunnableWithFixedDelay
case class SparkSQLEngine(spark: SparkSession) extends Serverable("SparkSQLEngine") {
@@ -296,7 +296,7 @@ object SparkSQLEngine extends Logging {
if (!isOnK8sClusterMode) {
// set driver host to ip instead of kyuubi pod name
- _sparkConf.setIfMissing("spark.driver.host", Utils.findLocalInetAddress.getHostAddress)
+ _sparkConf.setIfMissing("spark.driver.host", JavaUtils.findLocalInetAddress.getHostAddress)
}
}
diff --git a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/deployment/KyuubiOnKubernetesTestsSuite.scala b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/deployment/KyuubiOnKubernetesTestsSuite.scala
index 6ffd157d6..319b1bfe5 100644
--- a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/deployment/KyuubiOnKubernetesTestsSuite.scala
+++ b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/deployment/KyuubiOnKubernetesTestsSuite.scala
@@ -22,10 +22,11 @@ import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.fs.permission.{FsAction, FsPermission}
import org.apache.hadoop.net.NetUtils
-import org.apache.kyuubi.{Utils, WithSimpleDFSService}
+import org.apache.kyuubi.WithSimpleDFSService
import org.apache.kyuubi.config.KyuubiConf.FRONTEND_THRIFT_BINARY_BIND_HOST
import org.apache.kyuubi.kubernetes.test.WithKyuubiServerOnKubernetes
import org.apache.kyuubi.operation.SparkQueryTests
+import org.apache.kyuubi.util.JavaUtils
import org.apache.kyuubi.zookeeper.ZookeeperConf.ZK_CLIENT_PORT_ADDRESS
/**
@@ -109,7 +110,7 @@ class KyuubiOnKubernetesWithClientSparkTestsSuite
*/
class KyuubiOnKubernetesWithClusterSparkTestsSuite
extends KyuubiOnKubernetesWithSparkTestsBase with WithSimpleDFSService with SparkQueryTests {
- private val localhostAddress = Utils.findLocalInetAddress.getHostAddress
+ private val localhostAddress = JavaUtils.findLocalInetAddress.getHostAddress
private val driverTemplate =
Thread.currentThread().getContextClassLoader.getResource("driver.yml")
diff --git a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/spark/SparkOnKubernetesTestsSuite.scala b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/spark/SparkOnKubernetesTestsSuite.scala
index be07dd557..4692581cc 100644
--- a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/spark/SparkOnKubernetesTestsSuite.scala
+++ b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/spark/SparkOnKubernetesTestsSuite.scala
@@ -34,6 +34,7 @@ import org.apache.kyuubi.engine.spark.SparkProcessBuilder
import org.apache.kyuubi.kubernetes.test.MiniKube
import org.apache.kyuubi.operation.SparkQueryTests
import org.apache.kyuubi.session.KyuubiSessionManager
+import org.apache.kyuubi.util.JavaUtils
import org.apache.kyuubi.util.Validator.KUBERNETES_EXECUTOR_POD_NAME_PREFIX
import org.apache.kyuubi.zookeeper.ZookeeperConf.ZK_CLIENT_PORT_ADDRESS
@@ -96,7 +97,7 @@ class SparkClientModeOnKubernetesSuite extends SparkClientModeOnKubernetesSuiteB
*/
class SparkClusterModeOnKubernetesSuiteBase
extends SparkOnKubernetesSuiteBase with WithSimpleDFSService {
- private val localhostAddress = Utils.findLocalInetAddress.getHostAddress
+ private val localhostAddress = JavaUtils.findLocalInetAddress.getHostAddress
private val driverTemplate =
Thread.currentThread().getContextClassLoader.getResource("driver.yml")
diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala
index f0b0fea91..5944e9f97 100644
--- a/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala
+++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/Utils.scala
@@ -18,7 +18,6 @@
package org.apache.kyuubi
import java.io._
-import java.net.{Inet4Address, InetAddress, NetworkInterface}
import java.nio.charset.StandardCharsets
import java.nio.file.{Files, Path, Paths, StandardCopyOption}
import java.security.PrivilegedAction
@@ -33,7 +32,6 @@ import scala.sys.process._
import scala.util.control.NonFatal
import scala.util.matching.Regex
-import org.apache.commons.lang3.SystemUtils
import org.apache.commons.lang3.time.DateFormatUtils
import org.apache.hadoop.security.UserGroupInformation
import org.apache.hadoop.util.ShutdownHookManager
@@ -224,31 +222,6 @@ object Utils extends Logging {
})
}
- private val shortVersionRegex = """^(\d+\.\d+\.\d+)(.*)?$""".r
-
- /**
- * Given a Kyuubi/Spark/Hive version string, return the short version string.
- * E.g., for 3.0.0-SNAPSHOT, return '3.0.0'.
- */
- def shortVersion(version: String): String = {
- shortVersionRegex.findFirstMatchIn(version) match {
- case Some(m) => m.group(1)
- case None =>
- throw new IllegalArgumentException(s"Tried to parse '$version' as a project" +
- s" version string, but it could not find the major/minor/maintenance version numbers.")
- }
- }
-
- /**
- * Whether the underlying operating system is Windows.
- */
- val isWindows: Boolean = SystemUtils.IS_OS_WINDOWS
-
- /**
- * Whether the underlying operating system is MacOS.
- */
- val isMac: Boolean = SystemUtils.IS_OS_MAC
-
/**
* Indicates whether Kyuubi is currently running unit tests.
*/
@@ -274,34 +247,6 @@ object Utils extends Logging {
ShutdownHookManager.get().addShutdownHook(hook, priority)
}
- /**
- * This block of code is based on Spark's Utils.findLocalInetAddress()
- */
- def findLocalInetAddress: InetAddress = {
- val address = InetAddress.getLocalHost
- if (address.isLoopbackAddress) {
- val activeNetworkIFs = NetworkInterface.getNetworkInterfaces.asScala.toSeq
- val reOrderedNetworkIFs = if (isWindows) activeNetworkIFs else activeNetworkIFs.reverse
-
- for (ni <- reOrderedNetworkIFs) {
- val addresses = ni.getInetAddresses.asScala
- .filterNot(addr => addr.isLinkLocalAddress || addr.isLoopbackAddress).toSeq
- if (addresses.nonEmpty) {
- val addr = addresses.find(_.isInstanceOf[Inet4Address]).getOrElse(addresses.head)
- // because of Inet6Address.toHostName may add interface at the end if it knows about it
- val strippedAddress = InetAddress.getByAddress(addr.getAddress)
- // We've found an address that looks reasonable!
- warn(s"${address.getHostName} was resolved to a loopback address: " +
- s"${address.getHostAddress}, using ${strippedAddress.getHostAddress}")
- return strippedAddress
- }
- }
- warn(s"${address.getHostName} was resolved to a loopback address: ${address.getHostAddress}" +
- " but we couldn't find any external IP address!")
- }
- address
- }
-
/**
* return date of format yyyyMMdd
*/
diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala
index 40e44ac40..801236f66 100644
--- a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala
+++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala
@@ -25,7 +25,7 @@ import scala.language.implicitConversions
import org.apache.hadoop.conf.Configuration
-import org.apache.kyuubi.{KyuubiSQLException, Logging, Utils}
+import org.apache.kyuubi.{KyuubiSQLException, Logging}
import org.apache.kyuubi.Utils.stringifyException
import org.apache.kyuubi.config.KyuubiConf.{FRONTEND_ADVERTISED_HOST, FRONTEND_CONNECTION_URL_USE_HOSTNAME, PROXY_USER, SESSION_CLOSE_ON_DISCONNECT}
import org.apache.kyuubi.config.KyuubiReservedKeys._
@@ -36,7 +36,7 @@ import org.apache.kyuubi.shaded.hive.service.rpc.thrift._
import org.apache.kyuubi.shaded.thrift.protocol.TProtocol
import org.apache.kyuubi.shaded.thrift.server.{ServerContext, TServerEventHandler}
import org.apache.kyuubi.shaded.thrift.transport.TTransport
-import org.apache.kyuubi.util.{KyuubiHadoopUtils, NamedThreadFactory}
+import org.apache.kyuubi.util.{JavaUtils, KyuubiHadoopUtils, NamedThreadFactory}
/**
* Apache Thrift based hive-service-rpc base class
@@ -53,7 +53,7 @@ abstract class TFrontendService(name: String)
protected def serverHost: Option[String]
protected def portNum: Int
protected lazy val serverAddr: InetAddress =
- serverHost.map(InetAddress.getByName).getOrElse(Utils.findLocalInetAddress)
+ serverHost.map(InetAddress.getByName).getOrElse(JavaUtils.findLocalInetAddress)
protected lazy val serverSocket = new ServerSocket(portNum, -1, serverAddr)
protected lazy val actualPort: Int = serverSocket.getLocalPort
protected lazy val authFactory: KyuubiAuthenticationFactory =
diff --git a/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala b/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala
index 60bdd3d22..15776f8ac 100644
--- a/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala
+++ b/kyuubi-common/src/test/scala/org/apache/kyuubi/UtilsSuite.scala
@@ -18,7 +18,6 @@
package org.apache.kyuubi
import java.io.{File, IOException}
-import java.net.InetAddress
import java.nio.file.{Files, Paths}
import java.security.PrivilegedExceptionAction
import java.util.Properties
@@ -118,15 +117,6 @@ class UtilsSuite extends KyuubiFunSuite {
})
}
- test("findLocalInetAddress") {
- val address = InetAddress.getLocalHost
- if (!address.isLoopbackAddress) {
- assert(Utils.findLocalInetAddress === InetAddress.getLocalHost)
- } else {
- assert(Utils.findLocalInetAddress !== InetAddress.getLocalHost)
- }
- }
-
test("getAbsolutePathFromWork") {
val workDir = System.getenv("KYUUBI_WORK_DIR_ROOT")
val path1 = "path1"
diff --git a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/hs2connection/UserHS2ConnectionFileParser.java b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/hs2connection/UserHS2ConnectionFileParser.java
index de5e27a7a..596f52cba 100644
--- a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/hs2connection/UserHS2ConnectionFileParser.java
+++ b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/hs2connection/UserHS2ConnectionFileParser.java
@@ -25,6 +25,7 @@ import java.util.Map.Entry;
import java.util.Properties;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
+import org.apache.kyuubi.util.JavaUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,7 @@ public class UserHS2ConnectionFileParser implements HS2ConnectionFileParser {
public static final String DEFAULT_BEELINE_USER_CONF_LOCATION =
System.getProperty("user.home")
+ File.separator
- + (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1 ? "" : ".")
+ + (JavaUtils.isWindows ? "" : ".")
+ "beeline"
+ File.separator;
public static final String ETC_HIVE_CONF_LOCATION =
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilder.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilder.scala
index fcf24b930..aacdddef3 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilder.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilder.scala
@@ -37,7 +37,7 @@ import org.apache.kyuubi.ha.HighAvailabilityConf
import org.apache.kyuubi.ha.HighAvailabilityConf.HA_ZK_ENGINE_AUTH_TYPE
import org.apache.kyuubi.ha.client.AuthTypes
import org.apache.kyuubi.operation.log.OperationLog
-import org.apache.kyuubi.util.{KubernetesUtils, Validator}
+import org.apache.kyuubi.util.{JavaUtils, KubernetesUtils, Validator}
import org.apache.kyuubi.util.command.CommandLineUtils._
class SparkProcessBuilder(
@@ -359,7 +359,8 @@ object SparkProcessBuilder {
final private[spark] val PRINCIPAL = "spark.kerberos.principal"
final private[spark] val KEYTAB = "spark.kerberos.keytab"
// Get the appropriate spark-submit file
- final private val SPARK_SUBMIT_FILE = if (Utils.isWindows) "spark-submit.cmd" else "spark-submit"
+ final private val SPARK_SUBMIT_FILE =
+ if (JavaUtils.isWindows) "spark-submit.cmd" else "spark-submit"
final private val SPARK_CONF_DIR = "SPARK_CONF_DIR"
final private val SPARK_CONF_FILE_NAME = "spark-defaults.conf"
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
index 1a449dde4..447991ebc 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
@@ -33,7 +33,7 @@ import org.apache.kyuubi.server.mysql._
import org.apache.kyuubi.server.mysql.NettyUtils._
import org.apache.kyuubi.server.mysql.authentication.MySQLAuthHandler
import org.apache.kyuubi.service.{AbstractFrontendService, Serverable, Service}
-import org.apache.kyuubi.util.NamedThreadFactory
+import org.apache.kyuubi.util.{JavaUtils, NamedThreadFactory}
/**
* A frontend service implement MySQL protocol.
@@ -64,7 +64,7 @@ class KyuubiMySQLFrontendService(override val serverable: Serverable)
serverAddr = conf.get(FRONTEND_MYSQL_BIND_HOST)
.map(InetAddress.getByName)
- .getOrElse(Utils.findLocalInetAddress)
+ .getOrElse(JavaUtils.findLocalInetAddress)
port = conf.get(FRONTEND_MYSQL_BIND_PORT)
val workerThreads = defaultNumThreads(conf.get(FRONTEND_MYSQL_NETTY_WORKER_THREADS))
val bossGroup = createEventLoop(1, "mysql-netty-boss")
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
index 06eb63fee..811f3d053 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
@@ -37,7 +37,7 @@ import org.apache.kyuubi.server.ui.{JettyServer, JettyUtils}
import org.apache.kyuubi.service.{AbstractFrontendService, Serverable, Service, ServiceUtils}
import org.apache.kyuubi.service.authentication.{AuthTypes, AuthUtils}
import org.apache.kyuubi.session.{KyuubiSessionManager, SessionHandle}
-import org.apache.kyuubi.util.ThreadUtils
+import org.apache.kyuubi.util.{JavaUtils, ThreadUtils}
import org.apache.kyuubi.util.ThreadUtils.scheduleTolerableRunnableWithFixedDelay
/**
@@ -59,13 +59,13 @@ class KyuubiRestFrontendService(override val serverable: Serverable)
lazy val host: String = conf.get(FRONTEND_REST_BIND_HOST)
.getOrElse {
- if (Utils.isWindows || Utils.isMac) {
+ if (JavaUtils.isWindows || JavaUtils.isMac) {
warn(s"Kyuubi Server run in Windows or Mac environment, binding $getName to 0.0.0.0")
"0.0.0.0"
} else if (conf.get(KyuubiConf.FRONTEND_CONNECTION_URL_USE_HOSTNAME)) {
- Utils.findLocalInetAddress.getCanonicalHostName
+ JavaUtils.findLocalInetAddress.getCanonicalHostName
} else {
- Utils.findLocalInetAddress.getHostAddress
+ JavaUtils.findLocalInetAddress.getHostAddress
}
}
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
index bef0b6f93..781f7e615 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
@@ -19,12 +19,13 @@ package org.apache.kyuubi.server
import java.util.concurrent.atomic.AtomicBoolean
-import org.apache.kyuubi.{KyuubiException, Utils}
+import org.apache.kyuubi.KyuubiException
import org.apache.kyuubi.config.KyuubiConf
-import org.apache.kyuubi.config.KyuubiConf.{FRONTEND_ADVERTISED_HOST, FRONTEND_TRINO_BIND_HOST, FRONTEND_TRINO_BIND_PORT, FRONTEND_TRINO_JETTY_STOP_TIMEOUT, FRONTEND_TRINO_MAX_WORKER_THREADS}
+import org.apache.kyuubi.config.KyuubiConf._
import org.apache.kyuubi.server.trino.api.v1.ApiRootResource
import org.apache.kyuubi.server.ui.JettyServer
import org.apache.kyuubi.service.{AbstractFrontendService, Serverable, Service}
+import org.apache.kyuubi.util.JavaUtils
/**
* A frontend service based on RESTful api via HTTP protocol.
@@ -40,9 +41,9 @@ class KyuubiTrinoFrontendService(override val serverable: Serverable)
lazy val host: String = conf.get(FRONTEND_TRINO_BIND_HOST)
.getOrElse {
if (conf.get(KyuubiConf.FRONTEND_CONNECTION_URL_USE_HOSTNAME)) {
- Utils.findLocalInetAddress.getCanonicalHostName
+ JavaUtils.findLocalInetAddress.getCanonicalHostName
} else {
- Utils.findLocalInetAddress.getHostAddress
+ JavaUtils.findLocalInetAddress.getHostAddress
}
}
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/ui/JettyServer.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/ui/JettyServer.scala
index 7f4043534..f0b752061 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/ui/JettyServer.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/ui/JettyServer.scala
@@ -22,7 +22,7 @@ import org.eclipse.jetty.server.handler.{ContextHandlerCollection, ErrorHandler}
import org.eclipse.jetty.util.component.LifeCycle
import org.eclipse.jetty.util.thread.{QueuedThreadPool, ScheduledExecutorScheduler}
-import org.apache.kyuubi.Utils.isWindows
+import org.apache.kyuubi.util.JavaUtils
private[kyuubi] case class JettyServer(
server: Server,
@@ -105,7 +105,7 @@ object JettyServer {
new HttpConnectionFactory(httpConf))
connector.setHost(host)
connector.setPort(port)
- connector.setReuseAddress(!isWindows)
+ connector.setReuseAddress(!JavaUtils.isWindows)
connector.setAcceptQueueSize(math.min(connector.getAcceptors, 8))
new JettyServer(server, connector, collection)
diff --git a/kyuubi-util/pom.xml b/kyuubi-util/pom.xml
index dc695d360..fcb3498b1 100644
--- a/kyuubi-util/pom.xml
+++ b/kyuubi-util/pom.xml
@@ -36,6 +36,11 @@
org.slf4j
slf4j-api
+
+ junit
+ junit
+ test
+
diff --git a/kyuubi-util/src/main/java/org/apache/kyuubi/util/JavaUtils.java b/kyuubi-util/src/main/java/org/apache/kyuubi/util/JavaUtils.java
index 210c1b93c..eafad685e 100644
--- a/kyuubi-util/src/main/java/org/apache/kyuubi/util/JavaUtils.java
+++ b/kyuubi-util/src/main/java/org/apache/kyuubi/util/JavaUtils.java
@@ -20,10 +20,23 @@
package org.apache.kyuubi.util;
import java.io.File;
-import java.net.URISyntaxException;
+import java.net.*;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class JavaUtils {
+ private static final Logger LOG = LoggerFactory.getLogger(JavaUtils.class);
+
+ /** Whether the underlying operating system is Windows. */
+ public static final boolean isWindows = System.getProperty("os.name", "").startsWith("Windows");
+
+ /** Whether the underlying operating system is MacOS. */
+ public static final boolean isMac = System.getProperty("os.name", "").startsWith("Mac");
+
public static String getCodeSourceLocation(Class> clazz) {
try {
return new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI()).getPath();
@@ -31,4 +44,46 @@ public class JavaUtils {
throw new RuntimeException(rethrow);
}
}
+
+ public static InetAddress findLocalInetAddress() throws UnknownHostException, SocketException {
+ InetAddress address = InetAddress.getLocalHost();
+ if (address.isLoopbackAddress()) {
+ List activeNetworkIFs =
+ Collections.list(NetworkInterface.getNetworkInterfaces());
+ if (!isWindows) {
+ Collections.reverse(activeNetworkIFs);
+ }
+
+ for (NetworkInterface ni : activeNetworkIFs) {
+ List addresses =
+ Collections.list(ni.getInetAddresses()).stream()
+ .filter(addr -> !addr.isLinkLocalAddress() && !addr.isLoopbackAddress())
+ .collect(Collectors.toList());
+
+ if (!addresses.isEmpty()) {
+ InetAddress addr =
+ addresses.stream()
+ .filter(a -> a instanceof Inet4Address)
+ .findFirst()
+ .orElse(addresses.get(0));
+
+ InetAddress strippedAddress = InetAddress.getByAddress(addr.getAddress());
+
+ // We've found an address that looks reasonable!
+ LOG.warn(
+ "{} was resolved to a loopback address: {}, using {}",
+ addr.getHostName(),
+ addr.getHostAddress(),
+ strippedAddress.getHostAddress());
+ return strippedAddress;
+ }
+ }
+
+ LOG.warn(
+ "{} was resolved to a loopback address: {} but we couldn't find any external IP address!",
+ address.getHostName(),
+ address.getHostAddress());
+ }
+ return address;
+ }
}
diff --git a/kyuubi-util/src/test/java/org/apache/kyuubi/util/JavaUtilsTest.java b/kyuubi-util/src/test/java/org/apache/kyuubi/util/JavaUtilsTest.java
new file mode 100644
index 000000000..9bcb3253d
--- /dev/null
+++ b/kyuubi-util/src/test/java/org/apache/kyuubi/util/JavaUtilsTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.kyuubi.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.net.InetAddress;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import org.junit.Test;
+
+public class JavaUtilsTest {
+
+ @Test
+ public void testFindLocalInetAddress() throws UnknownHostException, SocketException {
+ InetAddress address = InetAddress.getLocalHost();
+ if (!address.isLoopbackAddress()) {
+ assertEquals(InetAddress.getLocalHost(), JavaUtils.findLocalInetAddress());
+ } else {
+ assertNotEquals(InetAddress.getLocalHost(), JavaUtils.findLocalInetAddress());
+ }
+ }
+}
diff --git a/kyuubi-zookeeper/src/main/scala/org/apache/kyuubi/zookeeper/EmbeddedZookeeper.scala b/kyuubi-zookeeper/src/main/scala/org/apache/kyuubi/zookeeper/EmbeddedZookeeper.scala
index 1592d9063..46a71286e 100644
--- a/kyuubi-zookeeper/src/main/scala/org/apache/kyuubi/zookeeper/EmbeddedZookeeper.scala
+++ b/kyuubi-zookeeper/src/main/scala/org/apache/kyuubi/zookeeper/EmbeddedZookeeper.scala
@@ -25,6 +25,7 @@ import org.apache.kyuubi.Utils._
import org.apache.kyuubi.config.{ConfigEntry, KyuubiConf}
import org.apache.kyuubi.service.{AbstractService, ServiceState}
import org.apache.kyuubi.shaded.zookeeper.server.{NIOServerCnxnFactory, ZooKeeperServer}
+import org.apache.kyuubi.util.JavaUtils
import org.apache.kyuubi.zookeeper.ZookeeperConf._
class EmbeddedZookeeper extends AbstractService("EmbeddedZookeeper") {
@@ -48,9 +49,9 @@ class EmbeddedZookeeper extends AbstractService("EmbeddedZookeeper") {
val maxSessionTimeout = conf.get(ZK_MAX_SESSION_TIMEOUT)
host = conf.get(ZK_CLIENT_PORT_ADDRESS).getOrElse {
if (conf.get(ZK_CLIENT_USE_HOSTNAME)) {
- findLocalInetAddress.getCanonicalHostName
+ JavaUtils.findLocalInetAddress.getCanonicalHostName
} else {
- findLocalInetAddress.getHostAddress
+ JavaUtils.findLocalInetAddress.getHostAddress
}
}