diff --git a/core/src/main/scala/org/apache/spark/rpc/RpcAddress.scala b/core/src/main/scala/org/apache/spark/rpc/RpcAddress.scala index eb0b26947f50..2a2d2051799d 100644 --- a/core/src/main/scala/org/apache/spark/rpc/RpcAddress.scala +++ b/core/src/main/scala/org/apache/spark/rpc/RpcAddress.scala @@ -23,7 +23,9 @@ import org.apache.spark.util.Utils /** * Address for an RPC environment, with hostname and port. */ -private[spark] case class RpcAddress(host: String, port: Int) { +private[spark] case class RpcAddress(_host: String, port: Int) { + + val host: String = Utils.addBracketsIfNeeded(_host) def hostPort: String = host + ":" + port diff --git a/core/src/main/scala/org/apache/spark/util/Utils.scala b/core/src/main/scala/org/apache/spark/util/Utils.scala index 3e4a7e727a87..cf93897f97d8 100644 --- a/core/src/main/scala/org/apache/spark/util/Utils.scala +++ b/core/src/main/scala/org/apache/spark/util/Utils.scala @@ -1089,7 +1089,7 @@ private[spark] object Utils extends Logging { addBracketsIfNeeded(customHostname.getOrElse(InetAddresses.toUriString(localIpAddress))) } - private def addBracketsIfNeeded(addr: String): String = { + private[spark] def addBracketsIfNeeded(addr: String): String = { if (addr.contains(":") && !addr.contains("[")) { "[" + addr + "]" } else { diff --git a/core/src/test/scala/org/apache/spark/rpc/RpcAddressSuite.scala b/core/src/test/scala/org/apache/spark/rpc/RpcAddressSuite.scala index b3223ec61bf7..0f7c9d71330f 100644 --- a/core/src/test/scala/org/apache/spark/rpc/RpcAddressSuite.scala +++ b/core/src/test/scala/org/apache/spark/rpc/RpcAddressSuite.scala @@ -52,4 +52,22 @@ class RpcAddressSuite extends SparkFunSuite { val address = RpcAddress("1.2.3.4", 1234) assert(address.toSparkURL == "spark://1.2.3.4:1234") } + + test("SPARK-39468: IPv6 hostPort") { + val address = RpcAddress("::1", 1234) + assert(address.host == "[::1]") + assert(address.port == 1234) + assert(address.hostPort == "[::1]:1234") + } + + test("SPARK-39468: IPv6 fromSparkURL") { + val address = RpcAddress.fromSparkURL("spark://[::1]:1234") + assert(address.host == "[::1]") + assert(address.port == 1234) + } + + test("SPARK-39468: IPv6 toSparkURL") { + val address = RpcAddress("::1", 1234) + assert(address.toSparkURL == "spark://[::1]:1234") + } }