Thanks. I shall go through the application to see how the local view build and whether I can handle such case correctly - if there are concurrent updates, it seems impossible to figure out whether the operation ever succeeded.
Enrico Olivelli <[email protected]>于2022年6月16日 周四21:57写道: > Il giorno gio 16 giu 2022 alle ore 15:35 tison <[email protected]> > ha scritto: > > > > > if you see BadVersionException then the action must not have been > > > > From ZK code it seems that the comparison is about equality. > > > > Is it possible that: > > > > T0: setData(path, data, v0) > > T1: ConnectionLoss, but setData succeeded on the server, and thus version > > changed > > T2: client received ConnectionLoss, retry > > T3: client got BadVersionException, but actually the data is changed as > it > > proposed > > In any case you cannot rely on the status of the znode in case of > ConnectionLoss, > the fact that the change reached the server or not is not a big deal. > you have to revalidate your local view of the data. > > in this case BadVersion and ConnectionLoss mean that you are not up-to-date > > Enrico > > > > > > > you have to read the znode again and compare the version, > > > > Yeah..This is still a best effort check. If there are multiple writers > even > > I get the version of znode and it's mismatched I don't know whether it > ever > > succeed. > > > > Best, > > tison. > > > > > > Enrico Olivelli <[email protected]> 于2022年6月16日周四 21:08写道: > > > > > Tison, > > > > > > Il giorno gio 16 giu 2022 alle ore 15:04 tison <[email protected]> > > > ha scritto: > > > > > > > > Hi ZooKeepers, > > > > > > > > When investigate this issue[1] I notice a possibility that if I write > > > such > > > > a program: > > > > > > > > while (true) { > > > > try { > > > > zk.setData(path, data, version); // (1) > > > > break; > > > > } catch(KeeperException.ConnectionLossException e) { > > > > // retry > > > > } > > > > } > > > > > > > > ... then in (1) there can be a case that it throws > > > > KeeperException.BadVersionException but actually the action is > successful > > > > on the server side previously (but failed to send a response due to > > > > connection loss). > > > > > > if you see BadVersionException then the action must not have been > > > successful on the server > > > if you see ConnectionLossException then you know nothing about the > outcome > > > > > > > > > > > Is this investigation right? If so, it is possibly to distinguish > whether > > > > we succeed to apply the op on the server side? > > > > > > you have to read the znode again and compare the version, > > > but please remember that in the meantime (after your read response > > > leaves the server) someone could have change the znode > > > > > > I hope that helps > > > > > > Enrico > > > > > > > > > > > > > > Best, > > > > tison. > > > > > > > > [1] https://github.com/apache/pulsar/issues/13954 > > > > -- Best, tison.
