HDDS-15768. Bracket IPv6 literals in Ratis peer addresses#10686
Conversation
There was a problem hiding this comment.
Pull request overview
Fixes construction of Ratis peer target strings when the host is an IPv6 literal by ensuring the host:port form is unambiguous ([ipv6]:port). This aligns Ozone’s Ratis peer addressing with what gRPC/Netty target parsing expects and prevents failures caused by unbracketed IPv6 literals.
Changes:
- Added
HddsUtils.getHostPortString(host, port)to formathost:portwith IPv6 bracketing via GuavaHostAndPort. - Updated Ratis peer address generation in
RatisHelperand HA node peer address generation inNodeDetailsto use the new helper. - Added unit tests covering IPv6 bracketing behavior in both the utility and Ratis helper paths.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java | Adds a shared helper to format host:port with correct IPv6 bracketing semantics. |
| hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/RatisHelper.java | Routes datanode Ratis peer address formatting through the new helper to support IPv6 literals. |
| hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/NodeDetails.java | Updates HA Ratis peer address formatting to use the new helper (avoids raw concatenation). |
| hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/TestHddsUtils.java | Adds focused unit coverage for getHostPortString across hostname/IPv4/IPv6 (bare and bracketed). |
| hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/ratis/TestRatisHelper.java | Adds a unit test validating IPv6 bracketing in RatisHelper.toRaftPeer(...) addresses. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
adoroszlai
left a comment
There was a problem hiding this comment.
Thanks @smengcl for the patch.
adoroszlai
left a comment
There was a problem hiding this comment.
Thanks @smengcl for updating the patch.
(Please update your fork, either "Sync fork" via GitHub UI, or push master manually. This will trigger populate-cache, which should help with frequent rocksdb source download errors. The tarball is normally stored in Maven cache.)
|
Thanks @adoroszlai for reviewing and merging this!
Thanks for the tip! Just did. |
Generated-by: Claude Code (Opus 4.8)
What changes were proposed in this pull request?
Ozone builds Ratis peer address strings by plainly concatenating a host and port (
host + ":" + port). When the host is an IPv6 literal (for example2001:db8::1), the result2001:db8::1:9858is ambiguous: it cannot be distinguished from a hostname, and neither Ratis nor gRPC can parse it. IPv6 literals must be wrapped in square brackets when combined with a port, e.g.[2001:db8::1]:9858.This affects every Ratis transport in Ozone:
RatisHelper.toRaftPeerAddress(used for theRATIS_SERVER,RATIS_ADMIN,RATIS, andRATIS_DATASTREAMpeer addresses).NodeDetails.getRatisHostPortStr(consumed byOzoneManagerRatisServer,SCMRatisServerImpl, andSCMHAManagerImplwhen callingRaftPeer.setAddress(...)).Ratis itself needs no change:
ratis-grpcpasses the peer address string verbatim toNettyChannelBuilder.forTarget(...), which accepts the bracketed[::1]:portform, and Ratis's ownNetUtils.createSocketAddr/address2Stringare already IPv6-aware. The defect is purely that Ozone hands Ratis unbracketed IPv6 strings.This PR adds a small bracket-aware formatter and routes the two Ratis peer-address producers through it:
HddsUtils.getHostPortString(String host, int port), which delegates to Guava'sHostAndPort.fromParts(host, port).toString(). It brackets bare and already-bracketed IPv6 literals, and leaves hostnames and IPv4 literals untouched.HddsUtilsalready depends on GuavaHostAndPort(used by the siblinggetHostPort), so no new dependency is introduced.RatisHelper.toRaftPeerAddressandNodeDetails.getRatisHostPortStrnow use the helper instead of raw string concatenation.Scope note: this PR fixes the Ratis peer-address path only. Other IPv6-unsafe address handling in Ozone (the
0.0.0.0bind defaults, the S3G/OFS URI and admin-CLI colon splitting, and otherhost + ":" + portsites such asGrpcOMFailoverProxyProvider) is tracked separately and is out of scope here.What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-15768
How was this patch tested?