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 2015/03/08 23:09:17 UTC

svn commit: r1665090 - in /zookeeper/branches/branch-3.5: ./ 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/ src/j...

Author: michim
Date: Sun Mar  8 22:09:17 2015
New Revision: 1665090

URL: http://svn.apache.org/r1665090
Log:
ZOOKEEPER-1907 Improve Thread handling (Rakesh R via michim)

Added:
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ExitCode.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServerListener.java
Modified:
    zookeeper/branches/branch-3.5/CHANGES.txt
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperCriticalThread.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderSessionTracker.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LocalSessionTracker.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java
    zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/UpgradeableSessionTracker.java
    zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/ZooKeeperThreadTest.java
    zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorConcurrencyTest.java
    zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorTest.java
    zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/ClientBase.java
    zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/SessionTrackerCheckTest.java

Modified: zookeeper/branches/branch-3.5/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/CHANGES.txt?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/CHANGES.txt (original)
+++ zookeeper/branches/branch-3.5/CHANGES.txt Sun Mar  8 22:09:17 2015
@@ -61,6 +61,8 @@ IMPROVEMENTS:
 
   ZOOKEEPER-2110 Typo fixes in the ZK documentation. (Jeffrey Schroeder via rakeshr)
 
+  ZOOKEEPER-1907 Improve Thread handling (Rakesh R via michim)
+
 Release 3.5.0 - 8/4/2014
 
 NEW FEATURES:

Added: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ExitCode.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ExitCode.java?rev=1665090&view=auto
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ExitCode.java (added)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ExitCode.java Sun Mar  8 22:09:17 2015
@@ -0,0 +1,27 @@
+/**
+ * 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;
+
+/**
+ * Exit code used to exit server
+ */
+public class ExitCode {
+
+    /* Represents unexpected error */
+    public final static int UNEXPECTED_ERROR = 1;
+}

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java Sun Mar  8 22:09:17 2015
@@ -112,9 +112,10 @@ public class PrepRequestProcessor extend
 
     ZooKeeperServer zks;
 
-    public PrepRequestProcessor(ZooKeeperServer zks, RequestProcessor nextProcessor) {
-        super("ProcessThread(sid:" + zks.getServerId()
-                + " cport:" + zks.getClientPort() + "):");
+    public PrepRequestProcessor(ZooKeeperServer zks,
+            RequestProcessor nextProcessor) {
+        super("ProcessThread(sid:" + zks.getServerId() + " cport:"
+                + zks.getClientPort() + "):", zks.getZooKeeperServerListener());
         this.nextProcessor = nextProcessor;
         this.zks = zks;
     }
@@ -143,15 +144,13 @@ public class PrepRequestProcessor extend
                 }
                 pRequest(request);
             }
-        } catch (InterruptedException e) {
-            LOG.error("Unexpected interruption", e);
         } catch (RequestProcessorException e) {
             if (e.getCause() instanceof XidRolloverException) {
                 LOG.info(e.getCause().getMessage());
             }
-            LOG.error("Unexpected exception", e);
+            handleException(this.getName(), e);
         } catch (Exception e) {
-            LOG.error("Unexpected exception", e);
+            handleException(this.getName(), e);
         }
         LOG.info("PrepRequestProcessor exited loop!");
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java Sun Mar  8 22:09:17 2015
@@ -91,9 +91,9 @@ public class SessionTrackerImpl extends
 
     public SessionTrackerImpl(SessionExpirer expirer,
             ConcurrentMap<Long, Integer> sessionsWithTimeout, int tickTime,
-            long serverId)
+            long serverId, ZooKeeperServerListener listener)
     {
-        super("SessionTracker");
+        super("SessionTracker", listener);
         this.expirer = expirer;
         this.sessionExpiryQueue = new ExpiryQueue<SessionImpl>(tickTime);
         this.sessionsWithTimeout = sessionsWithTimeout;
@@ -153,7 +153,7 @@ public class SessionTrackerImpl extends
                 }
             }
         } catch (InterruptedException e) {
-            LOG.error("Unexpected interruption", e);
+            handleException(this.getName(), e);
         }
         LOG.info("SessionTrackerImpl exited loop!");
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/SyncRequestProcessor.java Sun Mar  8 22:09:17 2015
@@ -70,9 +70,9 @@ public class SyncRequestProcessor extend
     private final Request requestOfDeath = Request.requestOfDeath;
 
     public SyncRequestProcessor(ZooKeeperServer zks,
-            RequestProcessor nextProcessor)
-    {
-        super("SyncThread:" + zks.getServerId());
+            RequestProcessor nextProcessor) {
+        super("SyncThread:" + zks.getServerId(), zks
+                .getZooKeeperServerListener());
         this.zks = zks;
         this.nextProcessor = nextProcessor;
         running = true;
@@ -162,7 +162,7 @@ public class SyncRequestProcessor extend
                 }
             }
         } catch (Throwable t) {
-            super.handleException(this.getName(), t);
+            handleException(this.getName(), t);
         } finally{
             running = false;
         }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperCriticalThread.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperCriticalThread.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperCriticalThread.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperCriticalThread.java Sun Mar  8 22:09:17 2015
