You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2016/01/18 22:04:12 UTC

[09/11] curator git commit: Merge branch 'master' into CURATOR-3.0

Merge branch 'master' into CURATOR-3.0

Conflicts:
	curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionCreateBuilder.java
	curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionSetDataBuilder.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
	curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/ba38d4c5
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/ba38d4c5
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/ba38d4c5

Branch: refs/heads/CURATOR-3.0
Commit: ba38d4c5ea59466c4f1dcda6dadcab9bf3262257
Parents: 9a03ea9 5d485b0
Author: randgalt <ra...@apache.org>
Authored: Mon Jan 18 15:57:02 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Mon Jan 18 15:57:02 2016 -0500

----------------------------------------------------------------------
 .../framework/api/VersionPathAndBytesable.java  | 25 ++++++++
 .../transaction/TransactionCreateBuilder.java   |  2 +
 .../transaction/TransactionSetDataBuilder.java  |  2 +
 .../framework/imps/CreateBuilderImpl.java       | 10 +--
 .../framework/imps/SetDataBuilderImpl.java      |  2 +-
 .../framework/imps/TestTransactionsOld.java     | 46 +++++++++++++-
 .../recipes/cache/DefaultTreeCacheSelector.java | 37 +++++++++++
 .../framework/recipes/cache/TreeCache.java      | 39 +++++++++---
 .../recipes/cache/TreeCacheSelector.java        | 66 ++++++++++++++++++++
 .../framework/recipes/cache/TestTreeCache.java  | 57 +++++++++++++++--
 10 files changed, 264 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionCreateBuilder.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionCreateBuilder.java
index cba0cba,f2ac146..d20c834
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionCreateBuilder.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionCreateBuilder.java
@@@ -23,10 -24,10 +24,11 @@@ import org.apache.curator.framework.api
  import org.apache.curator.framework.api.CreateModable;
  import org.apache.curator.framework.api.PathAndBytesable;
  
 -public interface TransactionCreateBuilder extends
 -    PathAndBytesable<CuratorTransactionBridge>,
 -    CreateModable<ACLPathAndBytesable<CuratorTransactionBridge>>,
 -    ACLPathAndBytesable<CuratorTransactionBridge>,
 -    ACLCreateModePathAndBytesable<CuratorTransactionBridge>,
 -    Compressible<ACLCreateModePathAndBytesable<CuratorTransactionBridge>>  {
 +public interface TransactionCreateBuilder<T> extends
 +    PathAndBytesable<T>,
 +    CreateModable<ACLPathAndBytesable<T>>,
 +    ACLPathAndBytesable<T>,
++    ACLCreateModePathAndBytesable<T>,
 +    Compressible<ACLPathAndBytesable<T>>
 +{
  }

http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionSetDataBuilder.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionSetDataBuilder.java
index 2d4d255,cc9e01c..84b25bb
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionSetDataBuilder.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/TransactionSetDataBuilder.java
@@@ -20,11 -20,13 +20,13 @@@ package org.apache.curator.framework.ap
  
  import org.apache.curator.framework.api.Compressible;
  import org.apache.curator.framework.api.PathAndBytesable;
+ import org.apache.curator.framework.api.VersionPathAndBytesable;
  import org.apache.curator.framework.api.Versionable;
  
 -public interface TransactionSetDataBuilder extends
 -    PathAndBytesable<CuratorTransactionBridge>,
 -    Versionable<PathAndBytesable<CuratorTransactionBridge>>,
 -    VersionPathAndBytesable<CuratorTransactionBridge>,
 -    Compressible<VersionPathAndBytesable<CuratorTransactionBridge>>
 +public interface TransactionSetDataBuilder<T> extends
 +    PathAndBytesable<T>,
 +    Versionable<PathAndBytesable<T>>,
++    VersionPathAndBytesable<T>,
 +    Compressible<PathAndBytesable<T>>
  {
  }

http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
index ada4bae,e11d74f..4d532ff
--- 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
@@@ -101,31 -89,31 +101,31 @@@ class CreateBuilderImpl implements Crea
                  CreateBuilderImpl.this.withMode(mode);
                  return this;
              }
-             
+ 
              @Override
 -            public ACLCreateModePathAndBytesable<CuratorTransactionBridge> compressed()
 +            public ACLPathAndBytesable<T> compressed()
              {
                  CreateBuilderImpl.this.compressed();
                  return this;
              }
-             
+ 
              @Override
 -            public CuratorTransactionBridge forPath(String path) throws Exception
 +            public T forPath(String path) throws Exception
              {
                  return forPath(path, client.getDefaultData());
              }
  
              @Override
 -            public CuratorTransactionBridge forPath(String path, byte[] data) throws Exception
 +            public T forPath(String path, byte[] data) throws Exception
-             {               
+             {
                  if ( compress )
                  {
                      data = client.getCompressionProvider().compress(path, data);
                  }
-                 
+ 
                  String fixedPath = client.fixForNamespace(path);
                  transaction.add(Op.create(fixedPath, data, acling.getAclList(path), createMode), OperationType.CREATE, path);
 -                return curatorTransaction;
 +                return context;
              }
          };
      }

