This is an automated email from the ASF dual-hosted git repository.
andor pushed a commit to branch branch-3.9
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/branch-3.9 by this push:
new 4c889a231 ZOOKEEPER-4846: Failure to reload database due to missing ACL
4c889a231 is described below
commit 4c889a23186dd898f8d54c26f71acc6f977969f9
Author: Andor Molnár <[email protected]>
AuthorDate: Tue Feb 11 10:43:20 2025 -0600
ZOOKEEPER-4846: Failure to reload database due to missing ACL
ZOOKEEPER-4846. Fix ACL reference on existing znode when trying to create
Reviewers: cnauroth, eolivelli, ztzg
Author: anmolnar
Closes #2222 from anmolnar/ZOOKEEPER-4846
(cherry picked from commit 8532163df198466913f26141c0278dc11dbf53ab)
Signed-off-by: Andor Molnar <[email protected]>
---
.../main/java/org/apache/zookeeper/server/DataTree.java | 5 +++--
.../java/org/apache/zookeeper/server/DataTreeTest.java | 16 ++++++++++++++++
2 files changed, 19 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 3b61c80d8..af937f834 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
@@ -462,8 +462,9 @@ public void createNode(final String path, byte[] data,
List<ACL> acl, long ephem
// we did for the global sessions.
Long acls = aclCache.convertAcls(acl);
- Set<String> children = parent.getChildren();
- if (children.contains(childName)) {
+ DataNode existingChild = nodes.get(path);
+ if (existingChild != null) {
+ existingChild.acl = acls;
throw new NodeExistsException();
}
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 07a69f14f..fc20ed320 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
@@ -23,6 +23,7 @@
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -631,6 +632,21 @@ public void testDigest() throws Exception {
}
}
+ @Test
+ public void testCreateNodeFixMissingACL() throws Exception {
+ DataTree dt = new DataTree();
+ ReferenceCountedACLCache aclCache = dt.getReferenceCountedAclCache();
+
+ dt.createNode("/the_parent", new byte[0], ZooDefs.Ids.CREATOR_ALL_ACL,
-1, 1, 1, 0);
+ Long aclId = dt.getNode("/the_parent").acl;
+ aclCache.removeUsage(aclId);
+ aclCache.purgeUnused();
+ // try to re-create the parent -> throws NodeExistsException, but
fixes the deleted ACL
+ assertThrows(NodeExistsException.class, () ->
+ dt.createNode("/the_parent", new byte[0],
ZooDefs.Ids.CREATOR_ALL_ACL, -1, 1, 1, 0));
+ dt.createNode("/the_parent/the_child", new byte[0],
ZooDefs.Ids.CREATOR_ALL_ACL, -1, 2, 2, 2);
+ }
+
private DataTree buildDataTreeForTest() {
final DataTree dt = new DataTree();
assertEquals(dt.lastProcessedZxid, 0);