My question is - what is the right way to received notification once a znode is
created?
My scenario is that I have two threads, one (thread A) is going to save data to
hdfs, another thread (thread B) is going to delete data stored in hdfs once
thread A finishes its procedure. Thread A will create a znode and Thread B uses
zk.exists() to register a watch.
Thread A will only do
zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
at the end (in the final block) of a clean function.
The watcher in therad B
Watcher watcher = new Watcher(){
public void process(WatchedEvent e){
boolean exist = e.getType().equals(EventType.NodeCreated);
boolean path = e.getPath().equals("/"+job_id+"/"+task_id);
if(exist && path){
// start cleaning data in hdfs
}
}
and
pass watcher to zk.exists(path, watcher);
but I gets `KeeperErrorCode = NoNode for' exception
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode
for /job_id/task_id
at org.apache.zookeeper.KeeperException.create(KeeperException.java:102)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:42)
at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:637)
It looks like znode doesn't exists because thread A still not yet create znode
with path '/job_id/task_id'; however, if I switch to make thread A create znode
first then therad B executes zk.exists(path, watcher). Problems becomes thread
B (or its watcher) would never get triggered deleting data in hdfs.
How to fix this?
I appreciate any suggestion.
Thanks.