Repository: curator Updated Branches: refs/heads/CURATOR-397 3d593105d -> 2cbbf9992
temp Curator/Snapshot dep - added test for TTL nodes Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/521652dc Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/521652dc Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/521652dc Branch: refs/heads/CURATOR-397 Commit: 521652dcaadfe04bca98bb3249507ca187f32e16 Parents: 027dee3 Author: randgalt <[email protected]> Authored: Fri Sep 30 14:43:05 2016 +0200 Committer: randgalt <[email protected]> Committed: Fri Sep 30 14:43:05 2016 +0200 ---------------------------------------------------------------------- .../curator/framework/api/CreateBuilder.java | 5 +- .../framework/imps/CreateBuilderImpl.java | 128 ++++++++----------- .../curator/framework/imps/TestTtlNodes.java | 88 +++++++++++++ pom.xml | 2 +- 4 files changed, 146 insertions(+), 77 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/521652dc/curator-framework/src/main/java/org/apache/curator/framework/api/CreateBuilder.java ---------------------------------------------------------------------- diff --git a/curator-framework/src/main/java/org/apache/curator/framework/api/CreateBuilder.java b/curator-framework/src/main/java/org/apache/curator/framework/api/CreateBuilder.java index 564d11b..8c98e0d 100644 --- a/curator-framework/src/main/java/org/apache/curator/framework/api/CreateBuilder.java +++ b/curator-framework/src/main/java/org/apache/curator/framework/api/CreateBuilder.java @@ -18,8 +18,9 @@ */ package org.apache.curator.framework.api; -public interface CreateBuilder extends - CreateBuilderMain +public interface CreateBuilder extends CreateBuilderMain { + CreateBuilderMain withTtl(long ttl); + CreateBuilderMain orSetData(); } http://git-wip-us.apache.org/repos/asf/curator/blob/521652dc/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 d7126dc..6ec2943 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 @@ -54,6 +54,7 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt private String protectedId; private ACLing acling; private Stat storingStat; + private long ttl; @VisibleForTesting boolean failNextCreateForTesting = false; @@ -74,6 +75,7 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt setDataIfExists = false; protectedId = null; storingStat = null; + ttl = -1; } @Override @@ -83,6 +85,13 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt return this; } + @Override + public CreateBuilderMain withTtl(long ttl) + { + this.ttl = ttl; + return this; + } + <T> TransactionCreateBuilder<T> asTransactionCreateBuilder(final T context, final CuratorMultiTransactionRecord transaction) { return new TransactionCreateBuilder<T>() @@ -123,7 +132,7 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt } String fixedPath = client.fixForNamespace(path); - transaction.add(Op.create(fixedPath, data, acling.getAclList(path), createMode), OperationType.CREATE, path); + transaction.add(Op.create(fixedPath, data, acling.getAclList(path), createMode, ttl), OperationType.CREATE, path); return context; } }; @@ -136,7 +145,8 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt return new CreateBackgroundModeStatACLable() { @Override - public CreateBackgroundModeACLable storingStatIn(Stat stat) { + public CreateBackgroundModeACLable storingStatIn(Stat stat) + { storingStat = stat; return asCreateBackgroundModeACLable(); } @@ -537,80 +547,50 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt { final TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Background"); - if(storingStat == null) - { - client.getZooKeeper().create - ( - operationAndData.getData().getPath(), - operationAndData.getData().getData(), - acling.getAclList(operationAndData.getData().getPath()), - createMode, - new AsyncCallback.StringCallback() - { - @Override - public void processResult(int rc, String path, Object ctx, String name) - { - trace.commit(); + client.getZooKeeper().create + ( + operationAndData.getData().getPath(), + operationAndData.getData().getData(), + acling.getAclList(operationAndData.getData().getPath()), + createMode, + new AsyncCallback.Create2Callback() { - if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded ) - { - backgroundCreateParentsThenNode(client, operationAndData, operationAndData.getData().getPath(), backgrounding, createParentsAsContainers); - } - else if ( (rc == KeeperException.Code.NODEEXISTS.intValue()) && setDataIfExists ) - { - backgroundSetData(client, operationAndData, operationAndData.getData().getPath(), backgrounding); - } - else - { - sendBackgroundResponse(rc, path, ctx, name, null, operationAndData); - } + @Override + public void processResult(int rc, String path, Object ctx, String name, Stat stat) { + trace.commit(); + + if ( (stat != null) && (storingStat != null) ) + { + storingStat.setAversion(stat.getAversion()); + storingStat.setCtime(stat.getCtime()); + storingStat.setCversion(stat.getCversion()); + storingStat.setCzxid(stat.getCzxid()); + storingStat.setDataLength(stat.getDataLength()); + storingStat.setEphemeralOwner(stat.getEphemeralOwner()); + storingStat.setMtime(stat.getMtime()); + storingStat.setMzxid(stat.getMzxid()); + storingStat.setNumChildren(stat.getNumChildren()); + storingStat.setPzxid(stat.getPzxid()); + storingStat.setVersion(stat.getVersion()); } - }, - backgrounding.getContext() - ); - } - else - { - client.getZooKeeper().create - ( - operationAndData.getData().getPath(), - operationAndData.getData().getData(), - acling.getAclList(operationAndData.getData().getPath()), - createMode, - new AsyncCallback.Create2Callback() { - - @Override - public void processResult(int rc, String path, Object ctx, String name, Stat stat) { - trace.commit(); - - if ( stat != null ) - { - storingStat.setAversion(stat.getAversion()); - storingStat.setCtime(stat.getCtime()); - storingStat.setCversion(stat.getCversion()); - storingStat.setCzxid(stat.getCzxid()); - storingStat.setDataLength(stat.getDataLength()); - storingStat.setEphemeralOwner(stat.getEphemeralOwner()); - storingStat.setMtime(stat.getMtime()); - storingStat.setMzxid(stat.getMzxid()); - storingStat.setNumChildren(stat.getNumChildren()); - storingStat.setPzxid(stat.getPzxid()); - storingStat.setVersion(stat.getVersion()); - } - if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded ) - { - backgroundCreateParentsThenNode(client, operationAndData, operationAndData.getData().getPath(), backgrounding, createParentsAsContainers); - } - else - { - sendBackgroundResponse(rc, path, ctx, name, stat, operationAndData); - } + if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded ) + { + backgroundCreateParentsThenNode(client, operationAndData, operationAndData.getData().getPath(), backgrounding, createParentsAsContainers); } - }, - backgrounding.getContext() - ); - } + else if ( (rc == KeeperException.Code.NODEEXISTS.intValue()) && setDataIfExists ) + { + backgroundSetData(client, operationAndData, operationAndData.getData().getPath(), backgrounding); + } + else + { + sendBackgroundResponse(rc, path, ctx, name, stat, operationAndData); + } + } + }, + backgrounding.getContext(), + ttl + ); } catch ( Throwable e ) { @@ -1052,14 +1032,14 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt { try { - createdPath = client.getZooKeeper().create(path, data, aclList, createMode, storingStat); + createdPath = client.getZooKeeper().create(path, data, aclList, createMode, storingStat, ttl); } catch ( KeeperException.NoNodeException e ) { if ( createParentsIfNeeded ) { ZKPaths.mkdirs(client.getZooKeeper(), path, false, client.getAclProvider(), createParentsAsContainers); - createdPath = client.getZooKeeper().create(path, data, acling.getAclList(path), createMode, storingStat); + createdPath = client.getZooKeeper().create(path, data, acling.getAclList(path), createMode, storingStat, ttl); } else { http://git-wip-us.apache.org/repos/asf/curator/blob/521652dc/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java ---------------------------------------------------------------------- diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java new file mode 100644 index 0000000..c544474 --- /dev/null +++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java @@ -0,0 +1,88 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * 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 + * + * 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 + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.curator.framework.imps; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.framework.api.BackgroundCallback; +import org.apache.curator.framework.api.CuratorEvent; +import org.apache.curator.retry.RetryOneTime; +import org.apache.curator.test.BaseClassForTests; +import org.apache.curator.test.Timing; +import org.apache.zookeeper.CreateMode; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import java.util.concurrent.CountDownLatch; + +public class TestTtlNodes extends BaseClassForTests +{ + @BeforeMethod + @Override + public void setup() throws Exception + { + System.setProperty("znode.container.checkIntervalMs", "1"); + super.setup(); + } + + @AfterMethod + @Override + public void teardown() throws Exception + { + super.teardown(); + System.clearProperty("znode.container.checkIntervalMs"); + } + + @Test + public void testBasic() throws Exception + { + try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) ) + { + client.start(); + + client.create().withTtl(10).creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_WITH_TTL).forPath("/a/b/c"); + Thread.sleep(20); + Assert.assertNull(client.checkExists().forPath("/a/b/c")); + } + } + + @Test + public void testBasicInBackground() throws Exception + { + try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) ) + { + client.start(); + + final CountDownLatch latch = new CountDownLatch(1); + BackgroundCallback callback = new BackgroundCallback() + { + @Override + public void processResult(CuratorFramework client, CuratorEvent event) throws Exception + { + latch.countDown(); + } + }; + client.create().withTtl(10).creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_WITH_TTL).inBackground(callback).forPath("/a/b/c"); + Assert.assertTrue(new Timing().awaitLatch(latch)); + Thread.sleep(20); + Assert.assertNull(client.checkExists().forPath("/a/b/c")); + } + } +} http://git-wip-us.apache.org/repos/asf/curator/blob/521652dc/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 905342c..b086df0 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ <jdk-version>1.7</jdk-version> <!-- versions --> - <zookeeper-version>3.5.1-alpha</zookeeper-version> + <zookeeper-version>3.6.0-SNAPSHOT</zookeeper-version> <maven-project-info-reports-plugin-version>2.7</maven-project-info-reports-plugin-version> <maven-bundle-plugin-version>2.3.7</maven-bundle-plugin-version> <maven-javadoc-plugin-version>2.10.3</maven-javadoc-plugin-version>
