Home | About | Sematext search-lucene.com search-hadoop.com
NEW: Monitor These Apps!
elasticsearch, apache solr, apache hbase, hadoop, redis, casssandra, amazon cloudwatch, mysql, memcached, apache kafka, apache zookeeper, apache storm, ubuntu, centOS, red hat, debian, puppet labs, java, senseiDB
 Search Hadoop and all its subprojects:

Switch to Threaded View
Zookeeper >> mail # user >> ZooKeeper Watch triggered multiple times for the same notification – contrary to docs


Copy link to this message
-
ZooKeeper Watch triggered multiple times for the same notification – contrary to docs
I have a node that has a children watch on it. Whenever the
NodeChildrenChanged event is received I obtain the children using
getChildren passing in my watcher then iterate through all children
and perform a getData() also passing in my watcher so that I am also
notified of any changes to the data on the children.

E.g.

    public void check() {
        List<String> children zkclient.getChildren().usingWatcher(myWatcher).forPath(PATH);
        for (String name : children) {
            byte[] data zkclient.getData().usingWatcher(myWatcher).forPath(getPathFromName(name));
            // do stuff
        }
    }
    CuratorWatcher myWatcher = new CuratorWatcher() {
        @Override
        public void process(WatchedEvent event) throws Exception {
            logger.info("received watch event: " + event);
            if (event.getType().equals(EventType.NodeChildrenChanged)
                    || event.getType().equals(EventType.NodeDataChanged)) {
                check();
            }
        }
    };

This means that whenever a child is added/removed, another getData
call will be made with the watcher.

After reading the ZooKeeper documentation I thought it would be fine
to keep setting the watcher since I should only be given the same
watch notification once:

“A watch object, or function/context pair, will only be triggered once
for a given notification. For example, if the same watch object is
registered for an exists and a getData call for the same file and that
file is then deleted, the watch object would only be invoked once with
the deletion notification for the file.”

http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkWatches

However I have observed that when a node is deleted I am receiving the
NodeDeleted watch event multiple times:

received watch event: WatchedEvent state:SyncConnected
type:NodeDeleted path:/a/b
received watch event: WatchedEvent state:SyncConnected
type:NodeDeleted path:/a/b
received watch event: WatchedEvent state:SyncConnected
type:NodeDeleted path:/a/b
...

This means the watch is being triggered multiple times unnecessarily.

I am using the Curator framework however I believe this just passes
the watches through and therefore this is a ZooKeeper issue.  I am
using zookeeper server version 3.4.5, zookeeper client 3.3.1,
curator-framework 1.2.2.

Is the documentation wrong / is this a bug or have I misunderstood?

Many thanks,
Jon
NEW: Monitor These Apps!
elasticsearch, apache solr, apache hbase, hadoop, redis, casssandra, amazon cloudwatch, mysql, memcached, apache kafka, apache zookeeper, apache storm, ubuntu, centOS, red hat, debian, puppet labs, java, senseiDB