You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2017/07/18 13:20:44 UTC

[1/4] curator git commit: Fixing connection string construction to ignore wildcard client addresses

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 <da...@gmail.com>
Authored: Mon Mar 13 20:51:42 2017 +0000
Committer: Kenco <da...@gmail.com>
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());


[4/4] curator git commit: Merge branch 'CURATOR-392' of github.com:Vile2539/curator into CURATOR-392

Posted by ra...@apache.org.
Merge branch 'CURATOR-392' of github.com:Vile2539/curator into CURATOR-392


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/81fc3d9b
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/81fc3d9b
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/81fc3d9b

Branch: refs/heads/master
Commit: 81fc3d9b29ddef501919b6a4166afeae3613cbc5
Parents: 7a60af0 bd8fb66
Author: randgalt <ra...@apache.org>
Authored: Tue Jul 18 08:18:10 2017 -0500
Committer: randgalt <ra...@apache.org>
Committed: Tue Jul 18 08:18:10 2017 -0500

----------------------------------------------------------------------
 .../curator/framework/imps/EnsembleTracker.java | 39 ++++++++---
 .../framework/imps/TestReconfiguration.java     | 72 ++++++++++++++++++++
 2 files changed, 100 insertions(+), 11 deletions(-)
----------------------------------------------------------------------



[2/4] curator git commit: Merge branch 'master' into CURATOR-392

Posted by ra...@apache.org.
Merge branch 'master' into CURATOR-392


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

Branch: refs/heads/master
Commit: ddf4cb281e61c6fb0a25ea68331e1b4599e4bb20
Parents: 9b73d11 7d4f062
Author: Kenco <da...@gmail.com>
Authored: Mon Jul 17 20:45:43 2017 +0100
Committer: Kenco <da...@gmail.com>
Committed: Mon Jul 17 20:45:43 2017 +0100

