Author: mahadev
Date: Fri Mar 12 18:26:45 2010
New Revision: 922377

URL: http://svn.apache.org/viewvc?rev=922377&view=rev
Log:
ZOOKEEPER-601. allow configuration of session timeout min/max bounds (phunt via 
mahadev)

Added:
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
Modified:
    hadoop/zookeeper/trunk/CHANGES.txt
    
hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerConfig.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
    
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
    
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsQuorumTest.java
    
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
    
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java

Modified: hadoop/zookeeper/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/CHANGES.txt?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/CHANGES.txt (original)
+++ hadoop/zookeeper/trunk/CHANGES.txt Fri Mar 12 18:26:45 2010
@@ -355,6 +355,9 @@ IMPROVEMENTS:
 
   ZOOKEEPER-692. upgrade junit to latest version (4.8.1) (phunt via mahadev)
 
+  ZOOKEEPER-601. allow configuration of session timeout min/max bounds (phunt
+  via mahadev)
+
 NEW FEATURES:
   ZOOKEEPER-539. generate eclipse project via ant target. (phunt via mahadev)
 

Modified: 
hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
 (original)
+++ 
hadoop/zookeeper/trunk/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml
 Fri Mar 12 18:26:45 2010
@@ -162,7 +162,7 @@
           <para>Create a configuration file. This file can be called anything.
           Use the following settings as a starting point:</para>
 
-          <para><computeroutput>
+          <programlisting>
 tickTime=2000
 dataDir=/var/zookeeper/
 clientPort=2181
@@ -170,7 +170,7 @@ initLimit=5
 syncLimit=2
 server.1=zoo1:2888:3888
 server.2=zoo2:2888:3888
-server.3=zoo3:2888:3888</computeroutput></para>
+server.3=zoo3:2888:3888</programlisting>
 
           <para>You can find the meanings of these and other configuration
           settings in the section <xref linkend="sc_configuration" />. A word
@@ -185,7 +185,9 @@ server.3=zoo3:2888:3888</computeroutput>
           server id to each machine by creating a file named
           <filename>myid</filename>, one for each server, which resides in
           that server's data directory, as specified by the configuration file
-          parameter <emphasis role="bold">dataDir</emphasis>. The myid file
+          parameter <emphasis role="bold">dataDir</emphasis>.</para></listitem>
+
+          <listitem><para>The myid file
           consists of a single line containing only the text of that machine's
           id. So <filename>myid</filename> of server 1 would contain the text
           "1" and nothing else. The id must be unique within the
@@ -738,7 +740,7 @@ server.3=zoo3:2888:3888</computeroutput>
              <term>clientPortBindAddress</term>
 
              <listitem>
-               <para><emphasis role="bold">New in 3.3:</emphasis> the
+               <para><emphasis role="bold">New in 3.3.0:</emphasis> the
                address (ipv4, ipv6 or hostname) to listen for client
                connections; that is, the address that clients attempt
                to connect to. This is optional, by default we bind in
@@ -749,6 +751,29 @@ server.3=zoo3:2888:3888</computeroutput>
              </listitem>
            </varlistentry>
 
+          <varlistentry>
+            <term>minSessionTimeout</term>
+            <listitem>
+              <para>(No Java system property)</para>
+
+              <para><emphasis role="bold">New in 3.3.0:</emphasis> the
+              minimum session timeout in milliseconds that the server
+              will allow the client to negotiate. Defaults to 2 times
+              the <emphasis role="bold">tickTime</emphasis>.</para>
+            </listitem>
+           </varlistentry>
+
+          <varlistentry>
+            <term>maxSessionTimeout</term>
+            <listitem>
+              <para>(No Java system property)</para>
+
+              <para><emphasis role="bold">New in 3.3.0:</emphasis> the
+              maximum session timeout in milliseconds that the server
+              will allow the client to negotiate. Defaults to 20 times
+              the <emphasis role="bold">tickTime</emphasis>.</para>
+            </listitem>
+           </varlistentry>
         </variablelist>
       </section>
 
@@ -1007,13 +1032,24 @@ server.3=zoo3:2888:3888</computeroutput>
 
       <variablelist>
         <varlistentry>
+          <term>conf</term>
+
+          <listitem>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> Print
+            details about serving configuration.</para>
+          </listitem>
+
+        </varlistentry>
+
+        <varlistentry>
           <term>cons</term>
 
           <listitem>
-            <para>List full connection/session details for all clients
-            connected to this server. Includes information on numbers
-            of packets received/sent, session id, operation latencies,
-            last operation performed, etc...</para>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> List
+            full connection/session details for all clients connected
+            to this server. Includes information on numbers of packets
+            received/sent, session id, operation latencies, last
+            operation performed, etc...</para>
           </listitem>
 
         </varlistentry>
@@ -1022,7 +1058,8 @@ server.3=zoo3:2888:3888</computeroutput>
           <term>crst</term>
 
           <listitem>
-            <para>Reset connection/session statistics for all 
connections.</para>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> Reset
+            connection/session statistics for all connections.</para>
           </listitem>
         </varlistentry>
 