@@ -27,24 +27,25 @@ import org.slf4j.LoggerFactory;
 public class ZooKeeperCriticalThread extends ZooKeeperThread {
     private static final Logger LOG = LoggerFactory
             .getLogger(ZooKeeperCriticalThread.class);
-    private static final int DEFAULT_EXIT_CODE = 1;
+    private final ZooKeeperServerListener listener;
 
-    public ZooKeeperCriticalThread(String threadName) {
+    public ZooKeeperCriticalThread(String threadName, ZooKeeperServerListener listener) {
         super(threadName);
+        this.listener = listener;
     }
 
     /**
      * This will be used by the uncaught exception handler and make the system
      * exit.
-     * 
-     * @param thName
+     *
+     * @param threadName
      *            - thread name
      * @param e
      *            - exception object
      */
     @Override
-    protected void handleException(String thName, Throwable e) {
-        LOG.error("Severe unrecoverable error, from thread : {}", thName, e);
-        System.exit(DEFAULT_EXIT_CODE);
+    protected void handleException(String threadName, Throwable e) {
+        LOG.error("Severe unrecoverable error, from thread : {}", threadName, e);
+        listener.notifyStopping(threadName, ExitCode.UNEXPECTED_ERROR);
     }
 }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java Sun Mar  8 22:09:17 2015
@@ -27,7 +27,6 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -41,7 +40,6 @@ import javax.security.sasl.SaslException
 import org.apache.jute.BinaryInputArchive;
 import org.apache.jute.BinaryOutputArchive;
 import org.apache.jute.Record;
-import org.apache.zookeeper.common.Time;
 import org.apache.zookeeper.Environment;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.KeeperException.Code;
@@ -102,7 +100,11 @@ public class ZooKeeperServer implements
     private final AtomicLong hzxid = new AtomicLong(0);
     public final static Exception ok = new Exception("No prob");
     protected RequestProcessor firstProcessor;
-    protected volatile boolean running;
+    protected volatile State state = State.INITIAL;
+
+    enum State {
+        INITIAL, RUNNING, SHUTDOWN;
+    }
 
     /**
      * This is the secret that we use to generate passwords, for the moment it
@@ -119,7 +121,7 @@ public class ZooKeeperServer implements
     private ServerCnxnFactory serverCnxnFactory;
 
     private final ServerStats serverStats;
-
+    private final ZooKeeperServerListener listener = new ZooKeeperServerListenerImpl();
     void removeCnxn(ServerCnxn cnxn) {
         zkDb.removeCnxn(cnxn);
     }
@@ -399,7 +401,7 @@ public class ZooKeeperServer implements
         }
     }
 
-    public void startup() {
+    public synchronized void startup() {
         if (sessionTracker == null) {
             createSessionTracker();
         }
@@ -408,10 +410,8 @@ public class ZooKeeperServer implements
 
         registerJMX();
 
-        synchronized (this) {
-            running = true;
-            notifyAll();
-        }
+        state = State.RUNNING;
+        notifyAll();
     }
 
     protected void setupRequestProcessors() {
@@ -423,9 +423,27 @@ public class ZooKeeperServer implements
         ((PrepRequestProcessor)firstProcessor).start();
     }
 
+    public ZooKeeperServerListener getZooKeeperServerListener() {
+        return listener;
+    }
+
+    /**
+     * Default listener implementation, which will do a graceful shutdown on
+     * notification
+     */
+    private class ZooKeeperServerListenerImpl implements
+            ZooKeeperServerListener {
+
+        @Override
+        public void notifyStopping(String threadName, int exitCode) {
+            LOG.info("Thread {} exits, error code {}", threadName, exitCode);
+            shutdown();
+        }
+    }
+
     protected void createSessionTracker() {
         sessionTracker = new SessionTrackerImpl(this, zkDb.getSessionWithTimeOuts(),
-                tickTime, 1);
+                tickTime, 1, getZooKeeperServerListener());
     }
 
     protected void startSessionTracker() {
@@ -433,14 +451,18 @@ public class ZooKeeperServer implements
     }
 
     public boolean isRunning() {
-        return running;
+        return state == State.RUNNING;
     }
 
-    public void shutdown() {
+    public synchronized void shutdown() {
+        if (!isRunning()) {
+            LOG.debug("ZooKeeper server is not running, so not proceeding to shutdown!");
+            return;
+        }
         LOG.info("shutting down");
 
         // new RuntimeException("Calling shutdown").printStackTrace();
-        this.running = false;
+        state = State.SHUTDOWN;
         // Since sessionTracker and syncThreads poll we just have to
         // set running to false and they will detect it during the poll
         // interval.
@@ -657,13 +679,17 @@ public class ZooKeeperServer implements
         if (firstProcessor == null) {
             synchronized (this) {
                 try {
-                    while (!running) {
+                    // Since all requests are passed to the request
+                    // processor it should wait for setting up the request
+                    // processor chain. The state will be updated to RUNNING
+                    // after the setup.
+                    while (state == State.INITIAL) {
                         wait(1000);
                     }
                 } catch (InterruptedException e) {
                     LOG.warn("Unexpected interruption", e);
                 }
-                if (firstProcessor == null) {
+                if (firstProcessor == null || state != State.RUNNING) {
                     throw new RuntimeException("Not started");
                 }
             }

Added: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServerListener.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServerListener.java?rev=1665090&view=auto
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServerListener.java (added)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/ZooKeeperServerListener.java Sun Mar  8 22:09:17 2015
@@ -0,0 +1,35 @@
+/**
+ * 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;
+
+/**
+ * Listener for the critical resource events.
+ */
+public interface ZooKeeperServerListener {
+
+    /**
+     * This will notify the server that some critical thread has stopped.
+     * It usually takes place when fatal error occurred.
+     *
+     * @param threadName
+     *            - name of the thread
+     * @param errorCode
+     *            - error code
+     */
+    void notifyStopping(String threadName, int errorCode);
+}

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/CommitProcessor.java Sun Mar  8 22:09:17 2015
@@ -29,6 +29,7 @@ import org.apache.zookeeper.server.Reque
 import org.apache.zookeeper.server.RequestProcessor;
 import org.apache.zookeeper.server.WorkerService;
 import org.apache.zookeeper.server.ZooKeeperCriticalThread;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 
 /**
  * This RequestProcessor matches the incoming committed requests with the
@@ -110,8 +111,8 @@ public class CommitProcessor extends Zoo
     boolean matchSyncs;
 
     public CommitProcessor(RequestProcessor nextProcessor, String id,
-                           boolean matchSyncs) {
-        super("CommitProcessor:" + id);
+                           boolean matchSyncs, ZooKeeperServerListener listener) {
+        super("CommitProcessor:" + id, listener);
         this.nextProcessor = nextProcessor;
         this.matchSyncs = matchSyncs;
     }
@@ -184,10 +185,8 @@ public class CommitProcessor extends Zoo
                  */
                 processCommitted();
             }
-        } catch (InterruptedException e) {
-            LOG.warn("Interrupted exception while waiting", e);
         } catch (Throwable e) {
-            LOG.error("Unexpected exception causing CommitProcessor to exit", e);
+            handleException(this.getName(), e);
         }
         LOG.info("CommitProcessor exited loop!");
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerRequestProcessor.java Sun Mar  8 22:09:17 2015
@@ -49,7 +49,8 @@ public class FollowerRequestProcessor ex
 
     public FollowerRequestProcessor(FollowerZooKeeperServer zks,
             RequestProcessor nextProcessor) {
-        super("FollowerRequestProcessor:" + zks.getServerId());
+        super("FollowerRequestProcessor:" + zks.getServerId(), zks
+                .getZooKeeperServerListener());
         this.zks = zks;
         this.nextProcessor = nextProcessor;
     }
@@ -101,7 +102,7 @@ public class FollowerRequestProcessor ex
                 }
             }
         } catch (Exception e) {
-            LOG.error("Unexpected exception causing exit", e);
+            handleException(this.getName(), e);
         }
         LOG.info("FollowerRequestProcessor exited loop!");
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/FollowerZooKeeperServer.java Sun Mar  8 22:09:17 2015
@@ -69,7 +69,7 @@ public class FollowerZooKeeperServer ext
     protected void setupRequestProcessors() {
         RequestProcessor finalProcessor = new FinalRequestProcessor(this);
         commitProcessor = new CommitProcessor(finalProcessor,
-                Long.toString(getServerId()), true);
+                Long.toString(getServerId()), true, getZooKeeperServerListener());
         commitProcessor.start();
         firstProcessor = new FollowerRequestProcessor(this, commitProcessor);
         ((FollowerRequestProcessor) firstProcessor).start();

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderSessionTracker.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderSessionTracker.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderSessionTracker.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderSessionTracker.java Sun Mar  8 22:09:17 2015
@@ -27,6 +27,7 @@ import org.apache.zookeeper.KeeperExcept
 import org.apache.zookeeper.KeeperException.SessionMovedException;
 import org.apache.zookeeper.KeeperException.UnknownSessionException;
 import org.apache.zookeeper.server.SessionTrackerImpl;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,14 +47,15 @@ public class LeaderSessionTracker extend
 
     public LeaderSessionTracker(SessionExpirer expirer,
             ConcurrentMap<Long, Integer> sessionsWithTimeouts,
-            int tickTime, long id, boolean localSessionsEnabled) {
+            int tickTime, long id, boolean localSessionsEnabled,
+            ZooKeeperServerListener listener) {
 
         this.globalSessionTracker = new SessionTrackerImpl(
-            expirer, sessionsWithTimeouts, tickTime, id);
+            expirer, sessionsWithTimeouts, tickTime, id, listener);
 
         this.localSessionsEnabled = localSessionsEnabled;
         if (this.localSessionsEnabled) {
-            createLocalSessionTracker(expirer, tickTime, id);
+            createLocalSessionTracker(expirer, tickTime, id, listener);
         }
         serverId = id;
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java Sun Mar  8 22:09:17 2015
@@ -62,7 +62,8 @@ public class LeaderZooKeeperServer exten
         RequestProcessor finalProcessor = new FinalRequestProcessor(this);
         RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(finalProcessor, getLeader());
         commitProcessor = new CommitProcessor(toBeAppliedProcessor,
-                Long.toString(getServerId()), false);
+                Long.toString(getServerId()), false,
+                getZooKeeperServerListener());
         commitProcessor.start();
         ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,
                 commitProcessor);
