You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2018/11/10 14:09:36 UTC

hbase git commit: HBASE-13468 hbase.zookeeper.quorum supports ipv6 address

Repository: hbase
Updated Branches:
  refs/heads/master 6786aca66 -> 5e84997f2


HBASE-13468 hbase.zookeeper.quorum supports ipv6 address

Signed-off-by: tedyu <yu...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/5e84997f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/5e84997f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/5e84997f

Branch: refs/heads/master
Commit: 5e84997f2ffdbcf5f849d70c30ddbe2db4039ca4
Parents: 6786aca
Author: maoling <ma...@sina.com>
Authored: Fri Oct 12 17:15:41 2018 +0800
Committer: tedyu <yu...@gmail.com>
Committed: Sat Nov 10 06:09:29 2018 -0800

----------------------------------------------------------------------
 hbase-common/pom.xml                            |  5 ++++
 .../apache/hadoop/hbase/zookeeper/ZKConfig.java | 31 ++++++++++++++++++--
 hbase-shaded/pom.xml                            |  4 +++
 .../hbase/zookeeper/TestZKMainServer.java       | 27 +++++++++++++++++
 pom.xml                                         |  6 ++++
 5 files changed, 70 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/5e84997f/hbase-common/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-common/pom.xml b/hbase-common/pom.xml
index 0aaccb8..7d7deef 100644
--- a/hbase-common/pom.xml
+++ b/hbase-common/pom.xml
@@ -212,6 +212,11 @@
       <scope>compile</scope>
     </dependency>
     <dependency>
+      <groupId>commons-validator</groupId>
+      <artifactId>commons-validator</artifactId>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
       <groupId>com.google.protobuf</groupId>
       <artifactId>protobuf-java</artifactId>
     </dependency>

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e84997f/hbase-common/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKConfig.java
----------------------------------------------------------------------
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..9882777 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
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.Map.Entry;
 import java.util.Properties;
 
+import org.apache.commons.validator.routines.InetAddressValidator;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.util.StringUtils;
@@ -146,12 +147,36 @@ public final class ZKConfig {
   public static String buildZKQuorumServerString(String[] serverHosts, String clientPort) {
     StringBuilder quorumStringBuilder = new StringBuilder();
     String serverHost;
+    InetAddressValidator validator = new InetAddressValidator();
     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");
+        }
+        //check the IPv6 address e.g. [2001:db8::1]
+        String serverHostWithoutBracket = serverHosts[i].substring(1, index);
+        if (!validator.isValidInet6Address(serverHostWithoutBracket)) {
+          throw new IllegalArgumentException(serverHosts[i]
+                  + " is not a valid IPv6 address");
+        }
+        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(',');
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e84997f/hbase-shaded/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-shaded/pom.xml b/hbase-shaded/pom.xml
index 29ecc1e..92170c8 100644
--- a/hbase-shaded/pom.xml
+++ b/hbase-shaded/pom.xml
@@ -339,6 +339,10 @@
 
                                     <!-- org.apache.commons not including logging -->
                                     <relocation>
+                                        <pattern>org.apache.commons.validator</pattern>
+                                        <shadedPattern>${shaded.prefix}.org.apache.commons.validator</shadedPattern>
+                                    </relocation>
+                                    <relocation>
                                         <pattern>org.apache.commons.beanutils</pattern>
                                         <shadedPattern>${shaded.prefix}.org.apache.commons.beanutils</shadedPattern>
                                     </relocation>

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e84997f/hbase-zookeeper/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKMainServer.java
----------------------------------------------------------------------
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..5680c78 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
@@ -28,6 +28,7 @@ import org.apache.hadoop.hbase.HBaseZKTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.testclassification.ZKTests;
+import org.junit.Assert;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -121,5 +122,31 @@ 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:1::242:ac11:3]:5678");
+    ensemble = parser.parse(c);
+    assertEquals("[2001:db8:1::242:ac11:2]:2181," +
+                 "[2001:db8:1::242:ac11:3]:5678", ensemble);
+
+    // 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:1::242:ac11:3]:5678");
+    ensemble = parser.parse(c);
+    assertEquals("[1001:db8:1::242:ac11:8]:1234, [2001:db8:1::242:df23:2]:9876," +
+                 "[2001:db8:1::242:ac11:3]:5678", ensemble);
+
+    //a bad case
+    try {
+      // some servers(IPv6) with an invaild Ipv6 address in it
+      c.set("hbase.zookeeper.quorum", "[1001:db8:1::242:ac11:8], [2001:db8:1::242:df23:2]:9876," +
+              "[1001:db8:1::242:ac11:8:89:67]:5678");
+      ensemble = parser.parse(c);
+      Assert.fail("IPv6 address should be 8 groups.");
+    } catch (IllegalArgumentException e) {
+      //expected
+    }
+
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e84997f/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index da6de1d..3ace2e0 100755
--- a/pom.xml
+++ b/pom.xml
@@ -1466,6 +1466,7 @@
     <audience-annotations.version>0.5.0</audience-annotations.version>
     <avro.version>1.7.7</avro.version>
     <commons-codec.version>1.10</commons-codec.version>
+    <commons-validator.version>1.6</commons-validator.version>
     <!-- pretty outdated -->
     <commons-io.version>2.5</commons-io.version>
     <commons-lang3.version>3.6</commons-lang3.version>
@@ -1920,6 +1921,11 @@
         <version>${commons-codec.version}</version>
       </dependency>
       <dependency>
+        <groupId>commons-validator</groupId>
+        <artifactId>commons-validator</artifactId>
+        <version>${commons-validator.version}</version>
+      </dependency>
+      <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
         <version>${commons-io.version}</version>