This is an automated email from the ASF dual-hosted git repository.
kezhuw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/curator.git
The following commit(s) were added to refs/heads/master by this push:
new 9aea8ff9 CURATOR-666: Fix twice unfixForNamespace in background create
(#454)
9aea8ff9 is described below
commit 9aea8ff99df5e807a8004a294dd1dde8f93d48dd
Author: Kezhu Wang <[email protected]>
AuthorDate: Wed Apr 19 22:39:32 2023 +0800
CURATOR-666: Fix twice unfixForNamespace in background create (#454)
Previously, `unfixForNamespace` was called twice in background create.
This will accidentally unfix node path if it happens to contain
namespace in its prefix. Say, creating "/zoo/a" in namespace "/zoo" will
get path "/a".
---
.../curator/framework/imps/CreateBuilderImpl.java | 12 ++++------
.../curator/framework/imps/CuratorEventImpl.java | 2 +-
.../curator/framework/imps/TestFramework.java | 27 ++++++++++++++++++++++
3 files changed, 33 insertions(+), 8 deletions(-)
diff --git
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
index 6b52e662..ea31ef53 100644
---
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
+++
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
@@ -797,8 +797,7 @@ public class CreateBuilderImpl implements CreateBuilder,
CreateBuilder2, Backgro
{
if (
!client.getZookeeperClient().getRetryPolicy().allowRetry(e) )
{
- final CuratorEvent event = makeCuratorEvent(client,
e.code().intValue(), e.getPath(), null, e.getPath(), null);
-
client.processBackgroundOperation(mainOperationAndData, event);
+ sendBackgroundResponse(client, e.code().intValue(),
e.getPath(), null, null, null, mainOperationAndData);
throw e;
}
// otherwise safe to ignore as it will get retried
@@ -895,14 +894,13 @@ public class CreateBuilderImpl implements CreateBuilder,
CreateBuilder2, Backgro
private void sendBackgroundResponse(int rc, String path, Object ctx,
String name, Stat stat, OperationAndData<PathAndBytes> operationAndData)
{
- client.processBackgroundOperation(operationAndData,
makeCuratorEvent(client, rc, path, ctx, name, stat));
+ sendBackgroundResponse(client, rc, path, ctx, name, stat,
operationAndData);
}
- private static CuratorEvent makeCuratorEvent(CuratorFrameworkImpl client,
int rc, String path, Object ctx, String name, Stat stat)
+ private static <T> void sendBackgroundResponse(CuratorFrameworkImpl
client, int rc, String path, Object ctx, String name, Stat stat,
OperationAndData<T> operationAndData)
{
- path = client.unfixForNamespace(path);
- name = client.unfixForNamespace(name);
- return new CuratorEventImpl(client, CuratorEventType.CREATE, rc, path,
name, ctx, stat, null, null, null, null, null);
+ CuratorEvent event = new CuratorEventImpl(client,
CuratorEventType.CREATE, rc, path, name, ctx, stat, null, null, null, null,
null);
+ client.processBackgroundOperation(operationAndData, event);
}
private ACLCreateModePathAndBytesable<String>
asACLCreateModePathAndBytesable()
diff --git
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
index e5623510..4e316cd6 100644
---
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
+++
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
@@ -133,7 +133,7 @@ class CuratorEventImpl implements CuratorEvent
this.resultCode = resultCode;
this.opResults = (opResults != null) ? ImmutableList.copyOf(opResults)
: null;
this.path = client.unfixForNamespace(path);
- this.name = name;
+ this.name = client.unfixForNamespace(name);
this.context = context;
this.stat = stat;
this.data = data;
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 5c285fbe..5eb632f9 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
@@ -1031,6 +1031,33 @@ public class TestFramework extends BaseClassForTests
}
}
+ @Test
+ public void testBackgroundPathWithNamespace() throws Exception {
+ CuratorFrameworkFactory.Builder builder =
CuratorFrameworkFactory.builder();
+ try (CuratorFramework client = builder
+ .connectString(server.getConnectString())
+ .retryPolicy(new RetryOneTime(1))
+ .build()) {
+ client.start();
+ CuratorFramework namespaceZoo = client.usingNamespace("zoo");
+ BlockingQueue<CuratorEvent> events = new LinkedBlockingQueue<>();
+ BackgroundCallback callback = (CuratorFramework ignored,
CuratorEvent event) -> {
+ events.add(event);
+ };
+
+
namespaceZoo.create().creatingParentsIfNeeded().inBackground(callback).forPath("/zoo/a");
+ CuratorEvent event = events.poll(10, TimeUnit.SECONDS);
+ assertNotNull(event);
+ assertEquals("/zoo/a", event.getPath());
+ assertEquals("/zoo/a", event.getName());
+
+ client.checkExists().inBackground(callback).forPath("/zoo/zoo/a");
+ event = events.poll(10, TimeUnit.SECONDS);
+ assertNotNull(event);
+ assertEquals("/zoo/zoo/a", event.getPath());
+ }
+ }
+
@Test
public void testCreateModes() throws Exception
{