@@ -1070,7 +1107,8 @@ server.3=zoo3:2888:3888</computeroutput>
           <term>srvr</term>
 
           <listitem>
-            <para>Lists full details for the server.</para>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
+            full details for the server.</para>
           </listitem>
         </varlistentry>
 
@@ -1087,7 +1125,8 @@ server.3=zoo3:2888:3888</computeroutput>
           <term>wchs</term>
 
           <listitem>
-            <para>Lists brief information on watches for the server.</para>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
+            brief information on watches for the server.</para>
           </listitem>
         </varlistentry>
 
@@ -1095,10 +1134,12 @@ server.3=zoo3:2888:3888</computeroutput>
           <term>wchc</term>
 
           <listitem>
-            <para>Lists detailed information on watches for the server, by 
session.
-            This outputs a list of sessions(connections) with associated 
watches
-            (paths). Note, depending on the number of watches this operation 
may be
-            expensive (ie impact server performance), use it carefully.</para>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
+            detailed information on watches for the server, by
+            session.  This outputs a list of sessions(connections)
+            with associated watches (paths). Note, depending on the
+            number of watches this operation may be expensive (ie
+            impact server performance), use it carefully.</para>
           </listitem>
         </varlistentry>
 
@@ -1106,10 +1147,12 @@ server.3=zoo3:2888:3888</computeroutput>
           <term>wchp</term>
 
           <listitem>
-            <para>Lists detailed information on watches for the server, by 
path.
-            This outputs a list of paths (znodes) with associated sessions. 
Note,
-            depending on the number of watches this operation may be expensive
-            (ie impact server performance), use it carefully.</para>
+            <para><emphasis role="bold">New in 3.3.0:</emphasis> Lists
+            detailed information on watches for the server, by path.
+            This outputs a list of paths (znodes) with associated
+            sessions. Note, depending on the number of watches this
+            operation may be expensive (ie impact server performance),
+            use it carefully.</para>
           </listitem>
         </varlistentry>
       </variablelist>

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
 Fri Mar 12 18:26:45 2010
@@ -115,7 +115,6 @@ public class NIOServerCnxn implements Wa
 
         int maxClientCnxns = 10;
 
-
         /**
          * Construct a new server connection factory which will accept an 
unlimited number
          * of concurrent connections from each client (up to the file 
descriptor
@@ -185,6 +184,10 @@ public class NIOServerCnxn implements Wa
             return ss.socket().getLocalPort();
         }
 
+        public int getMaxClientCnxns() {
+            return maxClientCnxns;
+        }
+
         private void addCnxn(NIOServerCnxn cnxn) {
             synchronized (cnxns) {
                 cnxns.add(cnxn);
@@ -354,6 +357,10 @@ public class NIOServerCnxn implements Wa
 
     final Factory factory;
 
+    /** The ZooKeeperServer for this connection. May be null if the server
+     * is not currently serving requests (for example if the server is not
+     * an active quorum participant.
+     */
     private final ZooKeeperServer zk;
 
     private SocketChannel sock;
@@ -719,11 +726,13 @@ public class NIOServerCnxn implements Wa
         }
         sessionTimeout = connReq.getTimeOut();
         byte passwd[] = connReq.getPasswd();
