private static Optional<LeaderFinder<URIMetadata>> getLeaderFinder(Config config) throws URISyntaxException, IOException { if (config.hasPath(ZK_STRING_KEY)) { Preconditions.checkArgument(config.hasPath(LISTENING_PORT), "Missing required config " + LISTENING_PORT); Preconditions.checkArgument(config.hasPath(HA_CLUSTER_NAME), "Missing required config " + HA_CLUSTER_NAME); int port = config.getInt(LISTENING_PORT); String hostname = config.hasPath(HOSTNAME) ? config.getString(HOSTNAME) : InetAddress.getLocalHost().getCanonicalHostName(); String clusterName = config.getString(HA_CLUSTER_NAME); String zkString = config.getString(ZK_STRING_KEY); return Optional.<LeaderFinder<URIMetadata>>of(new ZookeeperLeaderElection<>(zkString, clusterName, new URIMetadata(new URI("http", null, hostname, port, null, null, null)))); } return Optional.absent(); }
private void findLeader() { ReentrantReadWriteLock.WriteLock lock = this.readWriteLock.writeLock(); lock.lock(); try { if (this.zooKeeper.checkExists().usingWatcher(new FindLeaderWatcher()).forPath(this.leaderNode) == null) { determineLeadership(); } byte[] leaderData = this.zooKeeper.getData().usingWatcher(new FindLeaderWatcher()).forPath(this.leaderNode); this.leaderMetadata = deserializeMetadata(leaderData); } catch (KeeperException exc) { reset(); } catch (Throwable exc) { log.error("Fatal failure.", exc); this.fatalFailure = true; } finally { lock.unlock(); } }
private void determineLeadership() { ReentrantReadWriteLock.WriteLock lock = this.readWriteLock.writeLock(); lock.lock(); try { List<String> children = this.zooKeeper.getChildren().forPath(this.leaderElectionNode); Collections.sort(children); int idx = children.indexOf(this.nodeId); if (idx == 0) { Stat stat = this.zooKeeper.checkExists().forPath(this.leaderNode); if (stat == null) { this.zooKeeper.create().forPath(this.leaderNode, serializeMetadata(this.localMetadata)); } else { this.zooKeeper.setData().forPath(this.leaderNode, serializeMetadata(this.localMetadata)); } this.isLeader = true; } else { this.isLeader = false; String watchedNode = this.leaderElectionNode + "/" + children.get(idx - 1); this.zooKeeper.checkExists().usingWatcher(new DetermineLeadershipWatcher()).forPath(watchedNode); } findLeader(); } catch (KeeperException exc) { reset(); } catch (Throwable exc) { log.error("Fatal failure.", exc); this.fatalFailure = true; } finally { lock.unlock(); } }
@Override protected void startUp() throws Exception { reset(); }
private void reset() { ReentrantReadWriteLock.WriteLock lock = this.readWriteLock.writeLock(); lock.lock(); try { if (this.zooKeeper != null) { this.zooKeeper.close(); } this.zooKeeper = CuratorFrameworkFactory.builder().retryPolicy(new ExponentialBackoffRetry(100, 3)) .connectString(this.zkConnectString).build(); this.zooKeeper.start(); if (!this.zooKeeper.blockUntilConnected(1, TimeUnit.SECONDS)) { throw new RuntimeException("Could not connect to Zookeeper."); } String nodePath = this.zooKeeper.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL) .forPath(this.leaderElectionNode + "/p_"); this.nodeId = nodePath.substring(nodePath.lastIndexOf("/") + 1); determineLeadership(); } catch (Throwable exc) { throw new RuntimeException(exc); } finally { lock.unlock(); } }
@Override protected void startUp() throws Exception { reset(); }
private void reset() { ReentrantReadWriteLock.WriteLock lock = this.readWriteLock.writeLock(); lock.lock(); try { if (this.zooKeeper != null) { this.zooKeeper.close(); } this.zooKeeper = CuratorFrameworkFactory.builder().retryPolicy(new ExponentialBackoffRetry(100, 3)) .connectString(this.zkConnectString).build(); this.zooKeeper.start(); if (!this.zooKeeper.blockUntilConnected(1, TimeUnit.SECONDS)) { throw new RuntimeException("Could not connect to Zookeeper."); } String nodePath = this.zooKeeper.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL) .forPath(this.leaderElectionNode + "/p_"); this.nodeId = nodePath.substring(nodePath.lastIndexOf("/") + 1); determineLeadership(); } catch (Throwable exc) { throw new RuntimeException(exc); } finally { lock.unlock(); } }
private void findLeader() { ReentrantReadWriteLock.WriteLock lock = this.readWriteLock.writeLock(); lock.lock(); try { if (this.zooKeeper.checkExists().usingWatcher(new FindLeaderWatcher()).forPath(this.leaderNode) == null) { determineLeadership(); } byte[] leaderData = this.zooKeeper.getData().usingWatcher(new FindLeaderWatcher()).forPath(this.leaderNode); this.leaderMetadata = deserializeMetadata(leaderData); } catch (KeeperException exc) { reset(); } catch (Throwable exc) { log.error("Fatal failure.", exc); this.fatalFailure = true; } finally { lock.unlock(); } }
private void determineLeadership() { ReentrantReadWriteLock.WriteLock lock = this.readWriteLock.writeLock(); lock.lock(); try { List<String> children = this.zooKeeper.getChildren().forPath(this.leaderElectionNode); Collections.sort(children); int idx = children.indexOf(this.nodeId); if (idx == 0) { Stat stat = this.zooKeeper.checkExists().forPath(this.leaderNode); if (stat == null) { this.zooKeeper.create().forPath(this.leaderNode, serializeMetadata(this.localMetadata)); } else { this.zooKeeper.setData().forPath(this.leaderNode, serializeMetadata(this.localMetadata)); } this.isLeader = true; } else { this.isLeader = false; String watchedNode = this.leaderElectionNode + "/" + children.get(idx - 1); this.zooKeeper.checkExists().usingWatcher(new DetermineLeadershipWatcher()).forPath(watchedNode); } findLeader(); } catch (KeeperException exc) { reset(); } catch (Throwable exc) { log.error("Fatal failure.", exc); this.fatalFailure = true; } finally { lock.unlock(); } }
private static Optional<LeaderFinder<URIMetadata>> getLeaderFinder(Config config) throws URISyntaxException, IOException { if (config.hasPath(ZK_STRING_KEY)) { Preconditions.checkArgument(config.hasPath(LISTENING_PORT), "Missing required config " + LISTENING_PORT); Preconditions.checkArgument(config.hasPath(HA_CLUSTER_NAME), "Missing required config " + HA_CLUSTER_NAME); int port = config.getInt(LISTENING_PORT); String hostname = config.hasPath(HOSTNAME) ? config.getString(HOSTNAME) : InetAddress.getLocalHost().getCanonicalHostName(); String clusterName = config.getString(HA_CLUSTER_NAME); String zkString = config.getString(ZK_STRING_KEY); return Optional.<LeaderFinder<URIMetadata>>of(new ZookeeperLeaderElection<>(zkString, clusterName, new URIMetadata(new URI("http", null, hostname, port, null, null, null)))); } return Optional.absent(); }