From a2bb8e084801391eec63cf3f1e91b79a5189ce48 Mon Sep 17 00:00:00 2001 From: Yisong Yue Date: Mon, 10 Sep 2018 18:16:38 -0700 Subject: [PATCH] ZOOKEEPER-2847: Cannot bind to client port when reconfig based on old static config --- .../server/quorum/QuorumPeerConfig.java | 1 + .../server/quorum/QuorumPeerConfigTest.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java b/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java index ab7b9f6e73b..96de17a86d5 100644 --- a/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java +++ b/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java @@ -698,6 +698,7 @@ private void setupClientPort() throws ConfigException { " is different from client address found in dynamic file: " + qs.clientAddr); } if (qs != null && qs.clientAddr != null) clientPortAddress = qs.clientAddr; + if (qs != null && qs.clientAddr == null) qs.clientAddr = clientPortAddress; } private void setupPeerType() { diff --git a/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerConfigTest.java b/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerConfigTest.java index 3f5a2b21c64..524fceed1d1 100644 --- a/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerConfigTest.java +++ b/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerConfigTest.java @@ -24,10 +24,12 @@ import java.io.File; import java.io.IOException; +import java.net.InetSocketAddress; import java.util.Properties; import org.apache.zookeeper.common.ZKConfig; import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException; +import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer; import org.junit.Test; public class QuorumPeerConfigTest { @@ -114,6 +116,37 @@ public void testSamePortConfiguredForClientAndElection() throws IOException, Con quorumPeerConfig.parseProperties(zkProp); } + /** + * Extend the existing QuorumPeerConfig to set the server id. + */ + public static class MockQuorumPeerConfig extends QuorumPeerConfig { + public MockQuorumPeerConfig(long serverId) { + this.serverId = serverId; + } + } + + /** + * Test case for https://issues.apache.org/jira/browse/ZOOKEEPER-2847 + */ + @Test + public void testClientAddrFromClientPort() + throws IOException, ConfigException { + long serverId = 1; + QuorumPeerConfig quorumPeerConfig = new MockQuorumPeerConfig(serverId); + Properties zkProp = getDefaultZKProperties(); + int clientPort = 12345; + zkProp.setProperty("clientPort", Integer.toString(clientPort)); + zkProp.setProperty("server.1", "127.0.0.1:2889:3889:participant"); + quorumPeerConfig.parseProperties(zkProp); + + QuorumServer qs = + quorumPeerConfig.getQuorumVerifier().getAllMembers().get(serverId); + InetSocketAddress expectedAddress = + new InetSocketAddress("0.0.0.0", clientPort); + assertEquals(expectedAddress, quorumPeerConfig.getClientPortAddress()); + assertEquals(quorumPeerConfig.getClientPortAddress(), qs.clientAddr); + } + private Properties getDefaultZKProperties() { Properties zkProp = new Properties(); zkProp.setProperty("dataDir", new File("myDataDir").getAbsolutePath());