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".
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 6b52e66..ea31ef5 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 @@
{
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 @@
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 e562351..4e316cd 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 @@
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 5c285fb..5eb632f 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
@@ -1032,6 +1032,33 @@
}
@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
{
CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));