|
@@ -671,33 +671,36 @@ public class QuorumPeer extends Thread implements QuorumStats.Provider {
|
|
|
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;
|