Return-Path: X-Original-To: apmail-curator-commits-archive@minotaur.apache.org Delivered-To: apmail-curator-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 65B5017ACF for ; Tue, 21 Apr 2015 01:17:03 +0000 (UTC) Received: (qmail 37742 invoked by uid 500); 21 Apr 2015 01:17:03 -0000 Delivered-To: apmail-curator-commits-archive@curator.apache.org Received: (qmail 37707 invoked by uid 500); 21 Apr 2015 01:17:03 -0000 Mailing-List: contact commits-help@curator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@curator.apache.org Delivered-To: mailing list commits@curator.apache.org Received: (qmail 37698 invoked by uid 99); 21 Apr 2015 01:17:03 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Apr 2015 01:17:03 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 2905BE0986; Tue, 21 Apr 2015 01:17:03 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: randgalt@apache.org To: commits@curator.apache.org Message-Id: <3ff87cade74f4cc9812f29b8f1b62a6e@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: curator git commit: If the server successfully creates a Curator-protected node by crashes before returning to the client, Curator will incorrectly set the wrong value for the name field in the background Event causing this problem. 'name' should be the Date: Tue, 21 Apr 2015 01:17:03 +0000 (UTC) Repository: curator Updated Branches: refs/heads/master c9a5c4a23 -> c805679c8 If the server successfully creates a Curator-protected node by crashes before returning to the client, Curator will incorrectly set the wrong value for the name field in the background Event causing this problem. 'name' should be the full path instead of just the ZNode name Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/c805679c Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/c805679c Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/c805679c Branch: refs/heads/master Commit: c805679c8d4307360710a24cddc071cbbcb5ca75 Parents: c9a5c4a Author: randgalt Authored: Mon Apr 20 20:16:40 2015 -0500 Committer: randgalt Committed: Mon Apr 20 20:16:40 2015 -0500 ---------------------------------------------------------------------- .../framework/imps/CreateBuilderImpl.java | 14 +- .../curator/framework/imps/TestFramework.java | 215 +++++++++---------- .../framework/imps/TestFrameworkEdges.java | 86 +++++++- 3 files changed, 192 insertions(+), 123 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/c805679c/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java ---------------------------------------------------------------------- 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 5244d04..6eef4d4 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 @@ -597,6 +597,9 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation + * http://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.curator.framework.imps; import com.google.common.collect.Lists; - import org.apache.curator.framework.AuthInfo; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; @@ -43,7 +43,6 @@ import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; import org.testng.Assert; import org.testng.annotations.Test; - import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; @@ -55,14 +54,14 @@ import java.util.concurrent.TimeUnit; public class TestFramework extends BaseClassForTests { @Test - public void testConnectionState() throws Exception + public void testConnectionState() throws Exception { - Timing timing = new Timing(); - CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1)); + Timing timing = new Timing(); + CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1)); try { - final BlockingQueue queue = new LinkedBlockingQueue(); - ConnectionStateListener listener = new ConnectionStateListener() + final BlockingQueue queue = new LinkedBlockingQueue(); + ConnectionStateListener listener = new ConnectionStateListener() { @Override public void stateChanged(CuratorFramework client, ConnectionState newState) @@ -85,15 +84,15 @@ public class TestFramework extends BaseClassForTests } @Test - public void testNamespaceWithWatcher() throws Exception + public void testNamespaceWithWatcher() throws Exception { CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).namespace("aisa").retryPolicy(new RetryOneTime(1)).build(); client.start(); try { - final BlockingQueue queue = new LinkedBlockingQueue(); - Watcher watcher = new Watcher() + final BlockingQueue queue = new LinkedBlockingQueue(); + Watcher watcher = new Watcher() { @Override public void process(WatchedEvent event) @@ -112,7 +111,7 @@ public class TestFramework extends BaseClassForTests client.getChildren().usingWatcher(watcher).forPath("/base"); client.create().forPath("/base/child"); - String path = queue.take(); + String path = queue.take(); Assert.assertEquals(path, "/base"); } finally @@ -122,15 +121,15 @@ public class TestFramework extends BaseClassForTests } @Test - public void testNamespaceInBackground() throws Exception + public void testNamespaceInBackground() throws Exception { CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).namespace("aisa").retryPolicy(new RetryOneTime(1)).build(); client.start(); try { - final BlockingQueue queue = new LinkedBlockingQueue(); - CuratorListener listener = new CuratorListener() + final BlockingQueue queue = new LinkedBlockingQueue(); + CuratorListener listener = new CuratorListener() { @Override public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception @@ -146,12 +145,12 @@ public class TestFramework extends BaseClassForTests client.create().forPath("/base"); client.checkExists().inBackground().forPath("/base"); - String path = queue.poll(10, TimeUnit.SECONDS); + String path = queue.poll(10, TimeUnit.SECONDS); Assert.assertEquals(path, "/base"); client.getCuratorListenable().removeListener(listener); - BackgroundCallback callback = new BackgroundCallback() + BackgroundCallback callback = new BackgroundCallback() { @Override public void processResult(CuratorFramework client, CuratorEvent event) throws Exception @@ -170,7 +169,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testCreateACLSingleAuth() throws Exception + public void testCreateACLSingleAuth() throws Exception { CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder @@ -224,10 +223,10 @@ public class TestFramework extends BaseClassForTests { client.close(); } - } + } @Test - public void testACLDeprecatedApis() throws Exception + public void testACLDeprecatedApis() throws Exception { CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder() .connectString(server.getConnectString()) @@ -281,10 +280,10 @@ public class TestFramework extends BaseClassForTests // Try setting data with me1:pass1 client = builder - .connectString(server.getConnectString()) - .authorization("digest", "me2:pass2".getBytes()) - .retryPolicy(new RetryOneTime(1)) - .build(); + .connectString(server.getConnectString()) + .authorization("digest", "me2:pass2".getBytes()) + .retryPolicy(new RetryOneTime(1)) + .build(); client.start(); try { @@ -320,7 +319,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testCreateACLWithReset() throws Exception + public void testCreateACLWithReset() throws Exception { Timing timing = new Timing(); CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); @@ -381,15 +380,15 @@ public class TestFramework extends BaseClassForTests } @Test - public void testCreateParents() throws Exception + public void testCreateParents() throws Exception { - CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).build(); client.start(); try { client.create().creatingParentsIfNeeded().forPath("/one/two/three", "foo".getBytes()); - byte[] data = client.getData().forPath("/one/two/three"); + byte[] data = client.getData().forPath("/one/two/three"); Assert.assertEquals(data, "foo".getBytes()); client.create().creatingParentsIfNeeded().forPath("/one/two/another", "bar".getBytes()); @@ -403,11 +402,11 @@ public class TestFramework extends BaseClassForTests } @Test - public void testEnsurePathWithNamespace() throws Exception + public void testEnsurePathWithNamespace() throws Exception { final String namespace = "jz"; - CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).namespace(namespace).build(); client.start(); try @@ -427,16 +426,16 @@ public class TestFramework extends BaseClassForTests } @Test - public void testNamespace() throws Exception + public void testNamespace() throws Exception { final String namespace = "TestNamespace"; - - CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); + + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).namespace(namespace).build(); client.start(); try { - String actualPath = client.create().forPath("/test"); + String actualPath = client.create().forPath("/test"); Assert.assertEquals(actualPath, "/test"); Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/" + namespace + "/test", false)); Assert.assertNull(client.getZookeeperClient().getZooKeeper().exists("/test", false)); @@ -446,7 +445,7 @@ public class TestFramework extends BaseClassForTests Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/non", false)); client.create().forPath("/test/child", "hey".getBytes()); - byte[] bytes = client.getData().forPath("/test/child"); + byte[] bytes = client.getData().forPath("/test/child"); Assert.assertEquals(bytes, "hey".getBytes()); bytes = client.usingNamespace(null).getData().forPath("/" + namespace + "/test/child"); @@ -459,14 +458,14 @@ public class TestFramework extends BaseClassForTests } @Test - public void testCustomCallback() throws Exception + public void testCustomCallback() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { - final CountDownLatch latch = new CountDownLatch(1); - BackgroundCallback callback = new BackgroundCallback() + final CountDownLatch latch = new CountDownLatch(1); + BackgroundCallback callback = new BackgroundCallback() { @Override public void processResult(CuratorFramework client, CuratorEvent event) throws Exception @@ -490,7 +489,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testSync() throws Exception + public void testSync() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); @@ -515,7 +514,7 @@ public class TestFramework extends BaseClassForTests client.create().forPath("/head"); Assert.assertNotNull(client.checkExists().forPath("/head")); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(1); client.sync("/head", latch); Assert.assertTrue(latch.await(10, TimeUnit.SECONDS)); } @@ -526,7 +525,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testSyncNew() throws Exception + public void testSyncNew() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); @@ -535,7 +534,7 @@ public class TestFramework extends BaseClassForTests client.create().forPath("/head"); Assert.assertNotNull(client.checkExists().forPath("/head")); - final CountDownLatch latch = new CountDownLatch(1); + final CountDownLatch latch = new CountDownLatch(1); BackgroundCallback callback = new BackgroundCallback() { @Override @@ -557,32 +556,32 @@ public class TestFramework extends BaseClassForTests } @Test - public void testBackgroundDelete() throws Exception + public void testBackgroundDelete() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { client.getCuratorListenable().addListener - ( - new CuratorListener() - { - @Override - public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception + ( + new CuratorListener() { - if ( event.getType() == CuratorEventType.DELETE ) + @Override + public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception { - Assert.assertEquals(event.getPath(), "/head"); - ((CountDownLatch)event.getContext()).countDown(); + if ( event.getType() == CuratorEventType.DELETE ) + { + Assert.assertEquals(event.getPath(), "/head"); + ((CountDownLatch)event.getContext()).countDown(); + } } } - } - ); + ); client.create().forPath("/head"); Assert.assertNotNull(client.checkExists().forPath("/head")); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(1); client.delete().inBackground(latch).forPath("/head"); Assert.assertTrue(latch.await(10, TimeUnit.SECONDS)); Assert.assertNull(client.checkExists().forPath("/head")); @@ -594,7 +593,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testBackgroundDeleteWithChildren() throws Exception + public void testBackgroundDeleteWithChildren() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); @@ -619,7 +618,7 @@ public class TestFramework extends BaseClassForTests client.create().creatingParentsIfNeeded().forPath("/one/two/three/four"); Assert.assertNotNull(client.checkExists().forPath("/one/two/three/four")); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(1); client.delete().deletingChildrenIfNeeded().inBackground(latch).forPath("/one/two"); Assert.assertTrue(latch.await(10, TimeUnit.SECONDS)); Assert.assertNull(client.checkExists().forPath("/one/two")); @@ -631,7 +630,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testDelete() throws Exception + public void testDelete() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); @@ -651,7 +650,7 @@ public class TestFramework extends BaseClassForTests @Test public void testDeleteWithChildren() throws Exception { - CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).build(); client.start(); try @@ -671,7 +670,7 @@ public class TestFramework extends BaseClassForTests @Test public void testDeleteGuaranteedWithChildren() throws Exception { - CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); CuratorFramework client = builder.connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).build(); client.start(); try @@ -689,7 +688,7 @@ public class TestFramework extends BaseClassForTests } @Test - public void testGetSequentialChildren() throws Exception + public void testGetSequentialChildren() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); @@ -702,7 +701,7 @@ public class TestFramework extends BaseClassForTests client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/head/child"); } - List children = client.getChildren().forPath("/head"); + List children = client.getChildren().forPath("/head"); Assert.assertEquals(children.size(), 10); } finally @@ -712,50 +711,50 @@ public class TestFramework extends BaseClassForTests } @Test - public void testBackgroundGetDataWithWatch() throws Exception + public void testBackgroundGetDataWithWatch() throws Exception { - final byte[] data1 = {1, 2, 3}; - final byte[] data2 = {4, 5, 6, 7}; + final byte[] data1 = {1, 2, 3}; + final byte[] data2 = {4, 5, 6, 7}; CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { - final CountDownLatch watchedLatch = new CountDownLatch(1); + final CountDownLatch watchedLatch = new CountDownLatch(1); client.getCuratorListenable().addListener - ( - new CuratorListener() - { - @Override - public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception + ( + new CuratorListener() { - if ( event.getType() == CuratorEventType.GET_DATA ) - { - Assert.assertEquals(event.getPath(), "/test"); - Assert.assertEquals(event.getData(), data1); - ((CountDownLatch)event.getContext()).countDown(); - } - else if ( event.getType() == CuratorEventType.WATCHED ) + @Override + public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception { - if ( event.getWatchedEvent().getType() == Watcher.Event.EventType.NodeDataChanged ) + if ( event.getType() == CuratorEventType.GET_DATA ) { Assert.assertEquals(event.getPath(), "/test"); - watchedLatch.countDown(); + Assert.assertEquals(event.getData(), data1); + ((CountDownLatch)event.getContext()).countDown(); + } + else if ( event.getType() == CuratorEventType.WATCHED ) + { + if ( event.getWatchedEvent().getType() == Watcher.Event.EventType.NodeDataChanged ) + { + Assert.assertEquals(event.getPath(), "/test"); + watchedLatch.countDown(); + } } } } - } - ); + ); client.create().forPath("/test", data1); - CountDownLatch backgroundLatch = new CountDownLatch(1); + CountDownLatch backgroundLatch = new CountDownLatch(1); client.getData().watched().inBackground(backgroundLatch).forPath("/test"); Assert.assertTrue(backgroundLatch.await(10, TimeUnit.SECONDS)); client.setData().forPath("/test", data2); Assert.assertTrue(watchedLatch.await(10, TimeUnit.SECONDS)); - byte[] checkData = client.getData().forPath("/test"); + byte[] checkData = client.getData().forPath("/test"); Assert.assertEquals(checkData, data2); } finally @@ -765,29 +764,29 @@ public class TestFramework extends BaseClassForTests } @Test - public void testBackgroundCreate() throws Exception + public void testBackgroundCreate() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { client.getCuratorListenable().addListener - ( - new CuratorListener() - { - @Override - public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception + ( + new CuratorListener() { - if ( event.getType() == CuratorEventType.CREATE ) + @Override + public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception { - Assert.assertEquals(event.getPath(), "/test"); - ((CountDownLatch)event.getContext()).countDown(); + if ( event.getType() == CuratorEventType.CREATE ) + { + Assert.assertEquals(event.getPath(), "/test"); + ((CountDownLatch)event.getContext()).countDown(); + } } } - } - ); + ); - CountDownLatch latch = new CountDownLatch(1); + CountDownLatch latch = new CountDownLatch(1); client.create().inBackground(latch).forPath("/test", new byte[]{1, 2, 3}); Assert.assertTrue(latch.await(10, TimeUnit.SECONDS)); } @@ -798,20 +797,20 @@ public class TestFramework extends BaseClassForTests } @Test - public void testCreateModes() throws Exception + public void testCreateModes() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { - byte[] writtenBytes = {1, 2, 3}; + byte[] writtenBytes = {1, 2, 3}; client.create().forPath("/test", writtenBytes); // should be persistent client.close(); client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); - byte[] readBytes = client.getData().forPath("/test"); + byte[] readBytes = client.getData().forPath("/test"); Assert.assertEquals(writtenBytes, readBytes); client.create().withMode(CreateMode.EPHEMERAL).forPath("/ghost", writtenBytes); @@ -822,10 +821,10 @@ public class TestFramework extends BaseClassForTests readBytes = client.getData().forPath("/test"); Assert.assertEquals(writtenBytes, readBytes); - Stat stat = client.checkExists().forPath("/ghost"); + Stat stat = client.checkExists().forPath("/ghost"); Assert.assertNull(stat); - String realPath = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/pseq", writtenBytes); + String realPath = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/pseq", writtenBytes); Assert.assertNotSame(realPath, "/pseq"); client.close(); @@ -852,13 +851,13 @@ public class TestFramework extends BaseClassForTests } @Test - public void testSimple() throws Exception + public void testSimple() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { - String path = client.create().withMode(CreateMode.PERSISTENT).forPath("/test", new byte[]{1, 2, 3}); + String path = client.create().withMode(CreateMode.PERSISTENT).forPath("/test", new byte[]{1, 2, 3}); Assert.assertEquals(path, "/test"); } finally @@ -866,9 +865,9 @@ public class TestFramework extends BaseClassForTests client.close(); } } - + @Test - public void testSequentialWithTrailingSeparator() throws Exception + public void testSequentialWithTrailingSeparator() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); @@ -876,12 +875,12 @@ public class TestFramework extends BaseClassForTests { client.create().forPath("/test"); //This should create a node in the form of "/test/00000001" - String path = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test/"); + String path = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test/"); Assert.assertTrue(path.startsWith("/test/")); } finally { client.close(); } - } + } } http://git-wip-us.apache.org/repos/asf/curator/blob/c805679c/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java ---------------------------------------------------------------------- diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java index 9c02c7d..af7ae2b 100644 --- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java +++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

* Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -44,6 +44,7 @@ import org.apache.zookeeper.Watcher; import org.apache.zookeeper.data.Stat; import org.testng.Assert; import org.testng.annotations.Test; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; @@ -56,6 +57,69 @@ public class TestFrameworkEdges extends BaseClassForTests private final Timing timing = new Timing(); @Test + public void testPathsFromProtectingInBackground() throws Exception + { + for ( CreateMode mode : CreateMode.values() ) + { + internalTestPathsFromProtectingInBackground(mode); + } + } + + private void internalTestPathsFromProtectingInBackground(CreateMode mode) throws Exception + { + CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), 1, new RetryOneTime(1)); + try + { + client.start(); + + client.create().creatingParentsIfNeeded().forPath("/a/b/c"); + + final BlockingQueue paths = new ArrayBlockingQueue(2); + BackgroundCallback callback = new BackgroundCallback() + { + @Override + public void processResult(CuratorFramework client, CuratorEvent event) throws Exception + { + paths.put(event.getName()); + paths.put(event.getPath()); + } + }; + final String TEST_PATH = "/a/b/c/test-"; + client.create().withMode(mode).inBackground(callback).forPath(TEST_PATH); + + String name1 = paths.take(); + String path1 = paths.take(); + + client.close(); + + client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), 1, new RetryOneTime(1)); + client.start(); + CreateBuilderImpl createBuilder = (CreateBuilderImpl)client.create().withProtection(); + + client.create().forPath(createBuilder.adjustPath(TEST_PATH)); + + createBuilder.debugForceFindProtectedNode = true; + createBuilder.withMode(mode).inBackground(callback).forPath(TEST_PATH); + + String name2 = paths.take(); + String path2 = paths.take(); + + Assert.assertEquals(ZKPaths.getPathAndNode(name1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath()); + Assert.assertEquals(ZKPaths.getPathAndNode(name2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath()); + Assert.assertEquals(ZKPaths.getPathAndNode(path1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath()); + Assert.assertEquals(ZKPaths.getPathAndNode(path2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath()); + + client.delete().deletingChildrenIfNeeded().forPath("/a/b/c"); + client.delete().forPath("/a/b"); + client.delete().forPath("/a"); + } + finally + { + CloseableUtils.closeQuietly(client); + } + } + + @Test public void connectionLossWithBackgroundTest() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), 1, new RetryOneTime(1)); @@ -66,20 +130,20 @@ public class TestFrameworkEdges extends BaseClassForTests client.getZookeeperClient().blockUntilConnectedOrTimedOut(); server.close(); client.getChildren().inBackground - ( - new BackgroundCallback() - { - public void processResult(CuratorFramework client, CuratorEvent event) throws Exception + ( + new BackgroundCallback() { - latch.countDown(); + public void processResult(CuratorFramework client, CuratorEvent event) throws Exception + { + latch.countDown(); + } } - } - ).forPath("/"); + ).forPath("/"); Assert.assertTrue(timing.awaitLatch(latch)); } finally { - client.close(); + CloseableUtils.closeQuietly(client); } }