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) {
+
+ }
+ };
+ }
}