@@ -82,7 +83,8 @@ public class LeaderZooKeeperServer exten
     public void createSessionTracker() {
         sessionTracker = new LeaderSessionTracker(
                 this, getZKDatabase().getSessionWithTimeOuts(),
-                tickTime, self.getId(), self.areLocalSessionsEnabled());
+                tickTime, self.getId(), self.areLocalSessionsEnabled(), 
+                getZooKeeperServerListener());
     }
 
     public boolean touch(long sess, int to) {

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerSessionTracker.java Sun Mar  8 22:09:17 2015
@@ -32,6 +32,7 @@ import org.apache.zookeeper.KeeperExcept
 import org.apache.zookeeper.KeeperException.SessionMovedException;
 import org.apache.zookeeper.KeeperException.UnknownSessionException;
 import org.apache.zookeeper.server.SessionTrackerImpl;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,7 +63,8 @@ public class LearnerSessionTracker exten
 
     public LearnerSessionTracker(SessionExpirer expirer,
             ConcurrentMap<Long, Integer> sessionsWithTimeouts,
-            int tickTime, long id, boolean localSessionsEnabled) {
+            int tickTime, long id, boolean localSessionsEnabled,
+            ZooKeeperServerListener listener) {
         this.expirer = expirer;
         this.touchTable.set(new ConcurrentHashMap<Long, Integer>());
         this.globalSessionsWithTimeouts = sessionsWithTimeouts;
@@ -71,7 +73,7 @@ public class LearnerSessionTracker exten
 
         this.localSessionsEnabled = localSessionsEnabled;
         if (this.localSessionsEnabled) {
-            createLocalSessionTracker(expirer, tickTime, id);
+            createLocalSessionTracker(expirer, tickTime, id, listener);
         }
     }
 

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LearnerZooKeeperServer.java Sun Mar  8 22:09:17 2015
@@ -22,7 +22,6 @@ import java.util.Collections;
 import java.util.Map;
 
 import org.apache.zookeeper.jmx.MBeanRegistry;
-import org.apache.zookeeper.KeeperException.SessionExpiredException;
 import org.apache.zookeeper.server.DataTreeBean;
 import org.apache.zookeeper.server.quorum.LearnerSessionTracker;
 import org.apache.zookeeper.server.ServerCnxn;
@@ -84,7 +83,8 @@ public abstract class LearnerZooKeeperSe
     public void createSessionTracker() {
         sessionTracker = new LearnerSessionTracker(
                 this, getZKDatabase().getSessionWithTimeOuts(),
-                this.tickTime, self.getId(), self.areLocalSessionsEnabled());
+                this.tickTime, self.getId(), self.areLocalSessionsEnabled(),
+                getZooKeeperServerListener());
     }
 
     @Override