http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
index 3ea704c,4117930..b150783
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
@@@ -61,10 -64,10 +61,10 @@@ class SetDataBuilderImpl implements Set
                  {
                      data = client.getCompressionProvider().compress(path, data);
                  }
-                 
+ 
                  String      fixedPath = client.fixForNamespace(path);
                  transaction.add(Op.setData(fixedPath, data, version), OperationType.SET_DATA, path);
 -                return curatorTransaction;
 +                return context;
              }
  
              @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
----------------------------------------------------------------------
diff --cc curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
index f0147d5,0000000..2c42d61
mode 100644,000000..100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
@@@ -1,141 -1,0 +1,185 @@@
 +/**
 + * 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 com.google.common.collect.Iterables;
 +import org.apache.curator.framework.CuratorFramework;
 +import org.apache.curator.framework.CuratorFrameworkFactory;
 +import org.apache.curator.framework.api.transaction.CuratorTransactionResult;
 +import org.apache.curator.framework.api.transaction.OperationType;
 +import org.apache.curator.retry.RetryOneTime;
 +import org.apache.curator.test.BaseClassForTests;
 +import org.apache.curator.utils.CloseableUtils;
 +import org.apache.zookeeper.CreateMode;
 +import org.apache.zookeeper.KeeperException;
++import org.apache.zookeeper.ZooDefs;
 +import org.apache.zookeeper.data.Stat;
 +import org.testng.Assert;
 +import org.testng.annotations.Test;
 +import java.util.Collection;
 +
 +@SuppressWarnings("deprecation")
 +public class TestTransactionsOld extends BaseClassForTests
 +{
 +    @Test
 +    public void     testCheckVersion() throws Exception
 +    {
 +        CuratorFramework        client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
 +        try
 +        {
 +            client.start();
 +            client.create().forPath("/foo");
 +            Stat        stat = client.setData().forPath("/foo", "new".getBytes());  // up the version
 +
 +            try
 +            {
 +                client.inTransaction()
 +                    .check().withVersion(stat.getVersion() + 1).forPath("/foo") // force a bad version
 +                .and()
 +                    .create().forPath("/bar")
 +                .and()
 +                    .commit();
 +
 +                Assert.fail();
 +            }
 +            catch ( KeeperException.BadVersionException correct )
 +            {
 +                // correct
 +            }
-             
++
 +            Assert.assertNull(client.checkExists().forPath("/bar"));
 +        }
 +        finally
 +        {
 +            CloseableUtils.closeQuietly(client);
 +        }
 +    }
 +
 +    @Test
 +    public void     testWithNamespace() throws Exception
 +    {
 +        CuratorFramework        client = CuratorFrameworkFactory.builder().connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).namespace("galt").build();
 +        try
 +        {
 +            client.start();
 +            Collection<CuratorTransactionResult>    results =
 +                client.inTransaction()
 +                    .create().forPath("/foo", "one".getBytes())
 +                .and()
 +                    .create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test-", "one".getBytes())
 +                .and()
 +                    .setData().forPath("/foo", "two".getBytes())
 +                .and()
 +                    .create().forPath("/foo/bar")
 +                .and()
 +                    .delete().forPath("/foo/bar")
 +                .and()
 +                    .commit();
 +
 +            Assert.assertTrue(client.checkExists().forPath("/foo") != null);
 +            Assert.assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
 +            Assert.assertEquals(client.getData().forPath("/foo"), "two".getBytes());
 +            Assert.assertTrue(client.checkExists().forPath("/foo/bar") == null);
 +
 +            CuratorTransactionResult    ephemeralResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/test-"));
 +            Assert.assertNotNull(ephemeralResult);
 +            Assert.assertNotEquals(ephemeralResult.getResultPath(), "/test-");
 +            Assert.assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
 +        }
 +        finally
 +        {
 +            CloseableUtils.closeQuietly(client);
 +        }
 +    }
 +
 +    @Test
++    public void     testWithCompression() throws Exception
++    {
++        CuratorFramework        client = CuratorFrameworkFactory.builder().connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).namespace("galt").build();
++        client.start();
++        try
++        {
++            Collection<CuratorTransactionResult>    results =
++                    client.inTransaction()
++                        .create().compressed().forPath("/foo", "one".getBytes())
++                    .and()
++                        .create().compressed().withACL(ZooDefs.Ids.READ_ACL_UNSAFE).forPath("/bar", "two".getBytes())
++                    .and()
++                        .create().compressed().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test-", "three".getBytes())
++                    .and()
++                        .create().compressed().withMode(CreateMode.PERSISTENT).withACL(ZooDefs.Ids.READ_ACL_UNSAFE).forPath("/baz", "four".getBytes())
++                    .and()
++                        .setData().compressed().withVersion(0).forPath("/foo", "five".getBytes())
++                    .and()
++                        .commit();
++
++            Assert.assertTrue(client.checkExists().forPath("/foo") != null);
++            Assert.assertEquals(client.getData().decompressed().forPath("/foo"), "five".getBytes());
++
++            Assert.assertTrue(client.checkExists().forPath("/bar") != null);
++            Assert.assertEquals(client.getData().decompressed().forPath("/bar"), "two".getBytes());
++            Assert.assertEquals(client.getACL().forPath("/bar"), ZooDefs.Ids.READ_ACL_UNSAFE);
++
++            CuratorTransactionResult    ephemeralResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/test-"));
++            Assert.assertNotNull(ephemeralResult);
++            Assert.assertNotEquals(ephemeralResult.getResultPath(), "/test-");
++            Assert.assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
++
++            Assert.assertTrue(client.checkExists().forPath("/baz") != null);
++            Assert.assertEquals(client.getData().decompressed().forPath("/baz"), "four".getBytes());
++            Assert.assertEquals(client.getACL().forPath("/baz"), ZooDefs.Ids.READ_ACL_UNSAFE);
++        }
++        finally
++        {
++            client.close();
++        }
++    }
++
++    @Test
 +    public void     testBasic() throws Exception
 +    {
 +        CuratorFramework        client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
 +        try
 +        {
 +            client.start();
 +            Collection<CuratorTransactionResult>    results =
 +                client.inTransaction()
 +                    .create().forPath("/foo")
 +                .and()
 +                    .create().forPath("/foo/bar", "snafu".getBytes())
 +                .and()
 +                    .commit();
 +
 +            Assert.assertTrue(client.checkExists().forPath("/foo/bar") != null);
 +            Assert.assertEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
 +
 +            CuratorTransactionResult    fooResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo"));
 +            CuratorTransactionResult    fooBarResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo/bar"));
 +            Assert.assertNotNull(fooResult);
 +            Assert.assertNotNull(fooBarResult);
 +            Assert.assertNotSame(fooResult, fooBarResult);
 +            Assert.assertEquals(fooResult.getResultPath(), "/foo");
 +            Assert.assertEquals(fooBarResult.getResultPath(), "/foo/bar");
 +        }
 +        finally
 +        {
 +            CloseableUtils.closeQuietly(client);
 +        }
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
----------------------------------------------------------------------
diff --cc curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
index 2558984,4d00266..81590f7
--- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
+++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java
@@@ -289,8 -296,9 +303,10 @@@ public class TreeCache implements Close
  
          void wasDeleted() throws Exception
          {
-             stat.set(null);
-             data.set(null);
+             Stat oldStat = stat.getAndSet(null);
+             byte[] oldData = data.getAndSet(null);
 -            client.clearWatcherReferences(this);
++            client.watches().remove(this).ofType(WatcherType.Any).inBackground().forPath(path);
++
              ConcurrentMap<String, TreeNode> childMap = children.getAndSet(null);
              if ( childMap != null )
              {
@@@ -532,12 -540,14 +548,15 @@@
       * @param dataIsCompressed if true, data in the path is compressed
       * @param executorService  Closeable ExecutorService to use for the TreeCache's background thread
       * @param createParentNodes true to create parent nodes as containers
+      * @param selector         the selector to use
       */
