[ 
https://issues.apache.org/jira/browse/CURATOR-573?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Viniti updated CURATOR-573:
---------------------------
    Description: 
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

/*Here, code is creating a znode. If client 's current state is CLOSED, this 
line will throw exception resulting in takeLeadership() exit. Else if, client 
state is STARTED, znode should be created. In case when LSAdaptor.close() is 
called, the client state will always be CLOSED at this line, and an exception 
is expected to be thrown.*/

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.

 

  was:
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
/*Here, creating a znode and when client state is CLOSED, this line will throw 
exception resulting in takeLeadership() exit. If the leader is interrupted and 
client state is STARTED, znode should be created*/
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.

 


> 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
> /*Here, code is creating a znode. If client 's current state is CLOSED, this 
> line will throw exception resulting in takeLeadership() exit. Else if, client 
> state is STARTED, znode should be created. In case when LSAdaptor.close() is 
> called, the client state will always be CLOSED at this line, and an exception 
> is expected to be thrown.*/
> 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