Original PR breaks nodes with protection as the protection ID is stored in the create builder. This change fixes it.
Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/0b699a36 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/0b699a36 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/0b699a36 Branch: refs/heads/persistent-watch Commit: 0b699a368bbb5f3c72ab609fa590bf225c2a2d7a Parents: 144977f Author: randgalt <randg...@apache.org> Authored: Mon Jan 9 14:22:59 2017 -0500 Committer: randgalt <randg...@apache.org> Committed: Mon Jan 9 14:22:59 2017 -0500 ---------------------------------------------------------------------- .../framework/recipes/nodes/PersistentNode.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/0b699a36/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentNode.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentNode.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentNode.java index 45f74ca..1f655ed 100644 --- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentNode.java +++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentNode.java @@ -68,6 +68,7 @@ public class PersistentNode implements Closeable private final AtomicBoolean authFailure = new AtomicBoolean(false); private final BackgroundCallback backgroundCallback; private final boolean useProtection; + private final AtomicReference<CreateModable<ACLBackgroundPathAndBytesable<String>>> createMethod = new AtomicReference<CreateModable<ACLBackgroundPathAndBytesable<String>>>(null); private final CuratorWatcher watcher = new CuratorWatcher() { @Override @@ -364,9 +365,16 @@ public class PersistentNode implements Closeable String existingPath = nodePath.get(); String createPath = (existingPath != null && !useProtection) ? existingPath : basePath; - CreateModable<ACLBackgroundPathAndBytesable<String>> createMethod = useProtection ? - client.create().creatingParentContainersIfNeeded().withProtection() : client.create().creatingParentContainersIfNeeded(); - createMethod.withMode(getCreateMode(existingPath != null)).inBackground(backgroundCallback).forPath(createPath, data.get()); + CreateModable<ACLBackgroundPathAndBytesable<String>> localCreateMethod = createMethod.get(); + if ( localCreateMethod == null ) + { + CreateModable<ACLBackgroundPathAndBytesable<String>> tempCreateMethod = useProtection ? client.create().creatingParentContainersIfNeeded().withProtection() : client.create().creatingParentContainersIfNeeded(); + if ( createMethod.compareAndSet(null, tempCreateMethod) ) + { + localCreateMethod = tempCreateMethod; + } + } + localCreateMethod.withMode(getCreateMode(existingPath != null)).inBackground(backgroundCallback).forPath(createPath, data.get()); } catch ( Exception e ) {