----------------------------------------------------------------------
 README                                          |   7 -
 README.md                                       |  11 +
 .../ensemble/fixed/FixedEnsembleProvider.java   |   4 +-
 .../curator/utils/ExceptionAccumulator.java     |  69 +++
 .../org/apache/curator/utils/ThreadUtils.java   |   4 +-
 curator-examples/pom.xml                        |  23 +-
 .../src/main/java/async/AsyncExamples.java      | 127 +++++
 .../src/main/java/modeled/ContainerType.java    |  68 +++
 .../java/modeled/ModeledCuratorExamples.java    |  67 +++
 .../java/modeled/ModeledCuratorExamplesAlt.java |  52 ++
 .../src/main/java/modeled/PersonId.java         |  70 +++
 .../src/main/java/modeled/PersonModel.java      | 120 +++++
 .../src/main/java/modeled/PersonModelSpec.java  |  46 ++
 .../src/main/java/pubsub/Clients.java           |  76 +++
 .../src/main/java/pubsub/Publisher.java         | 146 ++++++
 curator-examples/src/main/java/pubsub/README.md |  93 ++++
 .../src/main/java/pubsub/SubPubTest.java        | 220 +++++++++
 .../src/main/java/pubsub/Subscriber.java        |  84 ++++
 .../java/pubsub/messages/LocationAvailable.java |  55 +++
 .../main/java/pubsub/messages/UserCreated.java  |  64 +++
 .../src/main/java/pubsub/models/Group.java      |  47 ++
 .../src/main/java/pubsub/models/Instance.java   |  76 +++
 .../main/java/pubsub/models/InstanceType.java   |  27 ++
 .../src/main/java/pubsub/models/Message.java    |  67 +++
 .../src/main/java/pubsub/models/Priority.java   |  26 +
 .../src/main/resources/log4j.properties         |  24 +
 .../src/site/confluence/index.confluence        |   5 +-
 .../curator/framework/api/CreateBuilder.java    |  27 +-
 .../curator/framework/api/CreateBuilder2.java   |  34 ++
 .../transaction/TransactionCreateBuilder.java   |  24 +-
 .../transaction/TransactionCreateBuilder2.java  |  34 ++
 .../framework/imps/CreateBuilderImpl.java       | 159 +++----
 .../framework/imps/GetDataBuilderImpl.java      |   5 +
 .../apache/curator/framework/schema/Schema.java |   2 +-
 .../framework/imps/TestFailedDeleteManager.java |   8 +-
 .../curator/framework/imps/TestFramework.java   |   2 +-
 .../framework/imps/TestFrameworkEdges.java      |  22 +-
 .../framework/imps/TestNamespaceFacade.java     |   6 +-
 .../framework/imps/TestReconfiguration.java     |  74 ++-
 .../curator/framework/imps/TestTtlNodes.java    |  88 ++++
 .../framework/recipes/cache/NodeCache.java      |  15 +
 .../recipes/cache/PathChildrenCache.java        |   4 +-
 .../recipes/locks/InterProcessMutex.java        |   7 +-
 .../framework/recipes/nodes/PersistentNode.java | 103 +++-
 .../recipes/nodes/PersistentNodeListener.java   |  33 ++
 .../recipes/nodes/PersistentTtlNode.java        | 209 +++++++++
 .../framework/recipes/shared/SharedCount.java   |  10 +-
 .../framework/recipes/shared/SharedValue.java   |  28 +-
 .../src/site/confluence/index.confluence        |   3 +-
 .../persistent-ephemeral-node.confluence        |  39 --
 .../site/confluence/persistent-node.confluence  |  39 ++
 .../confluence/persistent-ttl-node.confluence   |  41 ++
 .../recipes/cache/TestEventOrdering.java        |   2 +-
 .../cache/TestPathChildrenCacheInCluster.java   |  63 ++-
 .../recipes/leader/TestLeaderSelector.java      |   2 +-
 .../locks/TestInterProcessSemaphoreCluster.java |   3 +-
 .../nodes/TestPersistentEphemeralNode.java      |  52 +-
 .../recipes/nodes/TestPersistentTtlNode.java    | 154 ++++++
 .../recipes/shared/TestSharedCount.java         | 117 ++++-
 .../apache/curator/test/BaseClassForTests.java  |  10 +-
 .../org/apache/curator/test/DirectoryUtils.java |  10 +-
 .../curator/test/TestingQuorumPeerMain.java     |  17 +-
 .../curator/test/TestingZooKeeperMain.java      |  16 +-
 .../curator/test/TestingZooKeeperServer.java    |  18 +-
 .../java/org/apache/curator/test/Timing.java    |  28 ++
 .../apache/curator/test/ZooKeeperMainFace.java  |   3 -
 curator-x-async/pom.xml                         |  18 +
 .../org/apache/curator/x/async/AsyncStage.java  |  15 +-
 .../apache/curator/x/async/AsyncWrappers.java   | 393 ++++++++++++++++
 .../curator/x/async/api/AsyncCreateBuilder.java |  57 +++
 .../x/async/api/AsyncCuratorFrameworkDsl.java   |   1 -
 .../api/AsyncTransactionCreateBuilder.java      |  35 +-
 .../x/async/details/AsyncCreateBuilderImpl.java |  43 +-
 .../x/async/details/AsyncTransactionOpImpl.java |  31 +-
 .../x/async/modeled/JacksonModelSerializer.java | 124 +++++
 .../x/async/modeled/ModelSerializer.java        |  61 +++
 .../curator/x/async/modeled/ModelSpec.java      | 217 +++++++++
 .../x/async/modeled/ModelSpecBuilder.java       | 138 ++++++
 .../x/async/modeled/ModeledFramework.java       | 371 +++++++++++++++
 .../async/modeled/ModeledFrameworkBuilder.java  | 172 +++++++
 .../curator/x/async/modeled/ModeledOptions.java |  29 ++
 .../curator/x/async/modeled/NodeName.java       |  39 ++
 .../curator/x/async/modeled/Resolvable.java     |  48 ++
 .../apache/curator/x/async/modeled/ZNode.java   |  74 +++
 .../apache/curator/x/async/modeled/ZPath.java   | 279 +++++++++++
 .../modeled/cached/CachedModeledFramework.java  | 113 +++++
 .../x/async/modeled/cached/ModeledCache.java    |  46 ++
 .../modeled/cached/ModeledCacheListener.java    | 106 +++++
 .../details/CachedModeledFrameworkImpl.java     | 334 +++++++++++++
 .../x/async/modeled/details/ModelSpecImpl.java  | 239 ++++++++++
 .../x/async/modeled/details/ModelStage.java     | 171 +++++++
 .../async/modeled/details/ModeledCacheImpl.java | 211 +++++++++
 .../modeled/details/ModeledFrameworkImpl.java   | 469 +++++++++++++++++++
 .../details/VersionedModeledFrameworkImpl.java  |  85 ++++
 .../x/async/modeled/details/ZNodeImpl.java      |  56 +++
 .../x/async/modeled/details/ZPathImpl.java      | 289 ++++++++++++
 .../x/async/modeled/typed/TypedModelSpec.java   |  87 ++++
 .../x/async/modeled/typed/TypedModelSpec0.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec10.java |  61 +++
 .../x/async/modeled/typed/TypedModelSpec2.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec3.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec4.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec5.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec6.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec7.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec8.java  |  61 +++
 .../x/async/modeled/typed/TypedModelSpec9.java  |  61 +++
 .../modeled/typed/TypedModeledFramework.java    |  93 ++++
 .../modeled/typed/TypedModeledFramework0.java   |  63 +++
 .../modeled/typed/TypedModeledFramework10.java  |  63 +++
 .../modeled/typed/TypedModeledFramework2.java   |  63 +++
 .../modeled/typed/TypedModeledFramework3.java   |  63 +++
 .../modeled/typed/TypedModeledFramework4.java   |  63 +++
 .../modeled/typed/TypedModeledFramework5.java   |  63 +++
 .../modeled/typed/TypedModeledFramework6.java   |  63 +++
 .../modeled/typed/TypedModeledFramework7.java   |  63 +++
 .../modeled/typed/TypedModeledFramework8.java   |  63 +++
 .../modeled/typed/TypedModeledFramework9.java   |  63 +++
 .../x/async/modeled/typed/TypedZPath.java       |  92 ++++
 .../x/async/modeled/typed/TypedZPath0.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath10.java     |  52 ++
 .../x/async/modeled/typed/TypedZPath2.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath3.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath4.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath5.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath6.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath7.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath8.java      |  52 ++
 .../x/async/modeled/typed/TypedZPath9.java      |  52 ++
 .../x/async/modeled/versioned/Versioned.java    |  69 +++
 .../versioned/VersionedModeledFramework.java    |  56 +++
 .../src/site/confluence/async.confluence        | 212 +++++++++
 .../src/site/confluence/index.confluence        | 213 +--------
 .../confluence/modeled-components.confluence    | 186 ++++++++
 .../site/confluence/modeled-typed.confluence    |  89 ++++
 .../src/site/confluence/modeled.confluence      |  48 ++
 curator-x-async/src/site/site.xml               |   6 +-
 .../x/async/CompletableBaseClassForTests.java   |  71 +++
 .../curator/x/async/TestAsyncWrappers.java      |  73 +++
 .../curator/x/async/TestBasicOperations.java    |  58 +--
 .../modeled/TestCachedModeledFramework.java     |  96 ++++
 .../x/async/modeled/TestModeledFramework.java   | 170 +++++++
 .../async/modeled/TestModeledFrameworkBase.java |  64 +++
 .../curator/x/async/modeled/TestZPath.java      | 126 +++++
 .../x/async/modeled/models/TestModel.java       | 115 +++++
 .../x/async/modeled/models/TestNewerModel.java  | 137 ++++++
 .../x/async/modeled/models/TestSimpleModel.java |  84 ++++
 .../src/test/resources/log4j.properties         |  27 ++
 .../curator/x/discovery/ServiceInstance.java    |  15 +
 .../curator/x/discovery/ServiceProvider.java    |   7 +
 .../details/JsonInstanceSerializer.java         |  53 ++-
 .../x/discovery/details/OldServiceInstance.java | 196 ++++++++
 .../discovery/details/ServiceDiscoveryImpl.java |  21 +-
 .../x/discovery/TestJsonInstanceSerializer.java |  16 +-
 ...TestJsonInstanceSerializerCompatibility.java | 107 +++++
 .../details/TestNewServiceInstance.java         | 145 ++++++
 .../discovery/details/TestServiceDiscovery.java | 130 ++---
 .../discovery/details/TestServiceProvider.java  |   3 +-
 curator-x-rpc/src/site/site.xml                 |   2 +-
 doap.rdf                                        |   4 +-
 pom.xml                                         |  27 +-
 src/site/confluence/index.confluence            |   2 +
 src/site/site.xml                               |   4 +-
 163 files changed, 11516 insertions(+), 601 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/ddf4cb28/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
