From 8a51dc4c0c084485d59d9508ca06739403cf310f Mon Sep 17 00:00:00 2001 From: maoling Date: Fri, 12 Oct 2018 17:15:41 +0800 Subject: [PATCH] HBASE-13468:hbase.zookeeper.quorum supports ipv6 address --- .../org/apache/hadoop/hbase/zookeeper/ZKConfig.java | 21 ++++++++++++++++++--- .../hadoop/hbase/zookeeper/TestZKMainServer.java | 10 ++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKConfig.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKConfig.java index f324ec6..eecbf04 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKConfig.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKConfig.java @@ -147,11 +147,26 @@ public final class ZKConfig { StringBuilder quorumStringBuilder = new StringBuilder(); String serverHost; for (int i = 0; i < serverHosts.length; ++i) { - if (serverHosts[i].contains(":")) { - serverHost = serverHosts[i]; // just use the port specified from the input + if (serverHosts[i].startsWith("[")) { + int index = serverHosts[i].indexOf("]"); + if (index < 0) { + throw new IllegalArgumentException(serverHosts[i] + " starts with '[' but has no matching ']:'"); + } + if (index + 2 == serverHosts[i].length()) { + throw new IllegalArgumentException(serverHosts[i] + " doesn't have a port after colon"); + } + serverHost = serverHosts[i]; + if ((index + 1 == serverHosts[i].length())) { + serverHost = serverHosts[i] + ":" + clientPort; + } } else { - serverHost = serverHosts[i] + ":" + clientPort; + if (serverHosts[i].contains(":")) { + serverHost = serverHosts[i]; // just use the port specified from the input + } else { + serverHost = serverHosts[i] + ":" + clientPort; + } } + if (i > 0) { quorumStringBuilder.append(','); } diff --git a/hbase-zookeeper/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.java b/hbase-zookeeper/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.java index d1c18d3..29badbf 100644 --- a/hbase-zookeeper/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.java +++ b/hbase-zookeeper/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.java @@ -121,5 +121,15 @@ public class TestZKMainServer { c.set("hbase.zookeeper.quorum", "example1.com:5678,example2.com:9012,example3.com"); ensemble = parser.parse(c); assertEquals(ensemble, "example1.com:5678,example2.com:9012,example3.com:" + port); + + // multiple servers(IPv6) with its own port + c.set("hbase.zookeeper.quorum", "[2001:db8:1::242:ac11:2]:2181,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5678"); + ensemble = parser.parse(c); + assertEquals(ensemble, "[2001:db8:1::242:ac11:2]:2181,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5678"); + + // some servers(IPv6) without its own port, which will be assigned the default client port + c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8],[2001:db8:1::242:df23:2]:9876,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5678"); + ensemble = parser.parse(c); + assertEquals(ensemble, "[1001:db8:1::242:ac11:8]:1234,[2001:db8:1::242:df23:2]:9876,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5678"); } } -- 1.8.3.1