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]