[ 
https://issues.apache.org/jira/browse/HADOOP-20027?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated HADOOP-20027:
------------------------------------
    Labels: ipv6 pull-request-available  (was: ipv6)

> DatanodeID builds unbracketed IPv6 host:port strings
> ----------------------------------------------------
>
>                 Key: HADOOP-20027
>                 URL: https://issues.apache.org/jira/browse/HADOOP-20027
>             Project: Hadoop Common
>          Issue Type: Sub-task
>            Reporter: Siyao Meng
>            Assignee: Siyao Meng
>            Priority: Major
>              Labels: ipv6, pull-request-available
>
> {{DatanodeID}} builds its address strings by plain concatenation:
> {code:java}
> this.xferAddr = ipAddr + ":" + xferPort;   // setIpAndXferPort
> return ipAddr + ":" + ipcPort;             // getIpcAddr
> return ipAddr + ":" + infoPort;            // getInfoAddr
> return ipAddr + ":" + infoSecurePort;      // getInfoSecureAddr
> {code}
> [DatanodeID.java:138, 204, 211, 
> 218|https://github.com/apache/hadoop/blob/9ede2e95c6fb577d7ae8664833d5e151cbfc47c9/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/DatanodeID.java#L138]
> For a DataNode with an IPv6 address this gives an ambiguous string such as 
> {{2001:db8:0:0:0:0:0:1:9866}} instead of {{[2001:db8:0:0:0:0:0:1]:9866}}. 
> {{NetUtils.createSocketAddr}} parses it as the authority of a URI. 
> {{java.net.URI}} returns a null host for the unbracketed form, so 
> {{createSocketAddr}} throws {{IllegalArgumentException: Does not contain a 
> valid host:port authority}}.
> {{getXferAddr}} is what the client uses to reach DataNodes: {{DataStreamer}} 
> for writes, {{DFSInputStream}} for reads, {{DFSUtilClient}} and 
> {{ClientContext}}. On an IPv6-only cluster that uses IP addresses 
> ({{dfs.client.use.datanode.hostname=false}}, the default), clients cannot 
> connect to any DataNode. The xfer address is cached in the {{DatanodeID}} and 
> sent to clients in every block location, so one bad string affects every read 
> and write. The info addresses have the same problem in the web UI and in 
> WebHDFS redirects.
> {{getXferAddrWithHostname}} and {{getIpcAddrWithHostname}} (lines 225 and 
> 232) use the same pattern. They are only wrong if the host name is itself an 
> IPv6 literal, but they should use the same helper.
> *Proposed fix:* build all of these strings with 
> {{NetUtils.getHostPortString(host, port)}}, which brackets IPv6 literals 
> since HADOOP-19958. IPv4 and host name output is unchanged. Add a unit test 
> that round-trips each address through {{NetUtils.createSocketAddr}} for IPv4, 
> IPv6 and host names.
> HADOOP-17543 reports an HDFS put failure on an IPv6 cluster with no stack 
> trace; this is a likely cause.
> POC: 
> https://github.com/smengcl/hadoop/commit/8aeae47d67401180a954f7859ae423acf641477c



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to