Author: mahadev
Date: Tue Aug 30 06:37:07 2011
New Revision: 1163102
URL: http://svn.apache.org/viewvc?rev=1163102&view=rev
Log:
ZOOKEEPER-1140. server shutdown is not stopping threads. (laxman via mahadev)
Modified:
zookeeper/trunk/CHANGES.txt
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java
Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1163102&r1=1163101&r2=1163102&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Tue Aug 30 06:37:07 2011
@@ -295,6 +295,8 @@ BUGFIXES:
ZOOKEEPER-1117. zookeeper 3.3.3 fails to build with gcc >= 4.6.1 on
Debian/Ubuntu (James Page via mahadev)
+ ZOOKEEPER-1140. server shutdown is not stopping threads. (laxman via mahadev)
+
IMPROVEMENTS:
ZOOKEEPER-724. Improve junit test integration - log harness information
(phunt via mahadev)
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java?rev=1163102&r1=1163101&r2=1163102&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java Tue
Aug 30 06:37:07 2011
@@ -523,17 +523,17 @@ public class LearnerHandler extends Thre
LOG.warn("******* GOODBYE "
+ (sock != null ? sock.getRemoteSocketAddress() : "<null>")
+ " ********");
- // Send the packet of death
- try {
- queuedPackets.put(proposalOfDeath);
- } catch (InterruptedException e) {
- LOG.warn("Ignoring unexpected exception", e);
- }
shutdown();
}
}
public void shutdown() {
+ // Send the packet of death
+ try {
+ queuedPackets.put(proposalOfDeath);
+ } catch (InterruptedException e) {
+ LOG.warn("Ignoring unexpected exception", e);
+ }
try {
if (sock != null && !sock.isClosed()) {
sock.close();
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=1163102&r1=1163101&r2=1163102&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java Tue Aug
30 06:37:07 2011
@@ -671,33 +671,36 @@ public class QuorumPeer extends Thread i
logFactory, this,
new ZooKeeperServer.BasicDataTreeBuilder(),
this.zkDb);
- try {
- // Instead of starting roZk immediately, wait some grace
- // period before we decide we're partitioned.
- //
- // Thread is used here because otherwise it would require
- // changes in each of election strategy classes which is
- // unnecessary code coupling.
- new Thread() {
- public void run() {
- try {
- // lower-bound grace period to 2 secs
- sleep(Math.max(2000, tickTime));
- if (ServerState.LOOKING.equals(getPeerState())) {
- roZk.startup();
- LOG.info("Read-only server started");
- }
- } catch (Exception e) {
- LOG.error("FAILED to start ReadOnlyZooKeeperServer",
e);
+
+ // Instead of starting roZk immediately, wait some grace
+ // period before we decide we're partitioned.
+ //
+ // Thread is used here because otherwise it would require
+ // changes in each of election strategy classes which is
+ // unnecessary code coupling.
+ Thread roZkMgr = new Thread() {
+ public void run() {
+ try {
+ // lower-bound grace period to 2 secs
+ sleep(Math.max(2000, tickTime));
+ if (ServerState.LOOKING.equals(getPeerState())) {
+ roZk.startup();
}
+ } catch (Exception e) {
+ LOG.error("FAILED to start ReadOnlyZooKeeperServer", e);
}
- }.start();
-
+ }
+ };
+ try {
+ roZkMgr.start();
setCurrentVote(makeLEStrategy().lookForLeader());
} catch (Exception e) {
LOG.warn("Unexpected exception",e);
setPeerState(ServerState.LOOKING);
} finally {
+ // If the thread is in the the grace period, interrupt
+ // to come out of waiting.
+ roZkMgr.interrupt();
roZk.shutdown();
}
break;
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java?rev=1163102&r1=1163101&r2=1163102&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java
(original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/ReadOnlyZooKeeperServer.java
Tue Aug 30 06:37:07 2011
@@ -38,6 +38,7 @@ import org.apache.zookeeper.server.persi
*/
public class ReadOnlyZooKeeperServer extends QuorumZooKeeperServer {
+ private volatile boolean shutdown = false;
ReadOnlyZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self,
DataTreeBuilder treeBuilder, ZKDatabase zkDb) {
super(logFactory, self.tickTime, self.minSessionTimeout, self.maxSessionTimeout,
@@ -54,11 +55,16 @@ public class ReadOnlyZooKeeperServer ext
}
@Override
- public void startup() {
+ public synchronized void startup() {
+ // check to avoid startup follows shutdown
+ if (shutdown) {
+ LOG.warn("Not starting Read-only server as startup follows shutdown!");
+ return;
+ }
registerJMX(new ReadOnlyBean(this), self.jmxLocalPeerBean);
super.startup();
-
self.cnxnFactory.setZooKeeperServer(this);
+ LOG.info("Read-only server started");
}
@Override
@@ -124,7 +130,8 @@ public class ReadOnlyZooKeeperServer ext
}
@Override
- public void shutdown() {
+ public synchronized void shutdown() {
+ shutdown = true;
unregisterJMX(this);
// set peer's server to null
|