HBASE-13468 hbase.zookeeper.quorum supports ipv6 address
Signed-off-by: tedyu <yuzhihong@gmail.com>
This commit is contained in:
parent
6786aca666
commit
5e84997f2f
|
@ -211,6 +211,11 @@
|
|||
<artifactId>commons-io</artifactId>
|
||||
<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>
|
||||
|
|
|
@ -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(',');
|
||||
}
|
||||
|
|
|
@ -338,6 +338,10 @@
|
|||
</relocation>
|
||||
|
||||
<!-- 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>
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
6
pom.xml
6
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>
|
||||
|
@ -1919,6 +1920,11 @@
|
|||
<artifactId>commons-codec</artifactId>
|
||||
<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>
|
||||
|
|
Loading…
Reference in New Issue