> 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 > 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 >
