Repository: curator Updated Branches: refs/heads/master 7a60af0dd -> 81fc3d9b2
Fixing connection string construction to ignore wildcard client addresses Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/9b73d11b Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/9b73d11b Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/9b73d11b Branch: refs/heads/master Commit: 9b73d11bc03c6e37567e237e96c36cdf93e4ff66 Parents: 87a145c Author: Kenco <[email protected]> Authored: Mon Mar 13 20:51:42 2017 +0000 Committer: Kenco <[email protected]> Committed: Mon Mar 13 20:51:42 2017 +0000 ---------------------------------------------------------------------- .../curator/framework/imps/EnsembleTracker.java | 40 +++++++++++++++----- .../framework/imps/TestReconfiguration.java | 32 ++++++++++++++++ 2 files changed, 62 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/9b73d11b/curator-framework/src/main/java/org/apache/curator/framework/imps/EnsembleTracker.java ---------------------------------------------------------------------- diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/EnsembleTracker.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/EnsembleTracker.java index 7245ceb..97d8d8c 100644 --- a/curator-framework/src/main/java/org/apache/curator/framework/imps/EnsembleTracker.java +++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/EnsembleTracker.java @@ -20,7 +20,6 @@ package org.apache.curator.framework.imps; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import org.apache.curator.ensemble.EnsembleProvider; @@ -40,10 +39,11 @@ import org.apache.zookeeper.server.quorum.flexible.QuorumMaj; import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import java.io.ByteArrayInputStream; import java.io.Closeable; +import java.net.InetAddress; import java.net.InetSocketAddress; -import java.util.Arrays; import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -166,12 +166,26 @@ public class EnsembleTracker implements Closeable, CuratorWatcher StringBuilder sb = new StringBuilder(); for ( QuorumPeer.QuorumServer server : data.getAllMembers().values() ) { + if ( server.clientAddr == null ) + { + // Invalid client address configuration in zoo.cfg + continue; + } if ( sb.length() != 0 ) { sb.append(","); } - InetSocketAddress address = Objects.firstNonNull(server.clientAddr, server.addr); - sb.append(address.getAddress().getHostAddress()).append(":").append(address.getPort()); + InetAddress wildcardAddress = new InetSocketAddress(0).getAddress(); + String hostAddress; + if ( wildcardAddress.equals(server.clientAddr.getAddress()) ) + { + hostAddress = server.addr.getAddress().getHostAddress(); + } + else + { + hostAddress = server.clientAddr.getAddress().getHostAddress(); + } + sb.append(hostAddress).append(":").append(server.clientAddr.getPort()); } return sb.toString(); @@ -183,13 +197,19 @@ public class EnsembleTracker implements Closeable, CuratorWatcher properties.load(new ByteArrayInputStream(data)); log.info("New config event received: {}", properties); - QuorumMaj newConfig = new QuorumMaj(properties); - currentConfig.set(newConfig); - - String connectionString = configToConnectionString(newConfig); - if ( connectionString.trim().length() > 0 ) + if (!properties.isEmpty()) { - ensembleProvider.setConnectionString(connectionString); + QuorumMaj newConfig = new QuorumMaj(properties); + String connectionString = configToConnectionString(newConfig); + if (connectionString.trim().length() > 0) + { + currentConfig.set(newConfig); + ensembleProvider.setConnectionString(connectionString); + } + else + { + log.error("Invalid config event received: {}", properties); + } } else { http://git-wip-us.apache.org/repos/asf/curator/blob/9b73d11b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java ---------------------------------------------------------------------- diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java index 7565590..52d2860 100644 --- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java +++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java @@ -313,6 +313,38 @@ public class TestReconfiguration extends BaseClassForTests } } + @Test + public void testConfigToConnectionStringNormal() throws Exception + { + String config = "server.1=10.1.2.3:2888:3888:participant;10.2.3.4:2181"; + String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes())); + Assert.assertEquals("10.2.3.4:2181", configString); + } + + @Test + public void testConfigToConnectionStringNoClientAddr() throws Exception + { + String config = "server.1=10.1.2.3:2888:3888:participant;2181"; + String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes())); + Assert.assertEquals("10.1.2.3:2181", configString); + } + + @Test + public void testConfigToConnectionStringWildcardClientAddr() throws Exception + { + String config = "server.1=10.1.2.3:2888:3888:participant;0.0.0.0:2181"; + String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes())); + Assert.assertEquals("10.1.2.3:2181", configString); + } + + @Test + public void testConfigToConnectionStringNoClientAddrOrPort() throws Exception + { + String config = "server.1=10.1.2.3:2888:3888:participant"; + String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes())); + Assert.assertEquals("", configString); + } + private CuratorFramework newClient() { final AtomicReference<String> connectString = new AtomicReference<>(cluster.getConnectString());
