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

jojochuang 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 e995b5165e8 HDDS-16831. Make remaining host and port concatenations 
IPv6-safe (#11462)
e995b5165e8 is described below

commit e995b5165e811f135080484aca56b28382f377de
Author: Siyao Meng <[email protected]>
AuthorDate: Mon Oct 12 09:00:42 2026 -0700

    HDDS-16831. Make remaining host and port concatenations IPv6-safe (#11462)
    
    Generated-by: Claude Opus 5.5 <[email protected]>
---
 .../cli/datanode/DiskBalancerSubCommandUtil.java   |  5 +-
 .../admin/reconfig/ReconfigureSubCommandUtil.java  |  3 +-
 .../datanode/TestDiskBalancerSubCommandUtil.java   | 24 ++++++++
 .../reconfig/TestReconfigureSubCommandUtil.java    | 64 ++++++++++++++++++++++
 .../ozone/om/ha/GrpcOMFailoverProxyProvider.java   |  2 +-
 .../ozone/insight/BaseInsightSubCommand.java       |  2 +-
 .../ozone/insight/TestBaseInsightSubCommand.java   | 13 +++++
 .../ozone/protocolPB/TestGrpcOmTransport.java      | 12 ++++
 8 files changed, 120 insertions(+), 5 deletions(-)

diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerSubCommandUtil.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerSubCommandUtil.java
index 29c47dabff4..7f735b05e48 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerSubCommandUtil.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerSubCommandUtil.java
@@ -28,6 +28,7 @@
 import java.util.Map;
 import java.util.UUID;
 import java.util.regex.Pattern;
+import org.apache.hadoop.hdds.HddsUtils;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails.Port;
@@ -217,7 +218,7 @@ static String getClientRpcAddress(DatanodeDetails details) 
throws IOException {
       throw new IOException(String.format("host: %s(%s) %s port not found",
           details.getHostName(), details.getIpAddress(), 
Port.Name.CLIENT_RPC.name()));
     }
-    return details.getIpAddress() + ":" + port.getValue();
+    return HddsUtils.getHostPortString(details.getIpAddress(), 
port.getValue());
   }
 
   /**
@@ -237,7 +238,7 @@ public static String 
getDatanodeHostAndIp(HddsProtos.DatanodeDetailsProto nodePr
         .findFirst()
         .orElse(HDDS_DATANODE_CLIENT_PORT_DEFAULT); // Default port if not 
found
 
-    String addressPort = ipAddress + ":" + port;
+    String addressPort = HddsUtils.getHostPortString(ipAddress, port);
     if (hostname != null && !hostname.isEmpty() && 
!hostname.equals(ipAddress)) {
       return hostname + " (" + addressPort + ")";
     }
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/reconfig/ReconfigureSubCommandUtil.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/reconfig/ReconfigureSubCommandUtil.java
index 28b89090dae..702efc4624c 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/reconfig/ReconfigureSubCommandUtil.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/reconfig/ReconfigureSubCommandUtil.java
@@ -27,6 +27,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiConsumer;
+import org.apache.hadoop.hdds.HddsUtils;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails.Port;
@@ -102,7 +103,7 @@ public static List<String> 
getAllOperableNodesClientRpcAddress(
       }
       Port port = details.getPort(Port.Name.CLIENT_RPC);
       if (port != null) {
-        addresses.add(details.getIpAddress() + ":" + port.getValue());
+        addresses.add(HddsUtils.getHostPortString(details.getIpAddress(), 
port.getValue()));
       } else {
         System.out.printf("host: %s(%s) %s port not found",
             details.getHostName(), details.getIpAddress(),
diff --git 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDiskBalancerSubCommandUtil.java
 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDiskBalancerSubCommandUtil.java
index 3e07752fd55..af16519a2e3 100644
--- 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDiskBalancerSubCommandUtil.java
+++ 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDiskBalancerSubCommandUtil.java
@@ -26,12 +26,14 @@
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.client.ScmClient;
+import org.apache.hadoop.net.NetUtils;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -97,6 +99,18 @@ public void testGetClientRpcAddress() throws IOException {
         DiskBalancerSubCommandUtil.getClientRpcAddress(details));
   }
 
+  @Test
+  public void testGetClientRpcAddressWithIpv6() throws IOException {
+    DatanodeDetails details = DatanodeDetails.getFromProtoBuf(
+        buildNode(DN_UUID, "nodename", "2001:db8::5", 
HDDS_DATANODE_CLIENT_PORT_DEFAULT).getNodeID());
+
+    String address = DiskBalancerSubCommandUtil.getClientRpcAddress(details);
+
+    assertEquals("[2001:db8::5]:" + HDDS_DATANODE_CLIENT_PORT_DEFAULT, 
address);
+    assertEquals(new InetSocketAddress("2001:db8::5", 
HDDS_DATANODE_CLIENT_PORT_DEFAULT),
+        NetUtils.createSocketAddr(address));
+  }
+
   @Test
   public void testGetDatanodeHostAndIp() {
     HddsProtos.DatanodeDetailsProto nodeProto = buildNode(
@@ -110,6 +124,16 @@ public void testGetDatanodeHostAndIp() {
         DiskBalancerSubCommandUtil.getDatanodeHostAndIp(nodeProto));
   }
 
+  @Test
+  public void testGetDatanodeHostAndIpWithIpv6() {
+    HddsProtos.DatanodeDetailsProto nodeProto = buildNode(
+        DN_UUID, "ozone-datanode-2.ozone_default", "2001:db8::5", 
HDDS_DATANODE_CLIENT_PORT_DEFAULT).getNodeID();
+
+    assertEquals(
+        "ozone-datanode-2.ozone_default ([2001:db8::5]:" + 
HDDS_DATANODE_CLIENT_PORT_DEFAULT + ")",
+        DiskBalancerSubCommandUtil.getDatanodeHostAndIp(nodeProto));
+  }
+
   @Test
   public void testNormalizeNodeIds() {
     List<String> normalized = DiskBalancerSubCommandUtil.normalizeNodeIds(
diff --git 
a/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/reconfig/TestReconfigureSubCommandUtil.java
 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/reconfig/TestReconfigureSubCommandUtil.java
new file mode 100644
index 00000000000..7eadf0396a2
--- /dev/null
+++ 
b/hadoop-ozone/cli-admin/src/test/java/org/apache/hadoop/ozone/admin/reconfig/TestReconfigureSubCommandUtil.java
@@ -0,0 +1,64 @@
+/*
+ * 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.hadoop.ozone.admin.reconfig;
+
+import static 
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_CLIENT_PORT_DEFAULT;
+import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.IN_SERVICE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.UUID;
+import org.apache.hadoop.hdds.protocol.DatanodeDetails;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.hdds.scm.client.ScmClient;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit tests for {@link ReconfigureSubCommandUtil}.
+ */
+public class TestReconfigureSubCommandUtil {
+
+  @Test
+  public void testGetAllOperableNodesClientRpcAddress() throws IOException {
+    ScmClient scmClient = mock(ScmClient.class);
+    when(scmClient.queryNode(IN_SERVICE, null, HddsProtos.QueryScope.CLUSTER, 
"")).thenReturn(Arrays.asList(
+        buildNode("10.140.95.199", HddsProtos.NodeState.HEALTHY),
+        buildNode("2001:db8::5", HddsProtos.NodeState.HEALTHY),
+        buildNode("2001:db8::6", HddsProtos.NodeState.DEAD)));
+
+    
assertThat(ReconfigureSubCommandUtil.getAllOperableNodesClientRpcAddress(scmClient)).containsExactly(
+        "10.140.95.199:" + HDDS_DATANODE_CLIENT_PORT_DEFAULT,
+        "[2001:db8::5]:" + HDDS_DATANODE_CLIENT_PORT_DEFAULT);
+  }
+
+  private static HddsProtos.Node buildNode(String ipAddress, 
HddsProtos.NodeState state) {
+    HddsProtos.DatanodeDetailsProto dnd = 
HddsProtos.DatanodeDetailsProto.newBuilder()
+        .setUuid(UUID.randomUUID().toString())
+        .setHostName("nodename")
+        .setIpAddress(ipAddress)
+        .addPorts(HddsProtos.Port.newBuilder()
+            .setName(DatanodeDetails.Port.Name.CLIENT_RPC.name())
+            .setValue(HDDS_DATANODE_CLIENT_PORT_DEFAULT)
+            .build())
+        .build();
+    return 
HddsProtos.Node.newBuilder().setNodeID(dnd).addNodeStates(state).build();
+  }
+}
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/GrpcOMFailoverProxyProvider.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/GrpcOMFailoverProxyProvider.java
index 471f15789f6..d74ac47b538 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/GrpcOMFailoverProxyProvider.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/ha/GrpcOMFailoverProxyProvider.java
@@ -79,7 +79,7 @@ protected List<OMProxyInfo<T>> 
initOmProxiesFromConfigs(ConfigurationSource conf
       if (hostAddr.isPresent()) {
         int port = hostport
             
.orElse(config.getObject(GrpcOmTransport.GrpcOmTransportConfig.class).getPort());
-        String rpcAddrStr = hostAddr.get() + ":" + port;
+        String rpcAddrStr = HddsUtils.getHostPortString(hostAddr.get(), port);
         omProxies.add(OMProxyInfo.newInstance(createOMProxy(), omSvcId, 
nodeId, rpcAddrStr));
       } else {
         LOG.error("expected host address not defined for: {}", rpcAddrKey);
diff --git 
a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java
 
b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java
index 4a20da99f4f..2e6c4f84f64 100644
--- 
a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java
+++ 
b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java
@@ -80,7 +80,7 @@ public String getHost(OzoneConfiguration conf, Component 
component) {
     String protocol = policy.isHttpsEnabled() ? HTTPS_SCHEME : HTTP_SCHEME;
     
     if (component.getHostname() != null) {
-      return protocol + "://" + component.getHostname() + ":" + 
component.getPort();
+      return protocol + "://" + 
HddsUtils.getHostPortString(component.getHostname(), component.getPort());
     }
     
     String address = getComponentAddress(conf, component.getName(), policy);
diff --git 
a/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java
 
b/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java
index f37c34cdbfe..4e2c95653bd 100644
--- 
a/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java
+++ 
b/hadoop-ozone/insight/src/test/java/org/apache/hadoop/ozone/insight/TestBaseInsightSubCommand.java
@@ -114,4 +114,17 @@ public void testFallbackToIpv6RpcAddress() {
     assertEquals("http://[2001:db8::2]:"; + 
OMConfigKeys.OZONE_OM_HTTP_BIND_PORT_DEFAULT,
         command.getHost(conf, new Component(Type.OM, null)));
   }
+
+  @Test
+  public void testDatanodeIpv6Hostname() {
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(OzoneConfigKeys.OZONE_HTTP_POLICY_KEY, "HTTP_ONLY");
+
+    BaseInsightSubCommand command = new BaseInsightSubCommand();
+
+    assertEquals("http://[2001:db8::3]:9882";,
+        command.getHost(conf, new Component(Type.DATANODE, null, 
"2001:db8::3", 9882)));
+    assertEquals("http://dn-host:9882";,
+        command.getHost(conf, new Component(Type.DATANODE, null, "dn-host", 
9882)));
+  }
 }
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/protocolPB/TestGrpcOmTransport.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/protocolPB/TestGrpcOmTransport.java
index 8d522964808..7cc62bbdd77 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/protocolPB/TestGrpcOmTransport.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/protocolPB/TestGrpcOmTransport.java
@@ -17,6 +17,7 @@
 
 package org.apache.hadoop.ozone.protocolPB;
 
+import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
 import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_TRANSPORT_CLASS;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -91,4 +92,15 @@ public void testStartStop() throws Exception {
       client.shutdown();
     }
   }
+
+  @Test
+  public void testStartStopWithIpv6OmAddress() throws Exception {
+    OzoneConfiguration ipv6Conf = new OzoneConfiguration(conf);
+    ipv6Conf.set(OZONE_OM_ADDRESS_KEY, "[2001:db8::10]:9862");
+    UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
+
+    // the constructor starts the transport
+    GrpcOmTransport client = new GrpcOmTransport(ipv6Conf, ugi, "");
+    client.shutdown();
+  }
 }


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

Reply via email to