This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new ed92faaaa97 HDDS-15773. Make HddsUtils host:port helpers IPv6-safe 
(#10804)
ed92faaaa97 is described below

commit ed92faaaa97431359df90d776e09f766257a5d3e
Author: Chi-Hsuan Huang <[email protected]>
AuthorDate: Sun Jul 19 00:56:53 2026 +0800

    HDDS-15773. Make HddsUtils host:port helpers IPv6-safe (#10804)
---
 .../hdds/scm/client/TestHddsClientUtils.java       | 37 ++++++++++++++++++++++
 .../java/org/apache/hadoop/hdds/HddsUtils.java     | 21 ++----------
 .../java/org/apache/hadoop/hdds/TestHddsUtils.java | 19 +++++++++++
 3 files changed, 58 insertions(+), 19 deletions(-)

diff --git 
a/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/client/TestHddsClientUtils.java
 
b/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/client/TestHddsClientUtils.java
index a18d008ab8e..647ae727465 100644
--- 
a/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/client/TestHddsClientUtils.java
+++ 
b/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/client/TestHddsClientUtils.java
@@ -127,6 +127,13 @@ private void checkAddr(OzoneConfiguration conf, String 
address, int port) {
     assertEquals(port, scmAddr.getPort());
   }
 
+  private void checkScmClientAddr(String confKey, String value,
+      String expectedHost, int expectedPort) {
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(confKey, value);
+    checkAddr(conf, expectedHost, expectedPort);
+  }
+
   @Test
   public void testBlockClientFallbackToClientNoPort() {
     // When OZONE_SCM_BLOCK_CLIENT_ADDRESS_KEY is undefined it should
@@ -175,6 +182,36 @@ public void testClientFallbackToScmNamesWithPort() {
     assertEquals(OZONE_SCM_CLIENT_PORT_DEFAULT, socketAddress.getPort());
   }
 
+  @Test
+  public void testClientAddressIPv6() {
+    // Bare IPv6 literal without port: port falls back to the default and the
+    // host must be re-bracketed before the address string is parsed.
+    checkScmClientAddr(OZONE_SCM_CLIENT_ADDRESS_KEY, "2001:db8::1",
+        "2001:db8:0:0:0:0:0:1", OZONE_SCM_CLIENT_PORT_DEFAULT);
+
+    // Bracketed IPv6 literal with explicit port.
+    checkScmClientAddr(OZONE_SCM_CLIENT_ADDRESS_KEY, "[2001:db8::1]:9876",
+        "2001:db8:0:0:0:0:0:1", 9876);
+
+    // Bracketed IPv6 literal without port (host:port documents port as
+    // optional).
+    checkScmClientAddr(OZONE_SCM_CLIENT_ADDRESS_KEY, "[2001:db8::1]",
+        "2001:db8:0:0:0:0:0:1", OZONE_SCM_CLIENT_PORT_DEFAULT);
+  }
+
+  @Test
+  public void testClientFallbackToScmNamesIPv6() {
+    // Bare IPv6 literal in ozone.scm.names.
+    checkScmClientAddr(OZONE_SCM_NAMES, "2001:db8::1",
+        "2001:db8:0:0:0:0:0:1", OZONE_SCM_CLIENT_PORT_DEFAULT);
+
+    // On the ozone.scm.names fallback path an inline port is ignored and the
+    // default client port is used instead (same semantics as
+    // testClientFallbackToScmNamesWithPort).
+    checkScmClientAddr(OZONE_SCM_NAMES, "[2001:db8::1]:300",
+        "2001:db8:0:0:0:0:0:1", OZONE_SCM_CLIENT_PORT_DEFAULT);
+  }
+
   @Test
   @SuppressWarnings("StringSplitter")
   public void testBlockClientFallbackToClientWithPort() {
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
index 335b8934c21..46289059dbb 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java
@@ -165,7 +165,7 @@ public static Collection<InetSocketAddress> 
getScmAddressForClients(
       }
 
       return Collections.singletonList(
-          NetUtils.createSocketAddr(getHostName(address).get() + ":" + port));
+          
NetUtils.createSocketAddr(getHostPortString(getHostName(address).get(), port)));
     }
   }
 
@@ -203,7 +203,7 @@ public static Optional<String> getHostName(String value) {
     if ((value == null) || value.isEmpty()) {
       return Optional.empty();
     }
-    String hostname = value.replaceAll("\\:[0-9]+$", "");
+    String hostname = HostAndPort.fromString(value).getHost();
     if (hostname.isEmpty()) {
       return Optional.empty();
     } else {
@@ -585,23 +585,6 @@ public static File createDir(String dirPath) {
     return dirFile;
   }
 
-  /**
-   * Utility string formatter method to display SCM roles.
-   *
-   * @param nodes
-   * @return String
-   */
-  public static String format(List<String> nodes) {
-    StringBuilder sb = new StringBuilder();
-    for (String node : nodes) {
-      String[] x = node.split(":");
-      sb.append(String
-          .format("{ HostName : %s, Ratis Port : %s, Role : %s } ", x[0], x[1],
-              x[2]));
-    }
-    return sb.toString();
-  }
-
   /**
    * Return Ozone service shutdown time out.
    * @param conf
diff --git 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java
index 95e2cb2d564..8b2532391ad 100644
--- a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java
+++ b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java
@@ -57,6 +57,25 @@ void testGetHostName() {
 
     assertEquals(Optional.empty(),
         HddsUtils.getHostName(":1234"));
+
+    assertEquals(Optional.of("::1"),
+        HddsUtils.getHostName("[::1]:9862"));
+
+    assertEquals(Optional.of("::1"),
+        HddsUtils.getHostName("::1"));
+
+    assertEquals(Optional.of("2001:db8::1"),
+        HddsUtils.getHostName("2001:db8::1"));
+
+    assertEquals(Optional.of("2001:db8::1"),
+        HddsUtils.getHostName("[2001:db8::1]:9862"));
+
+    assertEquals(Optional.of("2001:db8::1"),
+        HddsUtils.getHostName("[2001:db8::1]"));
+
+    // Malformed host:port input is rejected, matching getHostPort().
+    assertThrows(IllegalArgumentException.class,
+        () -> HddsUtils.getHostName("a:b"));
   }
 
   @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to