----------------------------------------------------------------------
diff --cc curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
index 52d2860,abe6cc1..9e79f24
--- 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,41 -333,14 +333,46 @@@ public class TestReconfiguration extend
          }
      }
  
 +    @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());
+         return newClient(cluster.getConnectString());
+     }
+ 
+     private CuratorFramework newClient(String connectionString)
+     {
+         final AtomicReference<String> connectString = new AtomicReference<>(connectionString);
          ensembleProvider = new EnsembleProvider()
          {
              @Override


[3/4] curator git commit: Updated wildcard address check for IPv4 + IPv6

Posted by ra...@apache.org.
Updated wildcard address check for IPv4 + IPv6

Also added several new tests to ensure that both IPv4 and IPv6 addresses work correctly.


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

Branch: refs/heads/master
Commit: bd8fb6609601f399e7d3ffa0a6b60c658686a4d7
Parents: ddf4cb2
Author: Kenco <da...@gmail.com>
Authored: Mon Jul 17 21:19:47 2017 +0100
Committer: Kenco <da...@gmail.com>
Committed: Mon Jul 17 21:19:47 2017 +0100

----------------------------------------------------------------------
 .../curator/framework/imps/EnsembleTracker.java |  5 +--
 .../framework/imps/TestReconfiguration.java     | 46 ++++++++++++++++++--
 2 files changed, 44 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/bd8fb660/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 97d8d8c..7d8fe19 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
@@ -42,8 +42,6 @@ import org.slf4j.LoggerFactory;
 
 import java.io.ByteArrayInputStream;
 import java.io.Closeable;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
@@ -175,9 +173,8 @@ public class EnsembleTracker implements Closeable, CuratorWatcher
             {
                 sb.append(",");
             }
-            InetAddress wildcardAddress = new InetSocketAddress(0).getAddress();
             String hostAddress;
-            if ( wildcardAddress.equals(server.clientAddr.getAddress()) )
+            if ( server.clientAddr.getAddress().isAnyLocalAddress() )
             {
                 hostAddress = server.addr.getAddress().getHostAddress();
             }

http://git-wip-us.apache.org/repos/asf/curator/blob/bd8fb660/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 9e79f24..ef2faed 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
@@ -334,7 +334,7 @@ public class TestReconfiguration extends BaseClassForTests
     }
 
     @Test
-    public void testConfigToConnectionStringNormal() throws Exception
+    public void testConfigToConnectionStringIPv4Normal() 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()));
@@ -342,7 +342,15 @@ public class TestReconfiguration extends BaseClassForTests
     }
 
     @Test
