A few things: * You don’t need to create a new Curator instance for each Leader. One Curator instance can be used for an application. * Calling client.getZookeeperClient().blockUntilConnectedOrTimedOut(); is unnecessary * Calling isLeader() immediately after starting the latch may not work. It takes time for the leader to get selected. LeaderLatch has a listener if you want to get notified. Alternatively, you can use LeaderSelector.
Hope this helps. -Jordan On January 15, 2015 at 5:25:26 PM, Check Peck ([email protected]) wrote: I am using Zookeeper for the leadership election process. I have three nodes zookeeper ensemble. We have a node like this "/test/msn" on which we are doing the leadership election and it works fine and we have application servers running it in production and using "/test/msn" node for leadership. And this program is always running. Now we created another node like this "/testpnl" in the same zookeeper servers. And we have another set of machines which is trying to do the leadership election on that node and whenever I run my program in production from one servers, it always returns back that the node is not leader? And I can see only one node inside "/testpnl" and it is the same node from which I am running my program? I am using Curator 2.7.0 and the zookeeper version is 3.4.5 Is there anything wrong with my setup or zookeeper has some bug which I am not aware? Is anything public class ZookeeperLeaderTester { private ZookeeperClient zookClient; private static final String ZOOK_PRODUCTION = "host1:2181,host2:2181,host3:2181"; private static final String LEADERSHIP_NODE = "/testpnl"; private static class Holder { static final ZookeeperLeaderTester INSTANCE = new ZookeeperLeaderTester(); } public static ZookeeperLeaderTester getInstance() { return Holder.INSTANCE; } private ZookeeperLeaderTester() { try { String hostname = getHostName(); zookClient = new ZookeeperClient(nodes, LEADERSHIP_NODE, hostname); zookClient.start(); } catch (Exception ex) { System.out.println (ex); System.exit(1); } } public ZookeeperClient getZookClient() { return zookClient; } } And here is my ZookeeperClient code - public class ZookeeperClient { private CuratorFramework client; private String latchPath; private String id; private LeaderLatch leaderLatch; public ZookeeperClient(String connString, String latchPath, String id) { client = CuratorFrameworkFactory.newClient(connString, new ExponentialBackoffRetry(1000, Integer.MAX_VALUE)); this.id = id; this.latchPath = latchPath; } public void start() throws Exception { client.start(); client.getZookeeperClient().blockUntilConnectedOrTimedOut(); leaderLatch = new LeaderLatch(client, latchPath, id); leaderLatch.start(); } public boolean isLeader() { return leaderLatch.hasLeadership(); } public Participant currentLeader() throws Exception { return leaderLatch.getLeader(); } public void close() throws IOException { leaderLatch.close(); client.close(); } public CuratorFramework getClient() { return client; } public String getLatchPath() { return latchPath; } public String getId() { return id; } public LeaderLatch getLeaderLatch() { return leaderLatch; } } And this is the way I am using it - ZookeeperLeaderTester zookClient = ZookeeperLeaderTester.getInstance().getZookClient(); if (zookClient.isLeader()) { // then do stuff }
