This is an automated email from the ASF dual-hosted git repository.

andor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new bc24f7c  ZOOKEEPER-3249: Avoid reverting the cversion and pzxid during 
replaying txns with fuzzy snapshot
bc24f7c is described below

commit bc24f7c01a7060267c99ef3201fbe96be9a12835
Author: Fangmin Lyu <[email protected]>
AuthorDate: Wed Jan 30 16:28:55 2019 +0100

    ZOOKEEPER-3249: Avoid reverting the cversion and pzxid during replaying 
txns with fuzzy snapshot
    
    Author: Fangmin Lyu <[email protected]>
    
    Reviewers: [email protected]
    
    Closes #780 from lvfangmin/ZOOKEEPER-3249
---
 .../main/java/org/apache/zookeeper/server/DataTree.java  | 11 +++++++++--
 .../java/org/apache/zookeeper/server/DataTreeTest.java   | 16 ++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java
index b51e51f..a0c83d6 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java
@@ -494,8 +494,15 @@ public class DataTree {
                 parentCVersion = parent.stat.getCversion();
                 parentCVersion++;
             }
-            parent.stat.setCversion(parentCVersion);
-            parent.stat.setPzxid(zxid);
+            // There is possibility that we'll replay txns for a node which
+            // was created and then deleted in the fuzzy range, and it's not
+            // exist in the snapshot, so replay the creation might revert the
+            // cversion and pzxid, need to check and only update when it's
+            // larger.
+            if (parentCVersion > parent.stat.getCversion()) {
+                parent.stat.setCversion(parentCVersion);
+                parent.stat.setPzxid(zxid);
+            }
             Long longval = aclCache.convertAcls(acl);
             DataNode child = new DataNode(data, longval, stat);
             parent.addChild(childName);
diff --git 
a/zookeeper-server/src/test/java/org/apache/zookeeper/server/DataTreeTest.java 
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/DataTreeTest.java
index 2f588d0..82cb9fd 100644
--- 
a/zookeeper-server/src/test/java/org/apache/zookeeper/server/DataTreeTest.java
+++ 
b/zookeeper-server/src/test/java/org/apache/zookeeper/server/DataTreeTest.java
@@ -154,6 +154,22 @@ public class DataTreeTest extends ZKTestCase {
     }
 
     @Test
+    public void testNoCversionRevert() throws Exception {
+        DataNode parent = dt.getNode("/");
+        dt.createNode("/test", new byte[0], null, 0, parent.stat.getCversion() 
+ 1, 1, 1);
+        int currentCversion = parent.stat.getCversion();
+        long currentPzxid = parent.stat.getPzxid();
+        dt.createNode("/test1", new byte[0], null, 0, currentCversion - 1, 1, 
1);
+        parent = dt.getNode("/");
+        int newCversion = parent.stat.getCversion();
+        long newPzxid = parent.stat.getPzxid();
+        Assert.assertTrue("<cversion, pzxid> verification failed. Expected: <" 
+
+                currentCversion + ", " + currentPzxid + ">, found: <" +
+                newCversion + ", " + newPzxid + ">",
+                (newCversion >= currentCversion && newPzxid >= currentPzxid));
+    }
+
+    @Test
     public void testPzxidUpdatedWhenDeletingNonExistNode() throws Exception {
         DataNode root = dt.getNode("/");
         long currentPzxid = root.stat.getPzxid();

Reply via email to