-    public void testConfigToConnectionStringNoClientAddr() throws Exception
+    public void testConfigToConnectionStringIPv6Normal() throws Exception
+    {
+        String config = "server.1=[1010:0001:0002:0003:0004:0005:0006:0007]:2888:3888:participant;[2001:db8:85a3:0:0:8a2e:370:7334]:2181";
+        String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
+        Assert.assertEquals("2001:db8:85a3:0:0:8a2e:370:7334:2181", configString);
+    }
+
+    @Test
+    public void testConfigToConnectionStringIPv4NoClientAddr() throws Exception
     {
         String config = "server.1=10.1.2.3:2888:3888:participant;2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
@@ -350,7 +358,7 @@ public class TestReconfiguration extends BaseClassForTests
     }
 
     @Test
-    public void testConfigToConnectionStringWildcardClientAddr() throws Exception
+    public void testConfigToConnectionStringIPv4WildcardClientAddr() 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()));
@@ -365,6 +373,38 @@ public class TestReconfiguration extends BaseClassForTests
         Assert.assertEquals("", configString);
     }
 
+    @Test
+    public void testIPv6Wildcard1() throws Exception
+    {
+        String config = "server.1=[2001:db8:85a3:0:0:8a2e:370:7334]:2888:3888:participant;[::]:2181";
+        String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
+        Assert.assertEquals("2001:db8:85a3:0:0:8a2e:370:7334:2181", configString);
+    }
+
+    @Test
+    public void testIPv6Wildcard2() throws Exception
+    {
+        String config = "server.1=[1010:0001:0002:0003:0004:0005:0006:0007]:2888:3888:participant;[::0]:2181";
+        String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
+        Assert.assertEquals("1010:1:2:3:4:5:6:7:2181", configString);
+    }
+
+    @Test
+    public void testMixedIPv1() 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 testMixedIPv2() throws Exception
+    {
+        String config = "server.1=[2001:db8:85a3:0:0:8a2e:370:7334]:2888:3888:participant;127.0.0.1:2181";
+        String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
+        Assert.assertEquals("127.0.0.1:2181", configString);
+    }
+
     private CuratorFramework newClient()
     {
         return newClient(cluster.getConnectString());