Il mer 14 ago 2019, 17:55 Zili Chen <wander4...@gmail.com> ha scritto:
> FYI, etcd provides a transaction mechanism which supports if-else like > commits.[1] > As we have setData with version check usually you don't need a 'transaction' with some kind of rowlevel lock. Maybe I am missing something in your case. Enrico > Best, > tison. > > [1] https://godoc.org/github.com/coreos/etcd/clientv3#OpTxn > > > Zili Chen <wander4...@gmail.com> 于2019年8月14日周三 下午11:52写道: > > > 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 <an...@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 <wander4...@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 <eolive...@gmail.com> 于2019年8月6日周二 下午8:27写道: > >> > > >> >> Il mar 6 ago 2019, 13:47 Zili Chen <wander4...@gmail.com> ha > scritto: > >> >> > >> >>> Any ideas? > >> >>> > >> >>> > >> >>> Zili Chen <wander4...@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. > >> >>>> > >> >>> > >> >> > >> > >> >