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();