@@ -157,7 +157,11 @@ public abstract class LearnerZooKeeperSe
     }
 
     @Override
-    public void shutdown() {
+    public synchronized void shutdown() {
+        if (!isRunning()) {
+            LOG.debug("ZooKeeper server is not running, so not proceeding to shutdown!");
+            return;
+        }
         LOG.info("Shutting down");
         try {
             super.shutdown();

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LocalSessionTracker.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LocalSessionTracker.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LocalSessionTracker.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/LocalSessionTracker.java Sun Mar  8 22:09:17 2015
@@ -20,6 +20,7 @@ package org.apache.zookeeper.server.quor
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.zookeeper.server.SessionTrackerImpl;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 
 /**
  * Local session tracker.
@@ -27,8 +28,8 @@ import org.apache.zookeeper.server.Sessi
 public class LocalSessionTracker extends SessionTrackerImpl {
     public LocalSessionTracker(SessionExpirer expirer,
             ConcurrentMap<Long, Integer> sessionsWithTimeouts,
-            int tickTime, long id) {
-        super(expirer, sessionsWithTimeouts, tickTime, id);
+            int tickTime, long id, ZooKeeperServerListener listener) {
+        super(expirer, sessionsWithTimeouts, tickTime, id, listener);
     }
 
     public boolean isLocalSession(long sessionId) {

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverRequestProcessor.java Sun Mar  8 22:09:17 2015
@@ -58,7 +58,8 @@ public class ObserverRequestProcessor ex
      */
     public ObserverRequestProcessor(ObserverZooKeeperServer zks,
             RequestProcessor nextProcessor) {
-        super("ObserverRequestProcessor:" + zks.getServerId());
+        super("ObserverRequestProcessor:" + zks.getServerId(), zks
+                .getZooKeeperServerListener());
         this.zks = zks;
         this.nextProcessor = nextProcessor;
     }
@@ -110,7 +111,7 @@ public class ObserverRequestProcessor ex
                 }
             }
         } catch (Exception e) {
-            LOG.error("Unexpected exception causing exit", e);
+            handleException(this.getName(), e);
         }
         LOG.info("ObserverRequestProcessor exited loop!");
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ObserverZooKeeperServer.java Sun Mar  8 22:09:17 2015
@@ -92,7 +92,8 @@ public class ObserverZooKeeperServer ext
         // Currently, they behave almost exactly the same as followers.
         RequestProcessor finalProcessor = new FinalRequestProcessor(this);
         commitProcessor = new CommitProcessor(finalProcessor,
-                Long.toString(getServerId()), true);
+                Long.toString(getServerId()), true,
+                getZooKeeperServerListener());
         commitProcessor.start();
         firstProcessor = new ObserverRequestProcessor(this, commitProcessor);
         ((ObserverRequestProcessor) firstProcessor).start();
