Author: rgs
Date: Mon Dec 7 05:00:45 2015
New Revision: 1718252
URL: http://svn.apache.org/viewvc?rev=1718252&view=rev
Log:
ZOOKEEPER-2301: QuorumPeer does not listen on passed client IP in the
constructor
(Arshad Mohammad via rgs)
Added:
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTest.java
Modified:
zookeeper/branches/branch-3.5/CHANGES.txt
zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/TruncateTest.java
Modified: zookeeper/branches/branch-3.5/CHANGES.txt
URL:
http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/CHANGES.txt?rev=1718252&r1=1718251&r2=1718252&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/CHANGES.txt (original)
+++ zookeeper/branches/branch-3.5/CHANGES.txt Mon Dec 7 05:00:45 2015
@@ -77,6 +77,9 @@ BUGFIXES:
ZOOKEEPER-2304: JMX ClientPort from ZooKeeperServerBean incorrect
(Arshad Mohammad via rgs)
+ ZOOKEEPER-2301: QuorumPeer does not listen on passed client IP in the
constructor
+ (Arshad Mohammad via rgs)
+
IMPROVEMENTS:
ZOOKEEPER-2270: Allow MBeanRegistry to be overridden for better unit tests
Modified:
zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL:
http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=1718252&r1=1718251&r2=1718252&view=diff
==============================================================================
---
zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
(original)
+++
zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
Mon Dec 7 05:00:45 2015
@@ -858,9 +858,8 @@ public class QuorumPeer extends ZooKeepe
long myid, int tickTime, int initLimit, int syncLimit)
throws IOException
{
- this(quorumPeers, snapDir, logDir, electionAlg,
- myid,tickTime, initLimit,syncLimit, false,
- ServerCnxnFactory.createFactory(new
InetSocketAddress(clientPort), -1),
+ this(quorumPeers, snapDir, logDir, electionAlg, myid, tickTime,
initLimit, syncLimit, false,
+ ServerCnxnFactory.createFactory(getClientAddress(quorumPeers,
myid, clientPort), -1),
new QuorumMaj(quorumPeers));
}
@@ -876,10 +875,26 @@ public class QuorumPeer extends ZooKeepe
{
this(quorumPeers, snapDir, logDir, electionAlg,
myid,tickTime, initLimit,syncLimit, false,
- ServerCnxnFactory.createFactory(new
InetSocketAddress(clientPort), -1),
+ ServerCnxnFactory.createFactory(getClientAddress(quorumPeers,
myid, clientPort), -1),
quorumConfig);
}
+ private static InetSocketAddress getClientAddress(Map<Long, QuorumServer>
quorumPeers, long myid, int clientPort)
+ throws IOException {
+ QuorumServer quorumServer = quorumPeers.get(myid);
+ if (null == quorumServer) {
+ throw new IOException("No QuorumServer correspoding to myid " +
myid);
+ }
+ if (null == quorumServer.clientAddr) {
+ return new InetSocketAddress(clientPort);
+ }
+ if (quorumServer.clientAddr.getPort() != clientPort) {
+ throw new IOException("QuorumServer port " +
quorumServer.clientAddr.getPort()
+ + " does not match with given port " + clientPort);
+ }
+ return quorumServer.clientAddr;
+ }
+
/**
* returns the highest zxid that this host has seen
*
Added:
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTest.java
URL:
http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTest.java?rev=1718252&view=auto
==============================================================================
---
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTest.java
(added)
+++
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTest.java
Mon Dec 7 05:00:45 2015
@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zookeeper.server.quorum;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.zookeeper.PortAssignment;
+import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType;
+import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer;
+import org.apache.zookeeper.test.ClientBase;
+import org.junit.Test;
+
+public class QuorumPeerTest {
+
+ private int electionAlg = 3;
+ private int tickTime = 2000;
+ private int initLimit = 3;
+ private int syncLimit = 3;
+
+ /**
+ * Test case for https://issues.apache.org/jira/browse/ZOOKEEPER-2301
+ */
+ @Test
+ public void testQuorumPeerListendOnSpecifiedClientIP() throws IOException {
+ long myId = 1;
+ File dataDir = ClientBase.createTmpDir();
+ int clientPort = PortAssignment.unique();
+ String clientIP = "127.0.0.2";
+ Map<Long, QuorumServer> peersView = new HashMap<Long, QuorumServer>();
+
+ peersView.put(Long.valueOf(myId),
+ new QuorumServer(myId, new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
+ new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
+ new InetSocketAddress(clientIP, clientPort),
LearnerType.PARTICIPANT));
+
+ /**
+ * QuorumPeer constructor without QuorumVerifier
+ */
+ QuorumPeer peer1 = new QuorumPeer(peersView, dataDir, dataDir,
clientPort, electionAlg, myId, tickTime,
+ initLimit, syncLimit);
+ String hostString1 =
peer1.cnxnFactory.getLocalAddress().getHostString();
+ assertEquals(clientIP, hostString1);
+
+ // cleanup
+ peer1.shutdown();
+
+ /**
+ * QuorumPeer constructor with QuorumVerifier
+ */
+ peersView.clear();
+ clientPort = PortAssignment.unique();
+ clientIP = "127.0.0.3";
+ peersView.put(Long.valueOf(myId),
+ new QuorumServer(myId, new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
+ new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
+ new InetSocketAddress(clientIP, clientPort),
LearnerType.PARTICIPANT));
+ QuorumPeer peer2 = new QuorumPeer(peersView, dataDir, dataDir,
clientPort, electionAlg, myId, tickTime,
+ initLimit, syncLimit);
+ String hostString2 =
peer2.cnxnFactory.getLocalAddress().getHostString();
+ assertEquals(clientIP, hostString2);
+ // cleanup
+ peer2.shutdown();
+ }
+
+}
Modified:
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/TruncateTest.java
URL:
http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/TruncateTest.java?rev=1718252&r1=1718251&r2=1718252&view=diff
==============================================================================
---
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/TruncateTest.java
(original)
+++
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/TruncateTest.java
Mon Dec 7 05:00:45 2015
@@ -200,15 +200,15 @@ public class TruncateTest extends ZKTest
peers.put(Long.valueOf(1), new QuorumServer(1,
new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
- new InetSocketAddress("127.0.0.1",
PortAssignment.unique())));
+ new InetSocketAddress("127.0.0.1", port1)));
peers.put(Long.valueOf(2), new QuorumServer(2,
new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
- new InetSocketAddress("127.0.0.1",
PortAssignment.unique())));
+ new InetSocketAddress("127.0.0.1", port2)));
peers.put(Long.valueOf(3), new QuorumServer(3,
new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
new InetSocketAddress("127.0.0.1",
PortAssignment.unique()),
- new InetSocketAddress("127.0.0.1",
PortAssignment.unique())));
+ new InetSocketAddress("127.0.0.1", port3)));
QuorumPeer s2 = new QuorumPeer(peers, dataDir2, dataDir2, port2, 0, 2,
tickTime, initLimit, syncLimit);
s2.start();