-        if (sessionTimeout < zk.tickTime * 2) {
-            sessionTimeout = zk.tickTime * 2;
-        }
-        if (sessionTimeout > zk.tickTime * 20) {
-            sessionTimeout = zk.tickTime * 20;
+        int minSessionTimeout = zk.getMinSessionTimeout();
+        if (sessionTimeout < minSessionTimeout) {
+            sessionTimeout = minSessionTimeout;
+        }
+        int maxSessionTimeout = zk.getMaxSessionTimeout();
+        if (sessionTimeout > maxSessionTimeout) {
+            sessionTimeout = maxSessionTimeout;
         }
         // We don't want to receive any packets until we are sure that the
         // session is setup
@@ -762,6 +771,13 @@ public class NIOServerCnxn implements Wa
      * See <a 
href="{...@docroot}/../../../docs/zookeeperAdmin.html#sc_zkCommands">
      * Zk Admin</a>. this link is for all the commands.
      */
+    private final static int confCmd =
+        ByteBuffer.wrap("conf".getBytes()).getInt();
+
+    /*
+     * See <a 
href="{...@docroot}/../../../docs/zookeeperAdmin.html#sc_zkCommands">
+     * Zk Admin</a>. this link is for all the commands.
+     */
     private final static int consCmd =
         ByteBuffer.wrap("cons".getBytes()).getInt();
 
@@ -853,6 +869,7 @@ public class NIOServerCnxn implements Wa
 
     // specify all of the commands that are available
     static {
+        cmd2String.put(confCmd, "conf");
         cmd2String.put(consCmd, "cons");
         cmd2String.put(crstCmd, "crst");
         cmd2String.put(dumpCmd, "dump");
@@ -984,6 +1001,13 @@ public class NIOServerCnxn implements Wa
                     pwriter.println(e.getValue());
                 }
                 return true;
+            } else if (len == confCmd) {
+                if (zk == null) {
+                    pwriter.println(ZK_NOT_SERVING);
+                    return true;
+                }
+                zk.dumpConf(pwriter);
+                return true;
             } else if (len == srstCmd) {
                 if (zk == null) {
                     pwriter.println(ZK_NOT_SERVING);

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerConfig.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerConfig.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerConfig.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerConfig.java
 Fri Mar 12 18:26:45 2010
@@ -31,11 +31,19 @@ import org.apache.zookeeper.server.quoru
  *
  */
 public class ServerConfig {
+    ////
+    //// If you update the configuration parameters be sure
+    //// to update the "conf" 4letter word
+    ////
     protected InetSocketAddress clientPortAddress;
     protected String dataDir;
     protected String dataLogDir;
     protected int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME;
     protected int maxClientCnxns;
+    /** defaults to -1 if not set explicitly */
+    protected int minSessionTimeout = -1;
+    /** defaults to -1 if not set explicitly */
+    protected int maxSessionTimeout = -1;
 
     /**
      * Parse arguments for server configuration
@@ -85,6 +93,8 @@ public class ServerConfig {
       dataLogDir = config.getDataLogDir();
       tickTime = config.getTickTime();
       maxClientCnxns = config.getMaxClientCnxns();
+      minSessionTimeout = config.getMinSessionTimeout();
+      maxSessionTimeout = config.getMaxSessionTimeout();
     }
 
     public InetSocketAddress getClientPortAddress() {
@@ -94,4 +104,8 @@ public class ServerConfig {
     public String getDataLogDir() { return dataLogDir; }
     public int getTickTime() { return tickTime; }
     public int getMaxClientCnxns() { return maxClientCnxns; }
+    /** minimum session timeout in milliseconds, -1 if unset */
+    public int getMinSessionTimeout() { return minSessionTimeout; }
+    /** maximum session timeout in milliseconds, -1 if unset */
+    public int getMaxSessionTimeout() { return maxSessionTimeout; }
 }

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
 Fri Mar 12 18:26:45 2010
@@ -87,6 +87,10 @@ public class ZooKeeperServer implements 
 
     public static final int DEFAULT_TICK_TIME = 3000;
     protected int tickTime = DEFAULT_TICK_TIME;
+    /** value of -1 indicates unset, use default */
+    protected int minSessionTimeout = -1;
+    /** value of -1 indicates unset, use default */
+    protected int maxSessionTimeout = -1;
     protected SessionTracker sessionTracker;
     private FileTxnSnapLog txnLogFactory = null;
     private ConcurrentHashMap<Long, Integer> sessionsWithTimeouts;
@@ -134,15 +138,21 @@ public class ZooKeeperServer implements 
      * @param dataDir the directory to put the data
      * @throws IOException
      */
-    public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime, 
+    public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime,
+            int minSessionTimeout, int maxSessionTimeout,
             DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
         serverStats = new ServerStats(this);
         this.txnLogFactory = txnLogFactory;
         this.zkDb = zkDb;
         this.tickTime = tickTime;
+        this.minSessionTimeout = minSessionTimeout;
+        this.maxSessionTimeout = maxSessionTimeout;
         
-        LOG.info("Created server with tickTime " + tickTime + " datadir " + 
-                txnLogFactory.getDataDir() + " snapdir " + 
txnLogFactory.getSnapDir());
+        LOG.info("Created server with tickTime " + tickTime
+                + " minSessionTimeout " + getMinSessionTimeout()
+                + " maxSessionTimeout " + getMaxSessionTimeout()
+                + " datadir " + txnLogFactory.getDataDir()
+                + " snapdir " + txnLogFactory.getSnapDir());
     }
 
     /**
@@ -154,13 +164,34 @@ public class ZooKeeperServer implements 
      */
     public ZooKeeperServer(FileTxnSnapLog txnLogFactory, int tickTime,
             DataTreeBuilder treeBuilder) throws IOException {
-        this(txnLogFactory, tickTime, treeBuilder, new 
ZKDatabase(txnLogFactory));
+        this(txnLogFactory, tickTime, -1, -1, treeBuilder,
+                new ZKDatabase(txnLogFactory));
     }
     
     public ServerStats serverStats() {
         return serverStats;
     }
-    
+
+    public void dumpConf(PrintWriter pwriter) {
+        pwriter.print("clientPort=");
+        pwriter.println(getClientPort());
+        pwriter.print("dataDir=");
+        pwriter.println(zkDb.snapLog.getSnapDir().getAbsolutePath());
+        pwriter.print("dataLogDir=");
+        pwriter.println(zkDb.snapLog.getDataDir().getAbsolutePath());
+        pwriter.print("tickTime=");
+        pwriter.println(getTickTime());
+        pwriter.print("maxClientCnxns=");
+        pwriter.println(serverCnxnFactory.getMaxClientCnxns());
+        pwriter.print("minSessionTimeout=");
+        pwriter.println(getMinSessionTimeout());
+        pwriter.print("maxSessionTimeout=");
+        pwriter.println(getMaxSessionTimeout());
+
+        pwriter.print("serverId=");
+        pwriter.println(getServerId());
+    }
+
     /**
      * This constructor is for backward compatibility with the existing unit
      * test code.
@@ -169,7 +200,7 @@ public class ZooKeeperServer implements 
     public ZooKeeperServer(File snapDir, File logDir, int tickTime)
             throws IOException {
         this( new FileTxnSnapLog(snapDir, logDir),
-                tickTime,new BasicDataTreeBuilder());
+                tickTime, new BasicDataTreeBuilder());
     }
 
     /**
@@ -177,8 +208,12 @@ public class ZooKeeperServer implements 
      *
      * @throws IOException
      */
-    public ZooKeeperServer(FileTxnSnapLog txnLogFactory,DataTreeBuilder 
treeBuilder) throws IOException {
-        this(txnLogFactory, DEFAULT_TICK_TIME, treeBuilder, new 
ZKDatabase(txnLogFactory));
+    public ZooKeeperServer(FileTxnSnapLog txnLogFactory,
+            DataTreeBuilder treeBuilder)
+        throws IOException
+    {
+        this(txnLogFactory, DEFAULT_TICK_TIME, -1, -1, treeBuilder,
+                new ZKDatabase(txnLogFactory));
     }
 
     /**
@@ -622,9 +657,28 @@ public class ZooKeeperServer implements 
     }
 
     public void setTickTime(int tickTime) {
+        LOG.info("tickTime set to " + tickTime);
         this.tickTime = tickTime;
     }
 
+    public int getMinSessionTimeout() {
+        return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
+    }
+
+    public void setMinSessionTimeout(int min) {
+        LOG.info("minSessionTimeout set to " + min);
+        this.minSessionTimeout = min;
+    }
+
+    public int getMaxSessionTimeout() {
+        return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
+    }
+
+    public void setMaxSessionTimeout(int max) {
+        LOG.info("maxSessionTimeout set to " + max);
+        this.maxSessionTimeout = max;
+    }
+
     public int getClientPort() {
         return serverCnxnFactory != null ? 
serverCnxnFactory.ss.socket().getLocalPort() : -1;
     }

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
 Fri Mar 12 18:26:45 2010
@@ -89,6 +89,35 @@ public class ZooKeeperServerBean impleme
         zks.setTickTime(tickTime);
     }
 
+    public int getMaxClientCnxnsPerHost() {
+        NIOServerCnxn.Factory fac = zks.getServerCnxnFactory();
+        if (fac == null) {
+            return -1;
+        }
+        return fac.getMaxClientCnxns();
+    }
+
+    public void setMaxClientCnxnsPerHost(int max) {
+        // if fac is null the exception will be propagated to the client
+        zks.getServerCnxnFactory().maxClientCnxns = max;
+    }
+
+    public int getMinSessionTimeout() {
+        return zks.getMinSessionTimeout();
+    }
+
+    public void setMinSessionTimeout(int min) {
+        zks.setMinSessionTimeout(min);
+    }
+
+    public int getMaxSessionTimeout() {
+        return zks.getMaxSessionTimeout();
+    }
+
+    public void setMaxSessionTimeout(int max) {
+        zks.setMaxSessionTimeout(max);
+    }
+
     
     public long getPacketsReceived() {
         return zks.serverStats().getPacketsReceived();

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
 Fri Mar 12 18:26:45 2010
@@ -59,14 +59,38 @@ public interface ZooKeeperServerMXBean {
      */
     public long getOutstandingRequests();
     /**
-     * Current TickTime of server
+     * Current TickTime of server in milliseconds
      */
     public int getTickTime();
     /**
-     * Set TickTime of server
+     * Set TickTime of server in milliseconds
      */
     public void setTickTime(int tickTime);
 
+    /** Current maxClientCnxns allowed from a particular host */
+    public int getMaxClientCnxnsPerHost();
+
+    /** Set maxClientCnxns allowed from a particular host */
+    public void setMaxClientCnxnsPerHost(int max);
+
+    /**
+     * Current minSessionTimeout of the server in milliseconds
+     */
+    public int getMinSessionTimeout();
+    /**
+     * Set minSessionTimeout of server in milliseconds
+     */
+    public void setMinSessionTimeout(int min);
+
+    /**
+     * Current maxSessionTimeout of the server in milliseconds
+     */
+    public int getMaxSessionTimeout();
+    /**
+     * Set maxSessionTimeout of server in milliseconds
+     */
+    public void setMaxSessionTimeout(int max);
+
     /**
      * Reset packet and latency statistics 
      */

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMain.java
 Fri Mar 12 18:26:45 2010
@@ -103,8 +103,10 @@ public class ZooKeeperServerMain {
                    File(config.dataLogDir), new File(config.dataDir));
             zkServer.setTxnLogFactory(ftxn);
             zkServer.setTickTime(config.tickTime);
-            cnxnFactory = new NIOServerCnxn.Factory(
-                    config.getClientPortAddress(), config.getMaxClientCnxns());
+            zkServer.setMinSessionTimeout(config.minSessionTimeout);
+            zkServer.setMaxSessionTimeout(config.maxSessionTimeout);
+            cnxnFactory = new 
NIOServerCnxn.Factory(config.getClientPortAddress(),
+                    config.getMaxClientCnxns());
             cnxnFactory.startup(zkServer);
             cnxnFactory.join();
             if (zkServer.isRunning()) {

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java
 Fri Mar 12 18:26:45 2010
@@ -40,7 +40,8 @@ import org.apache.zookeeper.txn.TxnHeade
  * A SyncRequestProcessor is also spawned off to log proposals from the leader.
  */
 public class FollowerZooKeeperServer extends LearnerZooKeeperServer {
-    private static final Logger LOG = 
Logger.getLogger(FollowerZooKeeperServer.class);
+    private static final Logger LOG =
+        Logger.getLogger(FollowerZooKeeperServer.class);
 
     CommitProcessor commitProcessor;
 
@@ -58,8 +59,8 @@ public class FollowerZooKeeperServer ext
      */
     FollowerZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self,
             DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
-        super(logFactory, self.tickTime,treeBuilder, zkDb);
-        this.self = self;        
+        super(logFactory, self.tickTime, self.minSessionTimeout,
+                self.maxSessionTimeout, treeBuilder, zkDb, self);
         this.pendingSyncs = new ConcurrentLinkedQueue<Request>();
     }
 

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
 Fri Mar 12 18:26:45 2010
@@ -29,7 +29,6 @@ import org.apache.zookeeper.server.Reque
 import org.apache.zookeeper.server.ServerCnxn;
 import org.apache.zookeeper.server.SessionTrackerImpl;
 import org.apache.zookeeper.server.ZKDatabase;
-import org.apache.zookeeper.server.ZooKeeperServer;
 import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
 
 /**
@@ -39,9 +38,7 @@ import org.apache.zookeeper.server.persi
  * CommitProcessor -> Leader.ToBeAppliedRequestProcessor ->
  * FinalRequestProcessor
  */
-public class LeaderZooKeeperServer extends ZooKeeperServer {
-    private QuorumPeer self;
-    
+public class LeaderZooKeeperServer extends QuorumZooKeeperServer {
     CommitProcessor commitProcessor;
 
     /**
@@ -49,10 +46,10 @@ public class LeaderZooKeeperServer exten
      * @param dataDir
      * @throws IOException
      */
-    LeaderZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self,
+    LeaderZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self,
             DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
-        super(logFactory, self.tickTime,treeBuilder, zkDb);
-        this.self = self;
+        super(logFactory, self.tickTime, self.minSessionTimeout,
+                self.maxSessionTimeout, treeBuilder, zkDb, self);
     }
 
     public Leader getLeader(){
@@ -155,6 +152,15 @@ public class LeaderZooKeeperServer exten
         return "leader";
     }
 
+    /**
+     * Returns the id of the associated QuorumPeer, which will do for a unique
+     * id of this server. 
+     */
+    @Override
+    public long getServerId() {
+        return self.getId();
+    }    
+    
     @Override
     protected void revalidateSession(ServerCnxn cnxn, long sessionId,
         int sessionTimeout) throws IOException, InterruptedException {

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java
 Fri Mar 12 18:26:45 2010
@@ -22,23 +22,22 @@ import java.util.HashMap;
 
 import org.apache.zookeeper.jmx.MBeanRegistry;
 import org.apache.zookeeper.server.DataTreeBean;
-import org.apache.zookeeper.server.Request;
 import org.apache.zookeeper.server.ServerCnxn;
 import org.apache.zookeeper.server.ZKDatabase;
-import org.apache.zookeeper.server.ZooKeeperServer;
 import org.apache.zookeeper.server.ZooKeeperServerBean;
 import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
 
 /**
  * Parent class for all ZooKeeperServers for Learners 
  */
-public abstract class LearnerZooKeeperServer extends ZooKeeperServer {    
-    
-    protected QuorumPeer self;
-    
+public abstract class LearnerZooKeeperServer extends QuorumZooKeeperServer {   
 
     public LearnerZooKeeperServer(FileTxnSnapLog logFactory, int tickTime,
-            DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
-        super(logFactory,tickTime,treeBuilder, zkDb);
+            int minSessionTimeout, int maxSessionTimeout,
+            DataTreeBuilder treeBuilder, ZKDatabase zkDb, QuorumPeer self)
+        throws IOException
+    {
+        super(logFactory, tickTime, minSessionTimeout, maxSessionTimeout,
+                treeBuilder, zkDb, self);
     }
 
     /**
@@ -65,6 +64,7 @@ public abstract class LearnerZooKeeperSe
      * Returns the id of the associated QuorumPeer, which will do for a unique
      * id of this server. 
      */
+    @Override
     public long getServerId() {
         return self.getId();
     }    

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerBean.java
 Fri Mar 12 18:26:45 2010
@@ -18,6 +18,7 @@
 
 package org.apache.zookeeper.server.quorum;
 
+import org.apache.zookeeper.server.NIOServerCnxn;
 import org.apache.zookeeper.server.quorum.QuorumPeer;
 
 /**
@@ -42,6 +43,22 @@ public class LocalPeerBean extends Serve
         return peer.getTickTime();
     }
     
+    public int getMaxClientCnxnsPerHost() {
+        NIOServerCnxn.Factory fac = peer.getCnxnFactory();
+        if (fac == null) {
+            return -1;
+        }
+        return fac.getMaxClientCnxns();
+    }
+
+    public int getMinSessionTimeout() {
+        return peer.getMinSessionTimeout();
+    }
+    
+    public int getMaxSessionTimeout() {
+        return peer.getMaxSessionTimeout();
+    }
+    
     public int getInitLimit() {
         return peer.getInitLimit();
     }

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LocalPeerMXBean.java
 Fri Mar 12 18:26:45 2010
@@ -31,6 +31,19 @@ public interface LocalPeerMXBean extends
      */
     public int getTickTime();
     
+    /** Current maxClientCnxns allowed from a particular host */
+    public int getMaxClientCnxnsPerHost();
+
+    /**
+     * @return the minimum number of milliseconds allowed for a session timeout
+     */
+    public int getMinSessionTimeout();
+    
+    /**
+     * @return the maximum number of milliseconds allowed for a session timeout
+     */
+    public int getMaxSessionTimeout();
+    
     /**
      * @return the number of ticks that the initial sync phase can take
      */

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java
 Fri Mar 12 18:26:45 2010
@@ -34,7 +34,8 @@ import org.apache.zookeeper.server.persi
  *
  */
 public class ObserverZooKeeperServer extends LearnerZooKeeperServer {
-    private static final Logger LOG = 
Logger.getLogger(ObserverZooKeeperServer.class);        
+    private static final Logger LOG =
+        Logger.getLogger(ObserverZooKeeperServer.class);        
     
     /*
      * Request processors
@@ -50,8 +51,8 @@ public class ObserverZooKeeperServer ext
         
     ObserverZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self,
             DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
-        super(logFactory, self.tickTime, treeBuilder, zkDb);
-        this.self = self;        
+        super(logFactory, self.tickTime, self.minSessionTimeout,
+                self.maxSessionTimeout, treeBuilder, zkDb, self);
     }
     
     public Observer getObserver() {

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
 Fri Mar 12 18:26:45 2010
@@ -202,23 +202,35 @@ public class QuorumPeer extends Thread i
     /**
      * The number of milliseconds of each tick
      */
-    int tickTime;
+    protected int tickTime;
+
+    /**
+     * Minimum number of milliseconds to allow for session timeout.
+     * A value of -1 indicates unset, use default.
+     */
+    protected int minSessionTimeout = -1;
+
+    /**
+     * Maximum number of milliseconds to allow for session timeout.
+     * A value of -1 indicates unset, use default.
+     */
+    protected int maxSessionTimeout = -1;
 
     /**
      * The number of ticks that the initial synchronization phase can take
      */
-    int initLimit;
+    protected int initLimit;
 
     /**
      * The number of ticks that can pass between sending a request and getting
      * an acknowledgment
      */
-    int syncLimit;
+    protected int syncLimit;
 
     /**
      * The current tick
      */
-    int tick;
+    protected int tick;
 
     /**
      * This class simply responds to requests for the current leader of this
@@ -788,9 +800,32 @@ public class QuorumPeer extends Thread i
      * Set the number of milliseconds of each tick
      */
     public void setTickTime(int tickTime) {
+        LOG.info("tickTime set to " + tickTime);
         this.tickTime = tickTime;
     }
 
+    /** minimum session timeout in milliseconds */
+    public int getMinSessionTimeout() {
+        return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
+    }
+
+    /** minimum session timeout in milliseconds */
+    public void setMinSessionTimeout(int min) {
+        LOG.info("minSessionTimeout set to " + min);
+        this.minSessionTimeout = min;
+    }
+
+    /** maximum session timeout in milliseconds */
+    public int getMaxSessionTimeout() {
+        return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
+    }
+
+    /** minimum session timeout in milliseconds */
+    public void setMaxSessionTimeout(int max) {
+        LOG.info("maxSessionTimeout set to " + max);
+        this.maxSessionTimeout = max;
+    }
+
     /**
      * Get the number of ticks that the initial synchronization phase can take
      */
@@ -802,6 +837,7 @@ public class QuorumPeer extends Thread i
      * Set the number of ticks that the initial synchronization phase can take
      */
     public void setInitLimit(int initLimit) {
+        LOG.info("initLimit set to " + initLimit);
         this.initLimit = initLimit;
     }
 

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerConfig.java
 Fri Mar 12 18:26:45 2010
@@ -33,11 +33,11 @@ import java.util.Map.Entry;
 
 import org.apache.log4j.Logger;
 import org.apache.zookeeper.server.ZooKeeperServer;
-import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer;
 import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType;
-import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
-import org.apache.zookeeper.server.quorum.flexible.QuorumMaj;
+import org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer;
 import org.apache.zookeeper.server.quorum.flexible.QuorumHierarchical;
+import org.apache.zookeeper.server.quorum.flexible.QuorumMaj;
+import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
 
 public class QuorumPeerConfig {
     private static final Logger LOG = Logger.getLogger(QuorumPeerConfig.class);
@@ -46,12 +46,16 @@ public class QuorumPeerConfig {
     protected String dataDir;
     protected String dataLogDir;
     protected int tickTime = ZooKeeperServer.DEFAULT_TICK_TIME;
+    protected int maxClientCnxns = 10;
+    /** defaults to -1 if not set explicitly */
+    protected int minSessionTimeout = -1;
+    /** defaults to -1 if not set explicitly */
+    protected int maxSessionTimeout = -1;
 
     protected int initLimit;
     protected int syncLimit;
     protected int electionAlg = 3;
     protected int electionPort = 2182;
-    protected int maxClientCnxns = 10;
     protected final HashMap<Long,QuorumServer> servers =
         new HashMap<Long, QuorumServer>();
     protected final HashMap<Long,QuorumServer> observers =
@@ -130,14 +134,18 @@ public class QuorumPeerConfig {
                 clientPortAddress = value.trim();
             } else if (key.equals("tickTime")) {
                 tickTime = Integer.parseInt(value);
+            } else if (key.equals("maxClientCnxns")) {
+                maxClientCnxns = Integer.parseInt(value);
+            } else if (key.equals("minSessionTimeout")) {
+                minSessionTimeout = Integer.parseInt(value);
+            } else if (key.equals("maxSessionTimeout")) {
+                maxSessionTimeout = Integer.parseInt(value);
             } else if (key.equals("initLimit")) {
                 initLimit = Integer.parseInt(value);
             } else if (key.equals("syncLimit")) {
                 syncLimit = Integer.parseInt(value);
             } else if (key.equals("electionAlg")) {
                 electionAlg = Integer.parseInt(value);
-            } else if (key.equals("maxClientCnxns")) {
-                maxClientCnxns = Integer.parseInt(value);
             } else if (key.equals("peerType")) {
                 if (value.toLowerCase().equals("observer")) {
                     peerType = LearnerType.OBSERVER;
@@ -229,6 +237,10 @@ public class QuorumPeerConfig {
         if (tickTime == 0) {
             throw new IllegalArgumentException("tickTime is not set");
         }
+        if (minSessionTimeout > maxSessionTimeout) {
+            throw new IllegalArgumentException(
+                    "minSessionTimeout must not be larger than 
maxSessionTimeout");
+        }
         if (servers.size() > 1) {
             if (initLimit == 0) {
                 throw new IllegalArgumentException("initLimit is not set");
@@ -305,14 +317,16 @@ public class QuorumPeerConfig {
     public String getDataDir() { return dataDir; }
     public String getDataLogDir() { return dataLogDir; }
     public int getTickTime() { return tickTime; }
+    public int getMaxClientCnxns() { return maxClientCnxns; }
+    public int getMinSessionTimeout() { return minSessionTimeout; }
+    public int getMaxSessionTimeout() { return maxSessionTimeout; }
 
     public int getInitLimit() { return initLimit; }
     public int getSyncLimit() { return syncLimit; }
     public int getElectionAlg() { return electionAlg; }
-    public int getElectionPort() { return electionPort; }
-    public int getMaxClientCnxns() { return maxClientCnxns; }
-
-    public QuorumVerifier getQuorumVerifier() {
+    public int getElectionPort() { return electionPort; }    
+    
+    public QuorumVerifier getQuorumVerifier() {   
         return quorumVerifier;
     }
 

Modified: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
 Fri Mar 12 18:26:45 2010
@@ -131,6 +131,8 @@ public class QuorumPeerMain {
           quorumPeer.setElectionType(config.getElectionAlg());
           quorumPeer.setMyid(config.getServerId());
           quorumPeer.setTickTime(config.getTickTime());
+          quorumPeer.setMinSessionTimeout(config.getMinSessionTimeout());
+          quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout());
           quorumPeer.setInitLimit(config.getInitLimit());
           quorumPeer.setSyncLimit(config.getSyncLimit());
           quorumPeer.setQuorumVerifier(config.getQuorumVerifier());

Added: 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java?rev=922377&view=auto
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
 (added)
+++ 
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
 Fri Mar 12 18:26:45 2010
@@ -0,0 +1,62 @@
+/**
+ * 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 java.io.IOException;
+import java.io.PrintWriter;
+
+import org.apache.zookeeper.server.ZKDatabase;
+import org.apache.zookeeper.server.ZooKeeperServer;
+import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
+
+/**
+ * Abstract base class for all ZooKeeperServers that participate in
+ * a quorum.
+ */
+public abstract class QuorumZooKeeperServer extends ZooKeeperServer {
+    protected final QuorumPeer self;
+
+    protected QuorumZooKeeperServer(FileTxnSnapLog logFactory, int tickTime,
+            int minSessionTimeout, int maxSessionTimeout,
+            DataTreeBuilder treeBuilder, ZKDatabase zkDb, QuorumPeer self)
+        throws IOException
+    {
+        super(logFactory, tickTime, minSessionTimeout, maxSessionTimeout,
+                treeBuilder, zkDb);
+        this.self = self;
+    }
+
+    @Override
+    public void dumpConf(PrintWriter pwriter) {
+        super.dumpConf(pwriter);
+
+        pwriter.print("initLimit=");
+        pwriter.println(self.getInitLimit());
+        pwriter.print("syncLimit=");
+        pwriter.println(self.getSyncLimit());
+        pwriter.print("electionAlg=");
+        pwriter.println(self.getElectionType());
+        pwriter.print("electionPort=");
+        pwriter.println(self.quorumPeers.get(self.getId()).electionAddr
+                .getPort());
+        pwriter.print("quorumPort=");
+        pwriter.println(self.quorumPeers.get(self.getId()).addr.getPort());
+        pwriter.print("peerType=");
+        pwriter.println(self.getPeerType().ordinal());
+    }
+}

Modified: 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsQuorumTest.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsQuorumTest.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsQuorumTest.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsQuorumTest.java
 Fri Mar 12 18:26:45 2010
@@ -29,14 +29,14 @@ public class FourLetterWordsQuorumTest e
     protected static final Logger LOG =
         Logger.getLogger(FourLetterWordsQuorumTest.class);
 
-    /** Test the various four letter words
-     * ruok,envi,stat,srvr,cons,dump,srst,crst */
+    /** Test the various four letter words */
     @Test
     public void testFourLetterWords() throws Exception {
         String servers[] = hostPort.split(",");
         for (String hp : servers) {
             verify(hp, "ruok", "imok");
             verify(hp, "envi", "java.version");
+            verify(hp, "conf", "clientPort");
             verify(hp, "stat", "Outstanding");
             verify(hp, "srvr", "Outstanding");
             verify(hp, "cons", "queued");
@@ -74,6 +74,7 @@ public class FourLetterWordsQuorumTest e
 
             verify(hp, "ruok", "imok");
             verify(hp, "envi", "java.version");
+            verify(hp, "conf", "clientPort");
             verify(hp, "stat", "Outstanding");
             verify(hp, "srvr", "Outstanding");
             verify(hp, "cons", "queued");

Modified: 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
 (original)
+++ 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
 Fri Mar 12 18:26:45 2010
@@ -28,12 +28,12 @@ public class FourLetterWordsTest extends
     protected static final Logger LOG =
         Logger.getLogger(FourLetterWordsTest.class);
 
-    /** Test the various four letter words
-     * ruok,envi,stat,srvr,cons,dump,srst,crst */
+    /** Test the various four letter words */
     @Test
     public void testFourLetterWords() throws Exception {
         verify("ruok", "imok");
         verify("envi", "java.version");
+        verify("conf", "clientPort");
         verify("stat", "Outstanding");
         verify("srvr", "Outstanding");
         verify("cons", "queued");
@@ -71,6 +71,7 @@ public class FourLetterWordsTest extends
 
         verify("ruok", "imok");
         verify("envi", "java.version");
+        verify("conf", "clientPort");
         verify("stat", "Outstanding");
         verify("srvr", "Outstanding");
         verify("cons", "queued");

Modified: 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java?rev=922377&r1=922376&r2=922377&view=diff
==============================================================================
--- 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java 
(original)
+++ 
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java 
Fri Mar 12 18:26:45 2010
@@ -333,4 +333,36 @@ public class SessionTest extends TestCas
         }
     }
 
+    @Test
+    public void testMinMaxSessionTimeout() throws Exception {
+        // override the defaults
+        final int MINSESS = 20000;
+        final int MAXSESS = 240000;
+        ZooKeeperServer zs = serverFactory.getZooKeeperServer();
+        zs.setMinSessionTimeout(MINSESS);
+        zs.setMaxSessionTimeout(MAXSESS);
+
+        // validate typical case - requested == negotiated
+        int timeout = 120000;
+        DisconnectableZooKeeper zk = createClient(timeout);
+        assertEquals(timeout, zk.getSessionTimeout());
+        // make sure tostring works in both cases
+        LOG.info(zk.toString());
+        zk.close();
+        LOG.info(zk.toString());
+
+        // validate lower limit
+        zk = createClient(MINSESS/2);
+        assertEquals(MINSESS, zk.getSessionTimeout());
+        LOG.info(zk.toString());
+        zk.close();
+        LOG.info(zk.toString());
+
+        // validate upper limit
+        zk = createClient(MAXSESS * 2);
+        assertEquals(MAXSESS, zk.getSessionTimeout());
+        LOG.info(zk.toString());
+        zk.close();
+        LOG.info(zk.toString());
+    }
 }


Reply via email to