@@ -130,7 +131,11 @@ public class ObserverZooKeeperServer ext
     };    
 
     @Override
-    public void shutdown() {
+    public synchronized void shutdown() {
+        if (!isRunning()) {
+            LOG.debug("ZooKeeper server is not running, so not proceeding to shutdown!");
+            return;
+        }
         super.shutdown();
         if (syncRequestProcessorEnabled && syncProcessor != null) {
             syncProcessor.shutdown();

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyRequestProcessor.java Sun Mar  8 22:09:17 2015
@@ -52,8 +52,10 @@ public class ReadOnlyRequestProcessor ex
 
     private final ZooKeeperServer zks;
 
-    public ReadOnlyRequestProcessor(ZooKeeperServer zks, RequestProcessor nextProcessor) {
-        super("ReadOnlyRequestProcessor:" + zks.getServerId());
+    public ReadOnlyRequestProcessor(ZooKeeperServer zks,
+            RequestProcessor nextProcessor) {
+        super("ReadOnlyRequestProcessor:" + zks.getServerId(), zks
+                .getZooKeeperServerListener());
         this.zks = zks;
         this.nextProcessor = nextProcessor;
     }
@@ -101,15 +103,13 @@ public class ReadOnlyRequestProcessor ex
                     nextProcessor.processRequest(request);
                 }
             }
-        } catch (InterruptedException e) {
-            LOG.error("Unexpected interruption", e);
         } catch (RequestProcessorException e) {
             if (e.getCause() instanceof XidRolloverException) {
                 LOG.info(e.getCause().getMessage());
             }
-            LOG.error("Unexpected exception", e);
+            handleException(this.getName(), e);
         } catch (Exception e) {
-            LOG.error("Unexpected exception", e);
+            handleException(this.getName(), e);
         }
         LOG.info("ReadOnlyRequestProcessor exited loop!");
     }

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java Sun Mar  8 22:09:17 2015
@@ -137,6 +137,10 @@ public class ReadOnlyZooKeeperServer ext
 
     @Override
     public synchronized void shutdown() {
+        if (!isRunning()) {
+            LOG.debug("ZooKeeper server is not running, so not proceeding to shutdown!");
+            return;
+        }
         shutdown = true;
         unregisterJMX(this);
 

Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/UpgradeableSessionTracker.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/UpgradeableSessionTracker.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/UpgradeableSessionTracker.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/server/quorum/UpgradeableSessionTracker.java Sun Mar  8 22:09:17 2015
@@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentMa
 
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.server.SessionTracker;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,11 +38,11 @@ public abstract class UpgradeableSession
     public void start() {}
 
     public void createLocalSessionTracker(SessionExpirer expirer,
-            int tickTime, long id) {
+            int tickTime, long id, ZooKeeperServerListener listener) {
         this.localSessionsWithTimeouts =
             new ConcurrentHashMap<Long, Integer>();
         this.localSessionTracker = new LocalSessionTracker(
-            expirer, this.localSessionsWithTimeouts, tickTime, id);
+            expirer, this.localSessionsWithTimeouts, tickTime, id, listener);
     }
 
     public boolean isTrackingSession(long sessionId) {

Modified: zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/ZooKeeperThreadTest.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/ZooKeeperThreadTest.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/ZooKeeperThreadTest.java (original)
+++ zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/ZooKeeperThreadTest.java Sun Mar  8 22:09:17 2015
@@ -46,7 +46,13 @@ public class ZooKeeperThreadTest {
     public class MyCriticalThread extends ZooKeeperCriticalThread {
 
         public MyCriticalThread(String threadName) {
-            super(threadName);
+            super(threadName, new ZooKeeperServerListener() {
+
+                @Override
+                public void notifyStopping(String threadName, int erroCode) {
+
+                }
+            });
         }
 
         public void run() {

Modified: zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorConcurrencyTest.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorConcurrencyTest.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorConcurrencyTest.java (original)
+++ zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorConcurrencyTest.java Sun Mar  8 22:09:17 2015
@@ -33,6 +33,7 @@ import org.apache.zookeeper.server.Reque
 import org.apache.zookeeper.server.RequestProcessor;
 import org.apache.zookeeper.server.WorkerService;
 import org.apache.zookeeper.server.RequestProcessor.RequestProcessorException;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -69,7 +70,12 @@ public class CommitProcessorConcurrencyT
                       public void shutdown(){}
           },
           "0",
-          false);
+          false, new ZooKeeperServerListener(){
+
+              @Override
+              public void notifyStopping(String errMsg, int exitCode) {
+
+              }});
         }
 
         public void testStart() {

Modified: zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorTest.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorTest.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorTest.java (original)
+++ zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/server/quorum/CommitProcessorTest.java Sun Mar  8 22:09:17 2015
@@ -232,7 +232,8 @@ public class CommitProcessorTest {
             // processor, so it can do pre/post validating of requests
             ValidateProcessor validateProcessor =
                 new ValidateProcessor(finalProcessor);
-            commitProcessor = new CommitProcessor(validateProcessor, "1", true);
+            commitProcessor = new CommitProcessor(validateProcessor, "1", true,
+                    getZooKeeperServerListener());
             validateProcessor.setCommitProcessor(commitProcessor);
             commitProcessor.start();
             MockProposalRequestProcessor proposalProcessor =

Modified: zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/ClientBase.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/ClientBase.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/ClientBase.java (original)
+++ zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/ClientBase.java Sun Mar  8 22:09:17 2015
@@ -56,6 +56,7 @@ import org.apache.zookeeper.server.Serve
 import org.apache.zookeeper.server.ServerCnxnFactoryAccessor;
 import org.apache.zookeeper.server.ZKDatabase;
 import org.apache.zookeeper.server.ZooKeeperServer;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 import org.apache.zookeeper.server.persistence.FileTxnLog;
 import org.apache.zookeeper.server.quorum.QuorumPeer;
 import org.apache.zookeeper.server.util.OSMXBean;
@@ -663,4 +664,14 @@ public abstract class ClientBase extends
         }
         return sb.toString();
     }
