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();