You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@zookeeper.apache.org by Benjamin Jaton <bj...@radiantlogic.com> on 2013/07/18 01:25:33 UTC

Watching children updates

Hello,

I would like to be notified of a change on any of the children of a znode
(could be a lot of them).

AFAIK to achieve this we need to set a watcher on each child and then also
watch the parent to be aware of children addition/deletion and add/remove
watchers accordingly. Is that correct?

What is the performance impact of having for example thousands of watchers?

Thanks,
Ben

Re: Watching children updates

Posted by Thawan Kooburat <th...@fb.com>.
ZOOKEEPER-1416 is another way of solving the problem of watching a sub-tree

-- 
Thawan Kooburat





On 7/17/13 10:50 PM, "kishore g" <g....@gmail.com> wrote:

>Good idea beware of failure scenarios.
>
>lets say you do
>#1. parent.setData #2 child.setData
>
>your watch might be triggered and when you read the children child may not
>be changed yet. so u will miss the child data change
>
>other option is
>#1 child.setData #2 parent.setData
>if you fail after setting the child data, there wont be any watch
>triggered.
>
>Only option is probably doing child.setData and parent.setData in the same
>transaction and probably the multitransaction can be helpful. But if you
>are updating children often the multitransaction might fail quite
>frequently because of concurrent updates on the parent
>
>I think its better for zk to solve this problem the right way. Instead of
>solving the problem of large number of watches in zk, it might be a better
>idea to add the concept of watching childDataChange in zookeeper. I dont
>think the implementation will be any more complicated than triggering
>watches for child creation.
>
>Thoughts ?
>
>
>
>
>
>On Wed, Jul 17, 2013 at 6:23 PM, Benjamin Jaton
><bj...@radiantlogic.com>wrote:
>
>> Thanks, the JIRA is very interesting.
>>
>> I am contemplating the possibility to make a parent.setData(..) call to
>> notify of a change in one of the children and put a watcher on
>> parent.getData().
>> I would then iterate through the children and compare the
>>stat.getVersion()
>> to figure out which have changed.
>>
>>
>> On Wed, Jul 17, 2013 at 5:30 PM, Flavio Junqueira <fpjunqueira@yahoo.com
>> >wrote:
>>
>> > Hi Ben,
>> >
>> > Your description seems right to me, assuming that when you refer to
>> > changes to the children, you mean setting the data of the children.
>> >
>> > You may also want to have a look here if you haven't done it yet:
>> >
>> >
>> >
>> 
>>http://zookeeper.apache.org/doc/r3.4.5/zookeeperProgrammers.html#ch_zkWat
>>ches
>> >
>> > About performance impact, you may want to have a look at the
>>discussion
>> > here:
>> >
>> >         https://issues.apache.org/jira/browse/ZOOKEEPER-1177
>> >
>> > -Flavio
>> >
>> > On Jul 18, 2013, at 12:25 AM, Benjamin Jaton <bj...@radiantlogic.com>
>> > wrote:
>> >
>> > > Hello,
>> > >
>> > > I would like to be notified of a change on any of the children of a
>> znode
>> > > (could be a lot of them).
>> > >
>> > > AFAIK to achieve this we need to set a watcher on each child and
>>then
>> > also
>> > > watch the parent to be aware of children addition/deletion and
>> add/remove
>> > > watchers accordingly. Is that correct?
>> > >
>> > > What is the performance impact of having for example thousands of
>> > watchers?
>> > >
>> > > Thanks,
>> > > Ben
>> >
>> >
>>


Re: Watching children updates

Posted by kishore g <g....@gmail.com>.
Good idea beware of failure scenarios.

lets say you do
#1. parent.setData #2 child.setData

your watch might be triggered and when you read the children child may not
be changed yet. so u will miss the child data change

other option is
#1 child.setData #2 parent.setData
if you fail after setting the child data, there wont be any watch triggered.

Only option is probably doing child.setData and parent.setData in the same
transaction and probably the multitransaction can be helpful. But if you
are updating children often the multitransaction might fail quite
frequently because of concurrent updates on the parent

I think its better for zk to solve this problem the right way. Instead of
solving the problem of large number of watches in zk, it might be a better
idea to add the concept of watching childDataChange in zookeeper. I dont
think the implementation will be any more complicated than triggering
watches for child creation.

