public void registerRegionServerListener(ZooKeeperListener listener) { this.zookeeper.registerListener(listener); }
/** * We do the following in a different thread. If it is not completed * in time, we will time it out and assume it is not easy to recover. * * 1. Create a new ZK session. (since our current one is expired) * 2. Try to become a primary master again * 3. Initialize all ZK based system trackers. * 4. Assign root and meta. (they are already assigned, but we need to update our * internal memory state to reflect it) * 5. Process any RIT if any during the process of our recovery. * * @return True if we could successfully recover from ZK session expiry. * @throws InterruptedException * @throws IOException * @throws KeeperException * @throws ExecutionException */ private boolean tryRecoveringExpiredZKSession() throws InterruptedException, IOException, KeeperException, ExecutionException { this.zooKeeper.unregisterAllListeners(); // add back listeners which were registered before master initialization // because they won't be added back in below Master re-initialization code if (this.registeredZKListenersBeforeRecovery != null) { for (ZooKeeperListener curListener : this.registeredZKListenersBeforeRecovery) { this.zooKeeper.registerListener(curListener); } } this.zooKeeper.reconnectAfterExpiration(); Callable<Boolean> callable = new Callable<Boolean> () { public Boolean call() throws InterruptedException, IOException, KeeperException { MonitoredTask status = TaskMonitor.get().createStatus("Recovering expired ZK session"); try { if (!becomeActiveMaster(status)) { return Boolean.FALSE; } serverManager.disableSSHForRoot(); serverShutdownHandlerEnabled = false; initialized = false; finishInitialization(status, true); return Boolean.TRUE; } finally { status.cleanup(); } } }; long timeout = conf.getLong("hbase.master.zksession.recover.timeout", 300000); java.util.concurrent.ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Boolean> result = executor.submit(callable); executor.shutdown(); if (executor.awaitTermination(timeout, TimeUnit.MILLISECONDS) && result.isDone()) { Boolean recovered = result.get(); if (recovered != null) { return recovered.booleanValue(); } } executor.shutdownNow(); return false; }
/** * We do the following in a different thread. If it is not completed * in time, we will time it out and assume it is not easy to recover. * * 1. Create a new ZK session. (since our current one is expired) * 2. Try to become a primary master again * 3. Initialize all ZK based system trackers. * 4. Assign meta. (they are already assigned, but we need to update our * internal memory state to reflect it) * 5. Process any RIT if any during the process of our recovery. * * @return True if we could successfully recover from ZK session expiry. * @throws InterruptedException * @throws IOException * @throws KeeperException * @throws ExecutionException */ private boolean tryRecoveringExpiredZKSession() throws InterruptedException, IOException, KeeperException, ExecutionException { this.zooKeeper.unregisterAllListeners(); // add back listeners which were registered before master initialization // because they won't be added back in below Master re-initialization code if (this.registeredZKListenersBeforeRecovery != null) { for (ZooKeeperListener curListener : this.registeredZKListenersBeforeRecovery) { this.zooKeeper.registerListener(curListener); } } this.zooKeeper.reconnectAfterExpiration(); Callable<Boolean> callable = new Callable<Boolean> () { @Override public Boolean call() throws InterruptedException, IOException, KeeperException { MonitoredTask status = TaskMonitor.get().createStatus("Recovering expired ZK session"); try { if (!becomeActiveMaster(status)) { return Boolean.FALSE; } serverShutdownHandlerEnabled = false; initialized = false; finishInitialization(status, true); return !stopped; } finally { status.cleanup(); } } }; long timeout = conf.getLong("hbase.master.zksession.recover.timeout", 300000); java.util.concurrent.ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Boolean> result = executor.submit(callable); executor.shutdown(); if (executor.awaitTermination(timeout, TimeUnit.MILLISECONDS) && result.isDone()) { Boolean recovered = result.get(); if (recovered != null) { return recovered.booleanValue(); } } executor.shutdownNow(); return false; }