zhaohaidao commented on code in PR #2064:
URL: https://github.com/apache/zookeeper/pull/2064#discussion_r1330333678
##########
zookeeper-server/src/main/java/org/apache/zookeeper/server/PrepRequestProcessor.java:
##########
@@ -735,10 +735,18 @@ private String getParentPathAndValidate(String path)
throws BadArgumentsExceptio
}
private static int checkAndIncVersion(int currentVersion, int
expectedVersion, String path) throws KeeperException.BadVersionException {
- if (expectedVersion != -1 && expectedVersion != currentVersion) {
- throw new KeeperException.BadVersionException(path);
+ if (expectedVersion != -1) {
+ if (expectedVersion != currentVersion) {
+ throw new KeeperException.BadVersionException(path);
+ }
+ if (expectedVersion == -2) {
+ return 0;
+ } else {
+ return currentVersion + 1;
+ }
+ } else {
+ return currentVersion + 1;
Review Comment:
Thanks for your detailed explanation. I almost understand the background.
> The next version should be 0 when currentVersion is -2 irrespective of
expectedVersion.
I'm not sure if my understanding of this sentence is correct, what we can
agree on is that the currentVersion needs to be changed from -2 to 0.
But if currentVersion=-2, the equality check is skipped, I am worried that
there may be safety risks?
For example, in the following scenario, two clients concurrently initiate
setData requests. Counted as C1 and C2 respectively, the version numbers
queried before C1 and C2 initiated the update were both -6, and then
simultaneously initiated requests to ZkServer. The request initiated by C2 was
successfully processed. C1 was delayed for several seconds due to network
problems. Here, During this period, C2 initiated three more requests, causing
the version number to become -2. Then the network between C1 and ZkServer
returned to normal. At this time, ZkServer did not perform an equality check
because currentVersion=-2, resulting in C1's request being successfully
processed.
Is this situation in line with expectations? My personal understanding is
that this is not in line with expectations for C2 and violates the semantics of
CAS, because C1 successfully updated with an older version.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]