You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by mi...@apache.org on 2014/03/25 22:13:19 UTC
svn commit: r1581522 - in /zookeeper/trunk: ./
src/java/main/org/apache/zookeeper/server/
src/java/main/org/apache/zookeeper/server/quorum/
src/java/test/org/apache/zookeeper/server/
src/java/test/org/apache/zookeeper/server/quorum/
Author: michim
Date: Tue Mar 25 21:13:19 2014
New Revision: 1581522
URL: http://svn.apache.org/r1581522
Log:
ZOOKEEPER-1263. fix handling of min/max session timeout value initialization (Rakesh R via michim)
Modified:
zookeeper/trunk/CHANGES.txt
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
zookeeper/trunk/src/java/test/org/apache/zookeeper/server/ZooKeeperServerMainTest.java
zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTestBase.java
Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Tue Mar 25 21:13:19 2014
@@ -582,6 +582,9 @@ BUGFIXES:
ZOOKEEPER-1901. [JDK8] Sort children for comparison in AsyncOps tests
(Andrew Purtell via michim)
+ ZOOKEEPER-1263. fix handling of min/max session timeout value initialization
+ (Rakesh R via michim)
+
IMPROVEMENTS:
ZOOKEEPER-1170. Fix compiler (eclipse) warnings: unused imports,
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java Tue Mar 25 21:13:19 2014
@@ -143,8 +143,8 @@ public class ZooKeeperServer implements
this.txnLogFactory = txnLogFactory;
this.zkDb = zkDb;
this.tickTime = tickTime;
- this.minSessionTimeout = minSessionTimeout;
- this.maxSessionTimeout = maxSessionTimeout;
+ setMinSessionTimeout(minSessionTimeout);
+ setMaxSessionTimeout(maxSessionTimeout);
LOG.info("Created server with tickTime " + tickTime
+ " minSessionTimeout " + getMinSessionTimeout()
@@ -758,21 +758,21 @@ public class ZooKeeperServer implements
}
public int getMinSessionTimeout() {
- return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
+ return minSessionTimeout;
}
public void setMinSessionTimeout(int min) {
- LOG.info("minSessionTimeout set to " + min);
- this.minSessionTimeout = min;
+ this.minSessionTimeout = min == -1 ? tickTime * 2 : min;
+ LOG.info("minSessionTimeout set to {}", this.minSessionTimeout);
}
public int getMaxSessionTimeout() {
- return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
+ return maxSessionTimeout;
}
public void setMaxSessionTimeout(int max) {
- LOG.info("maxSessionTimeout set to " + max);
- this.maxSessionTimeout = max;
+ this.maxSessionTimeout = max == -1 ? tickTime * 20 : max;
+ LOG.info("maxSessionTimeout set to {}", this.maxSessionTimeout);
}
public int getClientPort() {
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java Tue Mar 25 21:13:19 2014
@@ -1184,7 +1184,7 @@ public class QuorumPeer extends ZooKeepe
/** minimum session timeout in milliseconds */
public int getMinSessionTimeout() {
- return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
+ return minSessionTimeout;
}
/** minimum session timeout in milliseconds */
@@ -1195,7 +1195,7 @@ public class QuorumPeer extends ZooKeepe
/** maximum session timeout in milliseconds */
public int getMaxSessionTimeout() {
- return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
+ return maxSessionTimeout;
}
/** maximum session timeout in milliseconds */
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java Tue Mar 25 21:13:19 2014
@@ -280,6 +280,10 @@ public class QuorumPeerConfig {
if (tickTime == 0) {
throw new IllegalArgumentException("tickTime is not set");
}
+
+ minSessionTimeout = minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
+ maxSessionTimeout = maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
+
if (minSessionTimeout > maxSessionTimeout) {
throw new IllegalArgumentException(
"minSessionTimeout must not be larger than maxSessionTimeout");
Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/server/ZooKeeperServerMainTest.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/ZooKeeperServerMainTest.java?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/server/ZooKeeperServerMainTest.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/server/ZooKeeperServerMainTest.java Tue Mar 25 21:13:19 2014
@@ -23,16 +23,22 @@ import static org.apache.zookeeper.test.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.PortAssignment;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZKTestCase;
import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
+import org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException;
import org.apache.zookeeper.test.ClientBase;
import org.junit.Assert;
import org.junit.Test;
@@ -45,12 +51,15 @@ public class ZooKeeperServerMainTest ext
protected static final Logger LOG =
LoggerFactory.getLogger(ZooKeeperServerMainTest.class);
+ private CountDownLatch clientConnected = new CountDownLatch(1);
+
public static class MainThread extends Thread {
final File confFile;
final TestZKSMain main;
final File tmpDir;
- public MainThread(int clientPort, boolean preCreateDirs) throws IOException {
+ public MainThread(int clientPort, boolean preCreateDirs, String configs)
+ throws IOException {
super("Standalone server with clientPort:" + clientPort);
tmpDir = ClientBase.createTmpDir();
confFile = new File(tmpDir, "zoo.cfg");
@@ -59,6 +68,9 @@ public class ZooKeeperServerMainTest ext
fwriter.write("tickTime=2000\n");
fwriter.write("initLimit=10\n");
fwriter.write("syncLimit=5\n");
+ if(configs != null){
+ fwriter.write(configs);
+ }
File dataDir = new File(tmpDir, "data");
String dir = dataDir.toString();
@@ -130,9 +142,9 @@ public class ZooKeeperServerMainTest ext
public void testStandalone() throws Exception {
ClientBase.setupTestEnv();
- final int CLIENT_PORT = 3181;
+ final int CLIENT_PORT = PortAssignment.unique();
- MainThread main = new MainThread(CLIENT_PORT, true);
+ MainThread main = new MainThread(CLIENT_PORT, true, null);
main.start();
Assert.assertTrue("waiting for server being up",
@@ -165,9 +177,9 @@ public class ZooKeeperServerMainTest ext
public void testWithoutAutoCreateDataLogDir() throws Exception {
ClientBase.setupTestEnv();
System.setProperty(FileTxnSnapLog.ZOOKEEPER_DATADIR_AUTOCREATE, "false");
- final int CLIENT_PORT = 3181;
+ final int CLIENT_PORT = PortAssignment.unique();
- MainThread main = new MainThread(CLIENT_PORT, false);
+ MainThread main = new MainThread(CLIENT_PORT, false, null);
String args[] = new String[1];
args[0] = main.confFile.toString();
main.start();
@@ -185,9 +197,9 @@ public class ZooKeeperServerMainTest ext
public void testWithAutoCreateDataLogDir() throws Exception {
ClientBase.setupTestEnv();
System.setProperty(FileTxnSnapLog.ZOOKEEPER_DATADIR_AUTOCREATE, "true");
- final int CLIENT_PORT = 3181;
+ final int CLIENT_PORT = PortAssignment.unique();
- MainThread main = new MainThread(CLIENT_PORT, false);
+ MainThread main = new MainThread(CLIENT_PORT, false, null);
String args[] = new String[1];
args[0] = main.confFile.toString();
main.start();
@@ -214,7 +226,114 @@ public class ZooKeeperServerMainTest ext
ClientBase.CONNECTION_TIMEOUT));
}
+ /**
+ * Test verifies that the server shouldn't allow minsessiontimeout >
+ * maxsessiontimeout
+ */
+ @Test
+ public void testWithMinSessionTimeoutGreaterThanMaxSessionTimeout()
+ throws Exception {
+ ClientBase.setupTestEnv();
+
+ final int CLIENT_PORT = PortAssignment.unique();
+ final int tickTime = 2000;
+ final int minSessionTimeout = 20 * tickTime + 1000; // min is higher
+ final int maxSessionTimeout = tickTime * 2 - 100; // max is lower
+ final String configs = "maxSessionTimeout=" + maxSessionTimeout + "\n"
+ + "minSessionTimeout=" + minSessionTimeout + "\n";
+ MainThread main = new MainThread(CLIENT_PORT, false, configs);
+ String args[] = new String[1];
+ args[0] = main.confFile.toString();
+ try {
+ main.main.initializeAndRun(args);
+ Assert.fail("Must throw exception as "
+ + "minsessiontimeout > maxsessiontimeout");
+ } catch (ConfigException iae) {
+ // expected
+ }
+ }
+
+ /**
+ * Test verifies that the server is able to redefine if user configured only
+ * minSessionTimeout limit
+ */
+ @Test
+ public void testWithOnlyMinSessionTimeout() throws Exception {
+ ClientBase.setupTestEnv();
+
+ final int CLIENT_PORT = PortAssignment.unique();
+ final int tickTime = 2000;
+ final int minSessionTimeout = tickTime * 2 - 100;
+ int maxSessionTimeout = 20 * tickTime;
+ final String configs = "minSessionTimeout=" + minSessionTimeout + "\n";
+ MainThread main = new MainThread(CLIENT_PORT, false, configs);
+ main.start();
+
+ String HOSTPORT = "127.0.0.1:" + CLIENT_PORT;
+ Assert.assertTrue("waiting for server being up",
+ ClientBase.waitForServerUp(HOSTPORT, CONNECTION_TIMEOUT));
+ // create session with min value
+ verifySessionTimeOut(minSessionTimeout, minSessionTimeout, HOSTPORT);
+ verifySessionTimeOut(minSessionTimeout - 2000, minSessionTimeout,
+ HOSTPORT);
+ // create session with max value
+ verifySessionTimeOut(maxSessionTimeout, maxSessionTimeout, HOSTPORT);
+ verifySessionTimeOut(maxSessionTimeout + 2000, maxSessionTimeout,
+ HOSTPORT);
+ main.shutdown();
+ Assert.assertTrue("waiting for server down", ClientBase
+ .waitForServerDown(HOSTPORT, ClientBase.CONNECTION_TIMEOUT));
+ }
+
+ /**
+ * Test verifies that the server is able to redefine the min/max session
+ * timeouts
+ */
+ @Test
+ public void testMinMaxSessionTimeOut() throws Exception {
+ ClientBase.setupTestEnv();
+
+ final int CLIENT_PORT = PortAssignment.unique();
+ final int tickTime = 2000;
+ final int minSessionTimeout = tickTime * 2 - 100;
+ final int maxSessionTimeout = 20 * tickTime + 1000;
+ final String configs = "maxSessionTimeout=" + maxSessionTimeout + "\n"
+ + "minSessionTimeout=" + minSessionTimeout + "\n";
+ MainThread main = new MainThread(CLIENT_PORT, false, configs);
+ main.start();
+
+ String HOSTPORT = "127.0.0.1:" + CLIENT_PORT;
+ Assert.assertTrue("waiting for server being up",
+ ClientBase.waitForServerUp(HOSTPORT, CONNECTION_TIMEOUT));
+ // create session with min value
+ verifySessionTimeOut(minSessionTimeout, minSessionTimeout, HOSTPORT);
+ verifySessionTimeOut(minSessionTimeout - 2000, minSessionTimeout,
+ HOSTPORT);
+ // create session with max value
+ verifySessionTimeOut(maxSessionTimeout, maxSessionTimeout, HOSTPORT);
+ verifySessionTimeOut(maxSessionTimeout + 2000, maxSessionTimeout,
+ HOSTPORT);
+ main.shutdown();
+
+ Assert.assertTrue("waiting for server down", ClientBase
+ .waitForServerDown(HOSTPORT, ClientBase.CONNECTION_TIMEOUT));
+ }
+
+ private void verifySessionTimeOut(int sessionTimeout,
+ int expectedSessionTimeout, String HOSTPORT) throws IOException,
+ KeeperException, InterruptedException {
+ clientConnected = new CountDownLatch(1);
+ ZooKeeper zk = new ZooKeeper(HOSTPORT, sessionTimeout, this);
+ Assert.assertTrue("Failed to establish zkclient connection!",
+ clientConnected.await(sessionTimeout, TimeUnit.MILLISECONDS));
+ Assert.assertEquals("Not able to configure the sessionTimeout values",
+ expectedSessionTimeout, zk.getSessionTimeout());
+ zk.close();
+ }
+
public void process(WatchedEvent event) {
- // ignore for this test
+ if (event.getState() == KeeperState.SyncConnected) {
+ clientConnected.countDown();
+ }
}
}
Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java Tue Mar 25 21:13:19 2014
@@ -79,6 +79,15 @@ public class QuorumPeerMainTest extends
Assert.assertTrue("waiting for server 2 being up",
ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2,
CONNECTION_TIMEOUT));
+ QuorumPeer quorumPeer = q1.main.quorumPeer;
+
+ int tickTime = quorumPeer.getTickTime();
+ Assert.assertEquals(
+ "Default value of minimumSessionTimeOut is not considered",
+ tickTime * 2, quorumPeer.getMinSessionTimeout());
+ Assert.assertEquals(
+ "Default value of maximumSessionTimeOut is not considered",
+ tickTime * 20, quorumPeer.getMaxSessionTimeout());
ZooKeeper zk = new ZooKeeper("127.0.0.1:" + CLIENT_PORT_QP1,
ClientBase.CONNECTION_TIMEOUT, this);
@@ -671,4 +680,90 @@ public class QuorumPeerMainTest extends
" to shutdown, expected " + maxwait);
}
}
+
+ /**
+ * Test verifies that the server is able to redefine the min/max session
+ * timeouts
+ */
+ @Test
+ public void testMinMaxSessionTimeOut() throws Exception {
+ ClientBase.setupTestEnv();
+
+ final int CLIENT_PORT_QP1 = PortAssignment.unique();
+ final int CLIENT_PORT_QP2 = PortAssignment.unique();
+
+ String quorumCfgSection = "server.1=127.0.0.1:"
+ + PortAssignment.unique() + ":" + PortAssignment.unique()
+ + "\nserver.2=127.0.0.1:" + PortAssignment.unique() + ":"
+ + PortAssignment.unique();
+
+ final int minSessionTimeOut = 10000;
+ final int maxSessionTimeOut = 15000;
+ final String configs = "maxSessionTimeout=" + maxSessionTimeOut + "\n"
+ + "minSessionTimeout=" + minSessionTimeOut + "\n";
+
+ MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSection,
+ configs);
+ MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSection,
+ configs);
+ q1.start();
+ q2.start();
+
+ Assert.assertTrue("waiting for server 1 being up", ClientBase
+ .waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1,
+ CONNECTION_TIMEOUT));
+ Assert.assertTrue("waiting for server 2 being up", ClientBase
+ .waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2,
+ CONNECTION_TIMEOUT));
+
+ QuorumPeer quorumPeer = q1.main.quorumPeer;
+
+ Assert.assertEquals("minimumSessionTimeOut is not considered",
+ minSessionTimeOut, quorumPeer.getMinSessionTimeout());
+ Assert.assertEquals("maximumSessionTimeOut is not considered",
+ maxSessionTimeOut, quorumPeer.getMaxSessionTimeout());
+ }
+
+ /**
+ * Test verifies that the server is able to redefine if user configured only
+ * minSessionTimeout limit
+ */
+ @Test
+ public void testWithOnlyMinSessionTimeout() throws Exception {
+ ClientBase.setupTestEnv();
+
+ final int CLIENT_PORT_QP1 = PortAssignment.unique();
+ final int CLIENT_PORT_QP2 = PortAssignment.unique();
+
+ String quorumCfgSection = "server.1=127.0.0.1:"
+ + PortAssignment.unique() + ":" + PortAssignment.unique()
+ + "\nserver.2=127.0.0.1:" + PortAssignment.unique() + ":"
+ + PortAssignment.unique();
+
+ final int minSessionTimeOut = 15000;
+ final String configs = "minSessionTimeout=" + minSessionTimeOut + "\n";
+
+ MainThread q1 = new MainThread(1, CLIENT_PORT_QP1, quorumCfgSection,
+ configs);
+ MainThread q2 = new MainThread(2, CLIENT_PORT_QP2, quorumCfgSection,
+ configs);
+ q1.start();
+ q2.start();
+
+ Assert.assertTrue("waiting for server 1 being up", ClientBase
+ .waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP1,
+ CONNECTION_TIMEOUT));
+ Assert.assertTrue("waiting for server 2 being up", ClientBase
+ .waitForServerUp("127.0.0.1:" + CLIENT_PORT_QP2,
+ CONNECTION_TIMEOUT));
+
+ QuorumPeer quorumPeer = q1.main.quorumPeer;
+ final int maxSessionTimeOut = quorumPeer.tickTime * 20;
+
+ Assert.assertEquals("minimumSessionTimeOut is not considered",
+ minSessionTimeOut, quorumPeer.getMinSessionTimeout());
+ Assert.assertEquals("maximumSessionTimeOut is wrong",
+ maxSessionTimeOut, quorumPeer.getMaxSessionTimeout());
+ }
+
}
Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTestBase.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTestBase.java?rev=1581522&r1=1581521&r2=1581522&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTestBase.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerTestBase.java Tue Mar 25 21:13:19 2014
@@ -78,6 +78,12 @@ public class QuorumPeerTestBase extends
public MainThread(int myid, int clientPort, String quorumCfgSection)
throws IOException {
+ this(myid, clientPort, quorumCfgSection, null);
+ }
+
+ public MainThread(int myid, int clientPort, String quorumCfgSection,
+ String configs)
+ throws IOException {
tmpDir = ClientBase.createTmpDir();
LOG.info("id = " + myid + " tmpDir = " + tmpDir + " clientPort = "
+ clientPort);
@@ -94,6 +100,9 @@ public class QuorumPeerTestBase extends
fwriter.write("tickTime=4000\n");
fwriter.write("initLimit=10\n");
fwriter.write("syncLimit=5\n");
+ if(configs != null){
+ fwriter.write(configs);
+ }
// Convert windows path to UNIX to avoid problems with "\"
String dir = dataDir.toString();