+
+    public ZooKeeperServerListener testZKSListener() {
+        return new ZooKeeperServerListener() {
+
+            @Override
+            public void notifyStopping(String errMsg, int exitCode) {
+
+            }
+        };
+    }
 }

Modified: zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/SessionTrackerCheckTest.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/SessionTrackerCheckTest.java?rev=1665090&r1=1665089&r2=1665090&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/SessionTrackerCheckTest.java (original)
+++ zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/SessionTrackerCheckTest.java Sun Mar  8 22:09:17 2015
@@ -24,6 +24,7 @@ import org.apache.zookeeper.KeeperExcept
 import org.apache.zookeeper.ZKTestCase;
 import org.apache.zookeeper.server.SessionTracker.Session;
 import org.apache.zookeeper.server.SessionTracker.SessionExpirer;
+import org.apache.zookeeper.server.ZooKeeperServerListener;
 import org.apache.zookeeper.server.quorum.LeaderSessionTracker;
 import org.apache.zookeeper.server.quorum.LearnerSessionTracker;
 import org.junit.After;
@@ -76,7 +77,8 @@ public class SessionTrackerCheckTest ext
         Expirer expirer = new Expirer(1);
         // With local session on
         LearnerSessionTracker tracker = new LearnerSessionTracker(expirer,
-                sessionsWithTimeouts, TICK_TIME, expirer.sid, true);
+                sessionsWithTimeouts, TICK_TIME, expirer.sid, true,
+                testZKSListener());
 
         // Unknown session
         long sessionId = 0xb100ded;
