zookeeper-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Zili Chen <wander4...@gmail.com>
Subject Re: create or setData in transaction?
Date Wed, 14 Aug 2019 15:52:48 GMT
Hi Andor,

Thanks for your attention.

The problem is that in concurrent scenario zk.setData() could still failed
if there is another thread delete the node. I know with proper lock strategy
and ownership separation this can be avoid but it's said that ZooKeeper has
a transaction mechanism so I'd like to see whether I can make use of it.

There is where I turn to

zk.multi(Op.check(path1), Op.setData(path2, data)); // path1 == or != path2
is irrelevant

when the existence of a mark node(path1) guarded a condition and I want to
make
sure that setData successes only if the mark node exist. If I check the
existence
first and commit setData, a remove to the node could break the guard. In
other
words, I want to tell ZooKeeper that the check and setData should be
successful
committed or fail to be committed atomically.

Best,
tison.


Andor Molnar <andor@apache.org> 于2019年8月14日周三 下午11:12写道:

> Hi Zili,
>
> There’s no such functionality in ZooKeeper as far as I’m concerned. I
> think your multi example (zk.multi(Op.check(path), Op.setData(path, data)))
> is already a usage pattern which multi is not designed to support.
>
> Why do you need to do this in “transactions” (there’s no transaction in
> ZK)?
>
> In Java you can do:
>
> try {
>   zk.create();
> } catch (NodeExistsException e) {
>   // swallow exception
> }
> zk.setData();
> …
>
> Regards,
> Andor
>
>
>
>
> > On 2019. Aug 6., at 14:44, Zili Chen <wander4096@gmail.com> wrote:
> >
> > Hi Enrico,
> >
> > Thanks for your reply.
> >
> >> In this case usually you use conditional setData, using the 'version' of
> >> thr znode
> >
> >
> > what if the caller has no idea on whether the node exist?(see also
> > my if-else pseudo-code above.)
> >
> > IIRC if we call `setData` on a non-exist path a NoNodeException
> > will be thrown.
> > Best,
> > tison.
> >
> >
> > Enrico Olivelli <eolivelli@gmail.com> 于2019年8月6日周二 下午8:27写道:
> >
> >> Il mar 6 ago 2019, 13:47 Zili Chen <wander4096@gmail.com> ha scritto:
> >>
> >>> Any ideas?
> >>>
> >>>
> >>> Zili Chen <wander4096@gmail.com> 于2019年7月29日周一 上午11:12写道:
> >>>
> >>>> Hi ZooKeepers,
> >>>>
> >>>> Currently our transaction mechanism supports doing
> >>>> create/setData/checkExist/delete in transaction. However, taking this
> >>>> scenario into consideration, we want to put data in path "/path" but
> >>>> don't know whether the znode exists or not. Let's say we program as
> >>>> below
> >>>>
> >>>> if (zk.exist(path)) {
> >>>>  zk.setData(path, data);
> >>>> } else {
> >>>>  zk.create(path, data);
> >>>> }
> >>>
> >>
> >> Do you need to perform other ops in the same transaction?
> >> In this case usually you use conditional setData, using the 'version' of
> >> thr znode
> >>
> >>
> >> Enrico
> >>
> >>>
> >>>> if we want to do the check and "put" in transaction, it would be like
> >>>>
> >>>> zk.multi(Op.check(path), Op.setData(path, data));
> >>>>
> >>>> but we cannot add a "else" branch. ZooKeeper's transaction would all
> >>>> success or fail.
> >>>>
> >>>> Is there any way to do an "if-else" transaction?
> >>>>
> >>>> Best,
> >>>> tison.
> >>>>
> >>>
> >>
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message