Home | About | Sematext search-lucene.com search-hadoop.com
 Search Hadoop and all its subprojects:

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


+
Jonathan Smith 2013-01-23, 12:12
Copy link to this message
-
Re: ZooKeeper Watch triggered multiple times for the same notification – contrary to docs
I agree that the docs are misleading. The watcher triggers once for the event registered. However, watchers can (and will) receive multiple connection-type events (EventType.None). That said, I think Curator recipes should be resilient to this. Please post an issue at the Curator github site: https://github.com/Netflix/curator/issues

-JZ

On Jan 23, 2013, at 4:12 AM, Jonathan Smith <[EMAIL PROTECTED]> wrote:

> 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
+
Jonathan Smith 2013-02-06, 21:44