-     TreeCache(CuratorFramework client, String path, boolean cacheData, boolean dataIsCompressed, int maxDepth, final CloseableExecutorService executorService, boolean createParentNodes)
+     TreeCache(CuratorFramework client, String path, boolean cacheData, boolean dataIsCompressed, int maxDepth, final CloseableExecutorService executorService, boolean createParentNodes, TreeCacheSelector selector)
      {
          this.createParentNodes = createParentNodes;
+         this.selector = Preconditions.checkNotNull(selector, "selector cannot be null");
          this.root = new TreeNode(validatePath(path), null);
 -        this.client = Preconditions.checkNotNull(client, "client cannot be null");
++        Preconditions.checkNotNull(client, "client cannot be null");
 +        this.client = client.newWatcherRemoveCuratorFramework();
          this.cacheData = cacheData;
          this.dataIsCompressed = dataIsCompressed;
          this.maxDepth = maxDepth;

http://git-wip-us.apache.org/repos/asf/curator/blob/ba38d4c5/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
----------------------------------------------------------------------
diff --cc curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
index 151ea7e,ad7c417..173fcd7
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
@@@ -377,9 -424,10 +424,9 @@@ public class TestTreeCache extends Base
          assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/me");
  
          KillSession.kill(client.getZookeeperClient().getZooKeeper(), server.getConnectString());
 -        assertEvent(TreeCacheEvent.Type.CONNECTION_SUSPENDED);
          assertEvent(TreeCacheEvent.Type.CONNECTION_LOST);
          assertEvent(TreeCacheEvent.Type.CONNECTION_RECONNECTED);
-         assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/me");
+         assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/me", "data".getBytes());
  
          assertNoMoreEvents();
      }