I looked into this a bit more since i remembered that the protocol returns the
stat structure. it turns out to be a bug in the C API. in java, both the sync
and async version of setData will give you a stat structure back. in C,
zoo_aset uses the stat_completion_t, so you get the stat structure back.
unfortunately zoo_set() does not return the stat structure. i think we should
open a bug on this.
From: Avery Ching [ach...@yahoo-inc.com]
Sent: Friday, December 12, 2008 12:41 PM
To: Patrick Hunt
Subject: Re: zoo_set() version question
I am working on clusterlib (YST project) and we are using zookeeper for a
backing store of cluster abstractions (i.e. Applications, groups, nodes,
data distributions, etc.).
I believe that this is an optimization use case for using zoo_set() with
versions that are != -1.
1. I do a successful zoo_set() with version V, where V != -1.
2. Make more changes to my data.
3. I want to do another zoo_set() but I don't know what version number to
Since I don't know the version number I have to use either zoo_exists() or
zoo_get(). Even though zoo_exists() gets me the version number I don't know
whether that version is the one that I wrote. Therefore I need to read the
znode (zoo_get()) and compare with the data that I did set before I make
changes to the data (step 2) ) that I will zoo_set in step 3). Note that I
am never sure if I was the last writer.
If there is a way to get the used version from zoo_set(), then I do not need
to use zoo_exists() or zoo_get() in between zoo_set() calls (steps 1) and 3)
). They will still fail, of course, if the version is wrong. And the other
benefit is that I will know that I was the last writer if I get the version
from my last successful zoo_set() and then do zoo_exists() and the versions
On 12/12/08 11:53 AM, "Patrick Hunt" <ph...@apache.org> wrote:
> Could you explain your use case? There is no way to get the version as
> part of a zoo_set, however there may be some alternative that we can
> suggest if we knew more about the problem you are trying to solve.
> Avery Ching wrote:
>> Thanks for responding.
>> I agree that I can use zoo_exists and zoo_get to get the version of the
>> znode as it exists currently.
>> The problem I am trying to solve is that getting the version from struct
>> Stat in either zoo_exists or zoo_get may not be the same version that my
>> last successful zoo_set used. I would like to get the version that denotes
>> my last successful zoo_set() operation to a particular znode.
>> I understand that the data and version to the znode may change immediately
>> one or multiple times after my zoo_set() and this is fine, but I would still
>> like to know the znode's versions of the data I set.
>> On 12/12/08 11:11 AM, "Patrick Hunt" <ph...@apache.org> wrote:
>>> Avery Ching wrote:
>>>> If zoo_set() completes successfully with version != -1, can we assume that
>>>> version -> version + 1 for this znode? If not, is there a way for the user
>>>> to get the version of the successfully completed zoo_set() operation?
>>> You shouldn't rely on this, it may work, but it's not part of the
>>> contract. Also, nothing says that some other client won't change the
>>> node immediately after you change it.
>>> You can access the version using zoo_exists or zoo_get - specifically
>>> the "struct Stat stat" argument of either of those methods contains a
>>> "version" member.