From 7951c679eff567fcbf7f33b3d4a658ee23f91e84 Mon Sep 17 00:00:00 2001 From: arimu1 <19286898+arimu1@users.noreply.github.com> Date: Sat, 22 Aug 2026 11:28:37 +0700 Subject: [PATCH] GH-1084: Honor dontUseContainerParents for checkExists and namespace mkdir Fixes #1084. --- .../framework/imps/ExistsBuilderImpl.java | 12 ++-- .../curator/framework/imps/NamespaceImpl.java | 2 +- .../curator/framework/imps/TestFramework.java | 55 +++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java index 3df1c4ddf..8114fca66 100644 --- a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java +++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java @@ -68,8 +68,8 @@ public ACLableExistBuilderMain creatingParentsIfNeeded() { @Override public ACLableExistBuilderMain creatingParentContainersIfNeeded() { - createParentContainersIfNeeded = true; - createParentsIfNeeded = false; + createParentContainersIfNeeded = client.useContainerParentsIfAvailable(); + createParentsIfNeeded = true; return this; } @@ -194,7 +194,7 @@ public Stat forPath(String path) throws Exception { operationAndData, operationAndData.getData(), acling.getACLProviderForParents(), - createParentContainersIfNeeded); + createParentsAsContainers()); } else { client.processBackgroundOperation(operationAndData, null); } @@ -205,6 +205,10 @@ public Stat forPath(String path) throws Exception { return returnStat; } + private boolean createParentsAsContainers() { + return createParentContainersIfNeeded && client.useContainerParentsIfAvailable(); + } + private Stat pathInForeground(final String path) throws Exception { if (createParentContainersIfNeeded || createParentsIfNeeded) { final String parent = ZKPaths.getPathAndNode(path).getPath(); @@ -220,7 +224,7 @@ public Void call() throws Exception { parent, true, acling.getACLProviderForParents(), - createParentContainersIfNeeded); + createParentsAsContainers()); } catch (KeeperException.NodeExistsException e) { // ignore } catch (KeeperException.NoNodeException e) { diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceImpl.java index 7e4d53e92..f1d31c80c 100644 --- a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceImpl.java +++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceImpl.java @@ -73,7 +73,7 @@ public Object call() throws Exception { ZKPaths.makePath("/", namespace), true, client.getAclProvider(), - true); + client.useContainerParentsIfAvailable()); return null; } }); diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java index 07ecf3338..04adf5f64 100644 --- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java +++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java @@ -615,6 +615,61 @@ public void testExistsCreatingParents() throws Exception { } } + @Test + public void testExistsOverrideCreateParentContainers() throws Exception { + if (!checkForContainers()) { + return; + } + + CuratorFramework client = CuratorFrameworkFactory.builder() + .connectString(server.getConnectString()) + .retryPolicy(new RetryOneTime(1)) + .dontUseContainerParents() + .build(); + try { + client.start(); + assertNull(client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three")); + client.create().forPath("/one/two/three", "foo".getBytes()); + byte[] data = client.getData().forPath("/one/two/three"); + assertArrayEquals(data, "foo".getBytes()); + + client.delete().forPath("/one/two/three"); + new Timing().sleepABit(); + + assertNotNull(client.checkExists().forPath("/one/two")); + new Timing().sleepABit(); + assertNotNull(client.checkExists().forPath("/one")); + } finally { + CloseableUtils.closeQuietly(client); + } + } + + @Test + public void testNamespaceOverrideCreateParentContainers() throws Exception { + if (!checkForContainers()) { + return; + } + + CuratorFramework client = CuratorFrameworkFactory.builder() + .connectString(server.getConnectString()) + .retryPolicy(new RetryOneTime(1)) + .namespace("one") + .dontUseContainerParents() + .build(); + try { + client.start(); + client.create().forPath("/two"); + assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/one/two", false)); + + client.delete().forPath("/two"); + new Timing().sleepABit(); + + assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/one", false)); + } finally { + CloseableUtils.closeQuietly(client); + } + } + @Test public void testExistsCreatingParentsInBackground() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));