@@ -114,7 +116,7 @@ public class SessionTrackerCheckTest ext
 
         // With local session off
         tracker = new LearnerSessionTracker(expirer, sessionsWithTimeouts,
-                TICK_TIME, expirer.sid, false);
+                TICK_TIME, expirer.sid, false, testZKSListener());
 
         // Should be noop
         sessionId = 0xdeadbeef;
@@ -131,7 +133,8 @@ public class SessionTrackerCheckTest ext
         Expirer expirer = new Expirer(2);
         // With local session on
         LeaderSessionTracker tracker = new LeaderSessionTracker(expirer,
-                sessionsWithTimeouts, TICK_TIME, expirer.sid, true);
+                sessionsWithTimeouts, TICK_TIME, expirer.sid, true,
+                testZKSListener());
 
         // Local session from other server
         long sessionId = ((expirer.sid + 1) << 56) + 1;
@@ -179,7 +182,7 @@ public class SessionTrackerCheckTest ext
 
         // With local session off
         tracker = new LeaderSessionTracker(expirer, sessionsWithTimeouts,
-                TICK_TIME, expirer.sid, false);
+                TICK_TIME, expirer.sid, false, testZKSListener());
 
         // Global session
         sessionId = 0xdeadbeef;
@@ -215,4 +218,13 @@ public class SessionTrackerCheckTest ext
 
     }
 
+    ZooKeeperServerListener testZKSListener() {
+        return new ZooKeeperServerListener() {
+
+            @Override
+            public void notifyStopping(String errMsg, int exitCode) {
+
+            }
+        };
+    }
 }