[ 
https://issues.apache.org/jira/browse/CURATOR-573?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17126390#comment-17126390
 ] 

Viniti edited comment on CURATOR-573 at 6/5/20, 5:12 AM:
---------------------------------------------------------

[~randgalt] Reformatted the code in description. For the IllegalStateException, 
should I put a sleep between LSAdapter::close() and CuratorFramework::close()?

I also saw interruptLeadership() in LeaderSelector class which cancels a future 
task, should I call this before close()?


was (Author: viniti):
[~randgalt] Reformatted the code in description. For the IllegalStateException, 
should I put a sleep between LSAdapter::close() and CuratorFramework::close()?

> No leader is getting selected intermittently
> --------------------------------------------
>
>                 Key: CURATOR-573
>                 URL: https://issues.apache.org/jira/browse/CURATOR-573
>             Project: Apache Curator
>          Issue Type: Bug
>          Components: Apache, Framework, Recipes
>    Affects Versions: 4.0.1
>            Reporter: Viniti
>            Priority: Critical
>
> I am using Apache Curator Leader Election Recipe : 
> https://curator.apache.org/curator-recipes/leader-election.html in my 
> application.
> Zookeeper version : 3.5.7
> Curator : 4.0.1
> Below are the sequence of steps:
> 1. Whenever my tomcat server instance is getting up, I create a single 
> CuratorFramework instance(single instance per tomcat server) and start it : 
> {code:title=StartUp Code|borderStyle=solid}
> CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, 
> retryPolicy);
> client.start();
> if(!client.blockUntilConnected(10, TimeUnit.MINUTES)){
>  LOGGER.error("Zookeeper connection could not establish!");
>  throw new RuntimeException("Zookeeper connection could not establish");
> }
> {code}
> 2. Create an instance of LSAdapter and start it:
> {code:title=LSAdapter initializing|borderStyle=solid}
> LSAdapter adapter = new LSAdapter(client, <some_metadata>);
> adapter.start();
> {code}
> Below is my LSAdapter class :
> {code:title=LSAdapter.java|borderStyle=solid}
> public class LSAdapter extends LeaderSelectorListenerAdapter implements 
> Closeable {
> //<Class instance variables defined>
>  public LSAdapter(CuratorFramework client, <some_metadata>) {
>  leaderSelector = new LeaderSelector(client, 
> <path_to_be_used_for_leader_election>, this);
>  leaderSelector.autoRequeue();
>  }
> public void start() throws IOException {
>  leaderSelector.start();
>  }
> @Override
>  public void close() throws IOException {
>  leaderSelector.close();
>  }
> @Override
>  public void takeLeadership(CuratorFramework client) throws Exception {
>  final int waitSeconds = (int) (5 * Math.random()) + 1;
> LOGGER.info(name + " is now the leader. Waiting " + waitSeconds + " 
> seconds...");
>  LOGGER.debug(name + " has been leader " + leaderCount.getAndIncrement() + " 
> time(s) before.");
>  while (true) {
>  try {
>  Thread.sleep(TimeUnit.SECONDS.toMillis(waitSeconds));
>  //do leader tasks
>  } catch (InterruptedException e) {
>  LOGGER.error(name + " was interrupted.");
>  //cleanup
>  Thread.currentThread().interrupt();
>  } finally {
> }
>  }
>  }
> }
> {code}
> 4. When server instance is getting down, close LSAdapter instance(which 
> application is using) and close CuratorFramework client created
> {code:title=PreDestroy code|borderStyle=solid}
> CloseableUtils.closeQuietly(lsAdapter);
> curatorFrameworkClient.close();
> {code}
> The issue I am facing is that at times, when server is restarted, no leader 
> gets elected. I checked that by tracing the log inside takeLeadership(). I 
> have two tomcat server instances with above code, connecting to same 
> zookeeper quorum and most of the times one of the instance becomes leader but 
> when this issue happens, both of them becomes follower. Please suggest what 
> am I doing wrong.
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to