You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ha...@apache.org on 2018/09/22 04:43:49 UTC

zookeeper git commit: ZOOKEEPER-2847: Cannot bind to client port when reconfig based on old static config

Repository: zookeeper
Updated Branches:
  refs/heads/master f4cbb689a -> e116d32b6


ZOOKEEPER-2847: Cannot bind to client port when reconfig based on old static config

Fixed the issue where clientPortAddress in the static config is not correctly saved in QuorumVerifier. This can cause zookeeper attempting to re-bind to a port already in use during dynamic reconfiguration, failing to recognize that the new port and the current port are identical.

Author: Yisong Yue <yi...@fb.com>

Reviewers: hanm@apache.org

Closes #620 from yisong-yue/ZOOKEEPER-2847


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

Branch: refs/heads/master
Commit: e116d32b63039fe9f0677f0af76c0a77fe74c82b
Parents: f4cbb68
Author: Yisong Yue <yi...@fb.com>
Authored: Fri Sep 21 21:43:45 2018 -0700
Committer: Michael Han <ha...@apache.org>
Committed: Fri Sep 21 21:43:45 2018 -0700

----------------------------------------------------------------------
 .../server/quorum/QuorumPeerConfig.java         |  1 +
 .../server/quorum/QuorumPeerConfigTest.java     | 33 ++++++++++++++++++++
 2 files changed, 34 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/e116d32b/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
----------------------------------------------------------------------
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 19558cf..6aaf172 100644
--- a/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
+++ b/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
@@ -712,6 +712,7 @@ public class QuorumPeerConfig {
                         " 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() {

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/e116d32b/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerConfigTest.java
----------------------------------------------------------------------
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 3f5a2b2..524fcee 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 static org.junit.Assert.fail;
 
 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 class QuorumPeerConfigTest {
         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());