You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by an...@apache.org on 2019/01/30 15:28:59 UTC

[zookeeper] branch master updated: ZOOKEEPER-3249: Avoid reverting the cversion and pzxid during replaying txns with fuzzy snapshot

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 <fa...@apache.org>
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 <fa...@apache.org>
    
    Reviewers: andor@apache.org
    
    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();