Thoughts ?





On Wed, Jul 17, 2013 at 6:23 PM, Benjamin Jaton <bj...@radiantlogic.com>wrote:

> Thanks, the JIRA is very interesting.
>
> I am contemplating the possibility to make a parent.setData(..) call to
> notify of a change in one of the children and put a watcher on
> parent.getData().
> I would then iterate through the children and compare the stat.getVersion()
> to figure out which have changed.
>
>
> On Wed, Jul 17, 2013 at 5:30 PM, Flavio Junqueira <fpjunqueira@yahoo.com
> >wrote:
>
> > Hi Ben,
> >
> > Your description seems right to me, assuming that when you refer to
> > changes to the children, you mean setting the data of the children.
> >
> > You may also want to have a look here if you haven't done it yet:
> >
> >
> >
> http://zookeeper.apache.org/doc/r3.4.5/zookeeperProgrammers.html#ch_zkWatches
> >
> > About performance impact, you may want to have a look at the discussion
> > here:
> >
> >         https://issues.apache.org/jira/browse/ZOOKEEPER-1177
> >
> > -Flavio
> >
> > On Jul 18, 2013, at 12:25 AM, Benjamin Jaton <bj...@radiantlogic.com>
> > wrote:
> >
> > > Hello,
> > >
> > > I would like to be notified of a change on any of the children of a
> znode
> > > (could be a lot of them).
> > >
> > > AFAIK to achieve this we need to set a watcher on each child and then
> > also
> > > watch the parent to be aware of children addition/deletion and
> add/remove
> > > watchers accordingly. Is that correct?
> > >
> > > What is the performance impact of having for example thousands of
> > watchers?
> > >
> > > Thanks,
> > > Ben
> >
> >
>

Re: Watching children updates

Posted by Benjamin Jaton <bj...@radiantlogic.com>.
Thanks, the JIRA is very interesting.

I am contemplating the possibility to make a parent.setData(..) call to
notify of a change in one of the children and put a watcher on
parent.getData().
I would then iterate through the children and compare the stat.getVersion()
to figure out which have changed.


On Wed, Jul 17, 2013 at 5:30 PM, Flavio Junqueira <fp...@yahoo.com>wrote:

> Hi Ben,
>
> Your description seems right to me, assuming that when you refer to
> changes to the children, you mean setting the data of the children.
>
> You may also want to have a look here if you haven't done it yet:
>
>
> http://zookeeper.apache.org/doc/r3.4.5/zookeeperProgrammers.html#ch_zkWatches
>
> About performance impact, you may want to have a look at the discussion
> here:
>
>         https://issues.apache.org/jira/browse/ZOOKEEPER-1177
>
> -Flavio
>
> On Jul 18, 2013, at 12:25 AM, Benjamin Jaton <bj...@radiantlogic.com>
> wrote:
>
> > Hello,
> >
> > I would like to be notified of a change on any of the children of a znode
> > (could be a lot of them).
> >
> > AFAIK to achieve this we need to set a watcher on each child and then
> also
> > watch the parent to be aware of children addition/deletion and add/remove
> > watchers accordingly. Is that correct?
> >
> > What is the performance impact of having for example thousands of
> watchers?
> >
> > Thanks,
> > Ben
>
>

Re: Watching children updates

Posted by Flavio Junqueira <fp...@yahoo.com>.
Hi Ben,

Your description seems right to me, assuming that when you refer to changes to the children, you mean setting the data of the children. 

You may also want to have a look here if you haven't done it yet:

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

About performance impact, you may want to have a look at the discussion here:

	https://issues.apache.org/jira/browse/ZOOKEEPER-1177

-Flavio

On Jul 18, 2013, at 12:25 AM, Benjamin Jaton <bj...@radiantlogic.com> wrote:

> Hello,
> 
> I would like to be notified of a change on any of the children of a znode
> (could be a lot of them).
> 
> AFAIK to achieve this we need to set a watcher on each child and then also
> watch the parent to be aware of children addition/deletion and add/remove
> watchers accordingly. Is that correct?
> 
> What is the performance impact of having for example thousands of watchers?
> 
> Thanks,
> Ben