https://www.linkedin.com/pulse/zookeeper-ephemeral-znode-gotcha-narendra-kumar
if(client.checkExists().forPath(path) != null)
{
try
{
client.delete().forPath(path);
}catch(NoNodeException e)
{
//swallow
}
}
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
This way you will alway own the znode.
2. Add jvm shutdown hook to ensure closing the zookeeper as shown below
Runtime.getRuntime().addShutdownHook(
new Thread()
{
@Override
public void run()
{
client.close();
}
}
);
https://zookeeper.apache.org/doc/r3.1.2/zookeeperStarted.html
https://stackoverflow.com/questions/3340756/can-i-recursively-create-a-path-in-zookeeper
Kazoo has an ensure_path(path) operation, although it isn't considered atomic. Using this would at least save you the need to write your own code for a recursive create.
https://www.tutorialspoint.com/zookeeper/zookeeper_cli.htm
https://community.hortonworks.com/articles/7081/best-practice-chroot-your-solr-cloud-in-zookeeper.html
if (client.checkExists().forPath(path) == null)
{
{
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
}
The above code was creating a major problem in my code. When i used to restart my application, the ephemeral node will be deleted after some time as if my session had expired.
The reason for this behaviour was simple. Consider the following sequence of event :-
1. You start the application first time, new session session-A is established with zookeeper server. The above given if-condition evaluates to true which will result in session session-A creating the ephemeral znode for path path . session-A now owns the znode for path path .
2. you stop the service ungracefully. Session session-A is still active because you didnot get a chance to close() the zookeeper explicitly. zookeeper server will now expire this dangling session session-A after session timeout reaches( usually 40 seconds).
3. You started the service again quickly( less than 40 seconds after first start). New session session-B is established with zookeeper server. The above given if condition becomes false because the session session-A is still active. Your service started successfully but the session session-B does not own the znode for path path .
4. Zookeeper server expires the session-A after timeout and deletes all the ephemeral znodes owned by this session.
5. Now if your application tries to access znode for path path it will fail with the NoNodeException.
To avoid this error you can do two things:
1.Make sure your application first delete the znode and then create it .
Here is how it will look like:-1.Make sure your application first delete the znode and then create it .
if(client.checkExists().forPath(path) != null)
{
try
{
client.delete().forPath(path);
}catch(NoNodeException e)
{
//swallow
}
}
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
This way you will alway own the znode.
2. Add jvm shutdown hook to ensure closing the zookeeper as shown below
Runtime.getRuntime().addShutdownHook(
new Thread()
{
@Override
public void run()
{
client.close();
}
}
);
https://zookeeper.apache.org/doc/r3.1.2/zookeeperStarted.html
clientPort - the port to listen for client connections
https://stackoverflow.com/questions/3340756/can-i-recursively-create-a-path-in-zookeeper
Kazoo has an ensure_path(path) operation, although it isn't considered atomic. Using this would at least save you the need to write your own code for a recursive create.
https://www.tutorialspoint.com/zookeeper/zookeeper_cli.htm
https://community.hortonworks.com/articles/7081/best-practice-chroot-your-solr-cloud-in-zookeeper.html