This is an automated email from the ASF dual-hosted git repository.
fangmin 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 db53d02 ZOOKEEPER-3125: Only patching the pzxid when it's larger than
the current pzxid
db53d02 is described below
commit db53d02869faa7c9819689315daa3933125c89a8
Author: Fangmin Lyu <[email protected]>
AuthorDate: Thu Dec 20 22:17:52 2018 +0800
ZOOKEEPER-3125: Only patching the pzxid when it's larger than the current
pzxid
This previous fix in #605 has a corner case which might revert the pzxid,
it's being fixed when port to 3.5 in #647, update on master as well.
Author: Fangmin Lyu <[email protected]>
Reviewers: [email protected]
Closes #701 from lvfangmin/ZOOKEEPER-3125-Update
---
.../java/org/apache/zookeeper/server/DataTree.java | 7 +++++-
.../org/apache/zookeeper/server/DataTreeTest.java | 25 ++++++++++++++++++++++
2 files changed, 31 insertions(+), 1 deletion(-)
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 c24396a..b51e51f 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
@@ -569,7 +569,12 @@ public class DataTree {
}
synchronized (parent) {
parent.removeChild(childName);
- parent.stat.setPzxid(zxid);
+ // Only update pzxid when the zxid is larger than the current
pzxid,
+ // otherwise we might override some higher pzxid set by a create
+ // Txn, which could cause the cversion and pzxid inconsistent
+ if (zxid > parent.stat.getPzxid()) {
+ parent.stat.setPzxid(zxid);
+ }
}
DataNode node = nodes.get(path);
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 8c8240f..2f588d0 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
@@ -153,6 +153,31 @@ public class DataTreeTest extends ZKTestCase {
(newCversion == prevCversion + 1 && newPzxid == prevPzxid +
1));
}
+ @Test
+ public void testPzxidUpdatedWhenDeletingNonExistNode() throws Exception {
+ DataNode root = dt.getNode("/");
+ long currentPzxid = root.stat.getPzxid();
+
+ // pzxid updated with deleteNode on higher zxid
+ long zxid = currentPzxid + 1;
+ try {
+ dt.deleteNode("/testPzxidUpdatedWhenDeletingNonExistNode", zxid);
+ } catch (NoNodeException e) { /* expected */ }
+ root = dt.getNode("/");
+ currentPzxid = root.stat.getPzxid();
+ Assert.assertEquals(currentPzxid, zxid);
+
+ // pzxid not updated with smaller zxid
+ long prevPzxid = currentPzxid;
+ zxid = prevPzxid - 1;
+ try {
+ dt.deleteNode("/testPzxidUpdatedWhenDeletingNonExistNode", zxid);
+ } catch (NoNodeException e) { /* expected */ }
+ root = dt.getNode("/");
+ currentPzxid = root.stat.getPzxid();
+ Assert.assertEquals(currentPzxid, prevPzxid);
+ }
+
@Test(timeout = 60000)
public void testPathTrieClearOnDeserialize() throws Exception {