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/03/10 23:55:29 UTC

[1/8] curator git commit: [maven-release-plugin] prepare release apache-curator-2.10.0

Repository: curator
Updated Branches:
  refs/heads/CURATOR-3.0 8ef32cc27 -> 062a7d750


[maven-release-plugin] prepare release apache-curator-2.10.0


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

Branch: refs/heads/CURATOR-3.0
Commit: 4956fd9604d3188d58552001f1e8fea587bad810
Parents: 567cac3
Author: randgalt <ra...@apache.org>
Authored: Mon Feb 8 13:25:42 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Mon Feb 8 13:25:42 2016 -0500

----------------------------------------------------------------------
 curator-client/pom.xml             | 4 ++--
 curator-examples/pom.xml           | 2 +-
 curator-framework/pom.xml          | 4 ++--
 curator-recipes/pom.xml            | 4 ++--
 curator-test/pom.xml               | 4 ++--
 curator-x-discovery-server/pom.xml | 4 ++--
 curator-x-discovery/pom.xml        | 4 ++--
 curator-x-rpc/pom.xml              | 4 ++--
 pom.xml                            | 4 ++--
 9 files changed, 17 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-client/pom.xml
----------------------------------------------------------------------
diff --git a/curator-client/pom.xml b/curator-client/pom.xml
index 9a12344..f25e331 100644
--- a/curator-client/pom.xml
+++ b/curator-client/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-client</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Client</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-examples/pom.xml
----------------------------------------------------------------------
diff --git a/curator-examples/pom.xml b/curator-examples/pom.xml
index 67505ad..f3a7840 100644
--- a/curator-examples/pom.xml
+++ b/curator-examples/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-examples</artifactId>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-framework/pom.xml
----------------------------------------------------------------------
diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml
index 3dbbdbb..d71c7fa 100644
--- a/curator-framework/pom.xml
+++ b/curator-framework/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-framework</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Framework</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-recipes/pom.xml
----------------------------------------------------------------------
diff --git a/curator-recipes/pom.xml b/curator-recipes/pom.xml
index bbcb749..5534a52 100644
--- a/curator-recipes/pom.xml
+++ b/curator-recipes/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-recipes</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Recipes</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-test/pom.xml
----------------------------------------------------------------------
diff --git a/curator-test/pom.xml b/curator-test/pom.xml
index 2f5455d..ff7cd11 100644
--- a/curator-test/pom.xml
+++ b/curator-test/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-test</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
 
     <name>Curator Testing</name>
     <description>Unit testing utilities.</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-x-discovery-server/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery-server/pom.xml b/curator-x-discovery-server/pom.xml
index da80059..7f7a4c1 100644
--- a/curator-x-discovery-server/pom.xml
+++ b/curator-x-discovery-server/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-x-discovery-server</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery Server</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-x-discovery/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery/pom.xml b/curator-x-discovery/pom.xml
index bcb896f..7bcb64f 100644
--- a/curator-x-discovery/pom.xml
+++ b/curator-x-discovery/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-x-discovery</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/curator-x-rpc/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-rpc/pom.xml b/curator-x-rpc/pom.xml
index 2b16996..8bbce93 100644
--- a/curator-x-rpc/pom.xml
+++ b/curator-x-rpc/pom.xml
@@ -22,12 +22,12 @@
     <parent>
         <artifactId>apache-curator</artifactId>
         <groupId>org.apache.curator</groupId>
-        <version>2.9.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>curator-x-rpc</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
 
     <name>Curator RPC Proxy</name>
     <description>A proxy that bridges non-java environments with the Curator framework and recipes</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/4956fd96/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index c13a8b5..33f22cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.apache.curator</groupId>
     <artifactId>apache-curator</artifactId>
-    <version>2.9.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>pom</packaging>
 
     <name>Apache Curator</name>
@@ -98,7 +98,7 @@
         <connection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git</connection>
         <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git
         </developerConnection>
-        <tag>apache-curator-2.8.0</tag>
+        <tag>apache-curator-2.10.0</tag>
     </scm>
 
     <issueManagement>


[7/8] curator git commit: Merge branch 'master' into CURATOR-3.0

Posted by ra...@apache.org.
http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
index 58fae29,0000000..3d4e96d
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
@@@ -1,322 -1,0 +1,335 @@@
 +/**
 + * 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.RetryLoop;
 +import org.apache.curator.TimeTrace;
 +import org.apache.curator.framework.api.*;
 +import org.apache.curator.utils.DebugUtils;
 +import org.apache.zookeeper.AsyncCallback;
 +import org.apache.zookeeper.KeeperException;
 +import org.apache.zookeeper.Watcher;
 +import org.apache.zookeeper.Watcher.WatcherType;
 +import org.apache.zookeeper.ZooKeeper;
 +import java.util.concurrent.Callable;
 +import java.util.concurrent.Executor;
 +
 +
- public class RemoveWatchesBuilderImpl implements RemoveWatchesBuilder, RemoveWatchesType, RemoveWatchesLocal, BackgroundOperation<String>
++public class RemoveWatchesBuilderImpl implements RemoveWatchesBuilder, RemoveWatchesType, RemoveWatchesLocal, BackgroundOperation<String>, ErrorListenerPathable<Void>
 +{
 +    private CuratorFrameworkImpl client;
 +    private Watcher watcher;
 +    private CuratorWatcher curatorWatcher;
 +    private WatcherType watcherType;
 +    private boolean guaranteed;
 +    private boolean local;
 +    private boolean quietly;    
 +    private Backgrounding backgrounding;
 +    
 +    public RemoveWatchesBuilderImpl(CuratorFrameworkImpl client)
 +    {
 +        this.client = client;
 +        this.watcher = null;
 +        this.curatorWatcher = null;
 +        this.watcherType = WatcherType.Any;
 +        this.guaranteed = false;
 +        this.local = false;
 +        this.quietly = false;
 +        this.backgrounding = new Backgrounding();
 +    }
 +
 +    void internalRemoval(Watcher watcher, String path) throws Exception
 +    {
 +        this.watcher = watcher;
 +        watcherType = WatcherType.Any;
 +        quietly = true;
 +        guaranteed = true;
 +        if ( Boolean.getBoolean(DebugUtils.PROPERTY_REMOVE_WATCHERS_IN_FOREGROUND) )
 +        {
 +            this.backgrounding = new Backgrounding();
 +            pathInForeground(path);
 +        }
 +        else
 +        {
 +            this.backgrounding = new Backgrounding(true);
 +            pathInBackground(path);
 +        }
 +    }
 +
 +    @Override
 +    public RemoveWatchesType remove(Watcher watcher)
 +    {
 +        this.watcher = watcher;
 +        this.curatorWatcher = null;
 +        return this;
 +    }
 +    
 +    @Override
 +    public RemoveWatchesType remove(CuratorWatcher watcher)
 +    {
 +        this.watcher = null;
 +        this.curatorWatcher = watcher;
 +        return this;
 +    }    
 +
 +    @Override
 +    public RemoveWatchesType removeAll()
 +    {
 +        this.watcher = null;
 +        this.curatorWatcher = null;
 +        return this;
 +    }
 +
 +    @Override
 +    public RemoveWatchesLocal ofType(WatcherType watcherType)
 +    {
 +        this.watcherType = watcherType;
 +        
 +        return this;
 +    }
 +
 +    @Override
-     public Pathable<Void> inBackground(BackgroundCallback callback, Object context)
++    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Object context)
 +    {
 +        backgrounding = new Backgrounding(callback, context);
 +        return this;
 +    }
 +
 +    @Override
-     public Pathable<Void> inBackground(BackgroundCallback callback, Object context, Executor executor)
++    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Object context, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(client, callback, context, executor);
 +        return this;
 +    }
 +
 +    @Override
-     public Pathable<Void> inBackground(BackgroundCallback callback)
++    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback)
 +    {
 +        backgrounding = new Backgrounding(callback);
 +        return this;
 +    }
 +
 +    @Override
-     public Pathable<Void> inBackground(BackgroundCallback callback, Executor executor)
++    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(client, callback, executor);
 +        return this;
 +    }
 +
 +    @Override
-     public Pathable<Void> inBackground()
++    public ErrorListenerPathable<Void> inBackground()
 +    {
 +        backgrounding = new Backgrounding(true);
 +        return this;
 +    }
 +
 +    @Override
-     public Pathable<Void> inBackground(Object context)
++    public ErrorListenerPathable<Void> inBackground(Object context)
 +    {
 +        backgrounding = new Backgrounding(context);
 +        return this;
 +    }
-     
++
++    @Override
++    public Pathable<Void> withUnhandledErrorListener(UnhandledErrorListener listener)
++    {
++        backgrounding = new Backgrounding(backgrounding, listener);
++        return this;
++    }
++
 +    @Override
 +    public RemoveWatchesLocal guaranteed()
 +    {
 +        guaranteed = true;
 +        return this;
 +    }    
 +
 +    @Override
 +    public BackgroundPathableQuietlyable<Void> locally()
 +    {
 +        local = true;
 +        return this;
 +    }
 +    
 +    @Override
 +    public BackgroundPathable<Void> quietly()
 +    {
 +        quietly = true;
 +        return this;
 +    }
 +    
 +    @Override
 +    public Void forPath(String path) throws Exception
 +    {
 +        final String adjustedPath = client.fixForNamespace(path);
 +        
 +        if(backgrounding.inBackground())
 +        {
 +            pathInBackground(adjustedPath);
 +        }
 +        else
 +        {
 +            pathInForeground(adjustedPath);
 +        }        
 +        
 +        return null;
 +    }    
 +    
 +    private void pathInBackground(final String path)
 +    {
 +        OperationAndData.ErrorCallback<String>  errorCallback = null;
 +        
 +        //Only need an error callback if we're in guaranteed mode
 +        if(guaranteed)
 +        {
 +            errorCallback = new OperationAndData.ErrorCallback<String>()
 +            {
 +                @Override
 +                public void retriesExhausted(OperationAndData<String> operationAndData)
 +                {
 +                    client.getFailedRemoveWatcherManager().addFailedOperation(new FailedRemoveWatchManager.FailedRemoveWatchDetails(path, watcher));
 +                }            
 +            };
 +        }
 +        
 +        client.processBackgroundOperation(new OperationAndData<String>(this, path, backgrounding.getCallback(),
 +                                                                       errorCallback, backgrounding.getContext(), !local), null);
 +    }
 +    
 +    private void pathInForeground(final String path) throws Exception
 +    {
 +        NamespaceWatcher namespaceWatcher = makeNamespaceWatcher(path);
 +        //For the local case we don't want to use the normal retry loop and we don't want to block until a connection is available.
 +        //We just execute the removeWatch, and if it fails, ZK will just remove local watches.
 +        if ( local )
 +        {
 +            ZooKeeper zkClient = client.getZooKeeper();
 +            if ( namespaceWatcher != null )
 +            {
 +                zkClient.removeWatches(path, namespaceWatcher, watcherType, local);
 +            }
 +            else
 +            {
 +                zkClient.removeAllWatches(path, watcherType, local);
 +            }
 +        }
 +        else
 +        {
 +            final NamespaceWatcher finalNamespaceWatcher = namespaceWatcher;
 +            RetryLoop.callWithRetry(client.getZookeeperClient(),
 +                    new Callable<Void>()
 +                    {
 +                        @Override
 +                        public Void call() throws Exception
 +                        {
 +                            try
 +                            {
 +                                ZooKeeper zkClient = client.getZookeeperClient().getZooKeeper();
 +
 +                                if ( finalNamespaceWatcher != null )
 +                                {
 +                                    zkClient.removeWatches(path, finalNamespaceWatcher, watcherType, false);
 +                                }
 +                                else
 +                                {
 +                                    zkClient.removeAllWatches(path, watcherType, false);
 +                                }
 +                            }
 +                            catch(Exception e)
 +                            {
 +                                if( RetryLoop.isRetryException(e) && guaranteed )
 +                                {
 +                                    //Setup the guaranteed handler
 +                                    client.getFailedRemoveWatcherManager().addFailedOperation(new FailedRemoveWatchManager.FailedRemoveWatchDetails(path, finalNamespaceWatcher));
 +                                    throw e;
 +                                }
 +                                else if(e instanceof KeeperException.NoWatcherException && quietly)
 +                                {
 +                                    // ignore
 +                                }
 +                                else
 +                                {
 +                                    //Rethrow
 +                                    throw e;
 +                                }
 +                            }
 +                     
 +                            return null;
 +                        }
 +            });
 +        }
 +    }
 +
 +    private NamespaceWatcher makeNamespaceWatcher(String path)
 +    {
 +        NamespaceWatcher namespaceWatcher = null;
 +        if ( watcher != null )
 +        {
 +            if ( watcher instanceof NamespaceWatcher )
 +            {
 +                namespaceWatcher = (NamespaceWatcher)watcher;
 +            }
 +            else
 +            {
 +                namespaceWatcher = new NamespaceWatcher(client, watcher, path);
 +            }
 +        }
 +        else if ( curatorWatcher != null )
 +        {
 +            namespaceWatcher = new NamespaceWatcher(client, curatorWatcher, path);
 +        }
 +        return namespaceWatcher;
 +    }
 +
 +    @Override
 +    public void performBackgroundOperation(final OperationAndData<String> operationAndData)
 +            throws Exception
 +    {
-         final TimeTrace   trace = client.getZookeeperClient().startTracer("RemoteWatches-Background");
-         
-         AsyncCallback.VoidCallback callback = new AsyncCallback.VoidCallback()
++        try
 +        {
-             @Override
-             public void processResult(int rc, String path, Object ctx)
++            final TimeTrace   trace = client.getZookeeperClient().startTracer("RemoteWatches-Background");
++
++            AsyncCallback.VoidCallback callback = new AsyncCallback.VoidCallback()
 +            {
-                 trace.commit();
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.REMOVE_WATCHES, rc, path, null, ctx, null, null, null, null, null, null);
-                 client.processBackgroundOperation(operationAndData, event);                
-             }
-         };
++                @Override
++                public void processResult(int rc, String path, Object ctx)
++                {
++                    trace.commit();
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.REMOVE_WATCHES, rc, path, null, ctx, null, null, null, null, null, null);
++                    client.processBackgroundOperation(operationAndData, event);
++                }
++            };
 +
-         ZooKeeper zkClient = client.getZooKeeper();
-         NamespaceWatcher namespaceWatcher = makeNamespaceWatcher(operationAndData.getData());
-         if(namespaceWatcher == null)
-         {
-             zkClient.removeAllWatches(operationAndData.getData(), watcherType, local, callback, operationAndData.getContext());
++            ZooKeeper zkClient = client.getZooKeeper();
++            NamespaceWatcher namespaceWatcher = makeNamespaceWatcher(operationAndData.getData());
++            if(namespaceWatcher == null)
++            {
++                zkClient.removeAllWatches(operationAndData.getData(), watcherType, local, callback, operationAndData.getContext());
++            }
++            else
++            {
++                zkClient.removeWatches(operationAndData.getData(), namespaceWatcher, watcherType, local, callback, operationAndData.getContext());
++            }
 +        }
-         else
++        catch ( Throwable e )
 +        {
-             zkClient.removeWatches(operationAndData.getData(), namespaceWatcher, watcherType, local, callback, operationAndData.getContext());
++            backgrounding.checkError(e);
 +        }
-         
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
index 17e88f8,5507529..312071c
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
@@@ -124,26 -131,33 +131,33 @@@ class SetACLBuilderImpl implements SetA
      @Override
      public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
      {
-         final TimeTrace     trace = client.getZookeeperClient().startTracer("SetACLBuilderImpl-Background");
-         String              path = operationAndData.getData();
-         client.getZooKeeper().setACL
-         (
-             path,
-             acling.getAclList(path),
-             version,
-             new AsyncCallback.StatCallback()
-             {
-                 @SuppressWarnings({"unchecked"})
-                 @Override
-                 public void processResult(int rc, String path, Object ctx, Stat stat)
+         try
+         {
+             final TimeTrace     trace = client.getZookeeperClient().startTracer("SetACLBuilderImpl-Background");
+             String              path = operationAndData.getData();
+             client.getZooKeeper().setACL
+             (
+                 path,
+                 acling.getAclList(path),
+                 version,
+                 new AsyncCallback.StatCallback()
                  {
-                     trace.commit();
-                     CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_ACL, rc, path, null, ctx, stat, null, null, null, null, null);
-                     client.processBackgroundOperation(operationAndData, event);
-                 }
-             },
-             backgrounding.getContext()
-         );
+                     @SuppressWarnings({"unchecked"})
+                     @Override
+                     public void processResult(int rc, String path, Object ctx, Stat stat)
+                     {
+                         trace.commit();
 -                        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_ACL, rc, path, null, ctx, stat, null, null, null, null);
++                        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_ACL, rc, path, null, ctx, stat, null, null, null, null, null);
+                         client.processBackgroundOperation(operationAndData, event);
+                     }
+                 },
+                 backgrounding.getContext()
+             );
+         }
+         catch ( Throwable e )
+         {
+             backgrounding.checkError(e);
+         }
      }
  
      private Stat pathInForeground(final String path) throws Exception

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/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 7057c11,62e39cf..e75377d
--- 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
@@@ -20,14 -20,8 +20,7 @@@ package org.apache.curator.framework.im
  
  import org.apache.curator.RetryLoop;
  import org.apache.curator.TimeTrace;
- import org.apache.curator.framework.api.BackgroundCallback;
- import org.apache.curator.framework.api.BackgroundPathAndBytesable;
- import org.apache.curator.framework.api.CuratorEvent;
- import org.apache.curator.framework.api.CuratorEventType;
- import org.apache.curator.framework.api.PathAndBytesable;
- import org.apache.curator.framework.api.SetDataBackgroundVersionable;
- import org.apache.curator.framework.api.SetDataBuilder;
- import org.apache.curator.framework.api.VersionPathAndBytesable;
+ import org.apache.curator.framework.api.*;
 -import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
  import org.apache.curator.framework.api.transaction.OperationType;
  import org.apache.curator.framework.api.transaction.TransactionSetDataBuilder;
  import org.apache.zookeeper.AsyncCallback;
@@@ -202,27 -197,41 +195,41 @@@ class SetDataBuilderImpl implements Set
      }
  
      @Override
+     public PathAndBytesable<Stat> withUnhandledErrorListener(UnhandledErrorListener listener)
+     {
+         backgrounding = new Backgrounding(backgrounding, listener);
+         return this;
+     }
+ 
+     @Override
      public void performBackgroundOperation(final OperationAndData<PathAndBytes> operationAndData) throws Exception
      {
-         final TimeTrace   trace = client.getZookeeperClient().startTracer("SetDataBuilderImpl-Background");
-         client.getZooKeeper().setData
-         (
-             operationAndData.getData().getPath(),
-             operationAndData.getData().getData(),
-             version,
-             new AsyncCallback.StatCallback()
-             {
-                 @SuppressWarnings({"unchecked"})
-                 @Override
-                 public void processResult(int rc, String path, Object ctx, Stat stat)
+         try
+         {
+             final TimeTrace   trace = client.getZookeeperClient().startTracer("SetDataBuilderImpl-Background");
+             client.getZooKeeper().setData
+             (
+                 operationAndData.getData().getPath(),
+                 operationAndData.getData().getData(),
+                 version,
+                 new AsyncCallback.StatCallback()
                  {
-                     trace.commit();
-                     CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_DATA, rc, path, null, ctx, stat, null, null, null, null, null);
-                     client.processBackgroundOperation(operationAndData, event);
-                 }
-             },
-             backgrounding.getContext()
-         );
+                     @SuppressWarnings({"unchecked"})
+                     @Override
+                     public void processResult(int rc, String path, Object ctx, Stat stat)
+                     {
+                         trace.commit();
 -                        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_DATA, rc, path, null, ctx, stat, null, null, null, null);
++                        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_DATA, rc, path, null, ctx, stat, null, null, null, null, null);
+                         client.processBackgroundOperation(operationAndData, event);
+                     }
+                 },
+                 backgrounding.getContext()
+             );
+         }
+         catch ( Throwable e )
+         {
+             backgrounding.checkError(e);
+         }
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
index be4d33a,1e5f371..51b4e04
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
@@@ -81,23 -83,37 +83,37 @@@ public class SyncBuilderImpl implement
      }
  
      @Override
-     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
+     public Pathable<Void> withUnhandledErrorListener(UnhandledErrorListener listener)
      {
-         final TimeTrace trace = client.getZookeeperClient().startTracer("SyncBuilderImpl-Background");
-         final String path = operationAndData.getData();
-         String adjustedPath = client.fixForNamespace(path);
+         backgrounding = new Backgrounding(backgrounding, listener);
+         return this;
+     }
  
-         AsyncCallback.VoidCallback voidCallback = new AsyncCallback.VoidCallback()
+     @Override
+     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
+     {
+         try
          {
-             @Override
-             public void processResult(int rc, String path, Object ctx)
+             final TimeTrace trace = client.getZookeeperClient().startTracer("SyncBuilderImpl-Background");
+             final String path = operationAndData.getData();
+             String adjustedPath = client.fixForNamespace(path);
+ 
+             AsyncCallback.VoidCallback voidCallback = new AsyncCallback.VoidCallback()
              {
-                 trace.commit();
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, path, ctx, null, null, null, null, null, null);
-                 client.processBackgroundOperation(operationAndData, event);
-             }
-         };
-         client.getZooKeeper().sync(adjustedPath, voidCallback, backgrounding.getContext());
+                 @Override
+                 public void processResult(int rc, String path, Object ctx)
+                 {
+                     trace.commit();
 -                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, path, ctx, null, null, null, null, null);
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, path, ctx, null, null, null, null, null, null);
+                     client.processBackgroundOperation(operationAndData, event);
+                 }
+             };
+             client.getZooKeeper().sync(adjustedPath, voidCallback, backgrounding.getContext());
+         }
+         catch ( Throwable e )
+         {
+             backgrounding.checkError(e);
+         }
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
----------------------------------------------------------------------
diff --cc curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
index 83dab6b,8e21929..b9fd5c9
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
@@@ -20,9 -20,9 +20,10 @@@
  package org.apache.curator.framework.imps;
  
  import com.google.common.collect.Lists;
 +import com.google.common.collect.Queues;
  import org.apache.curator.framework.CuratorFramework;
  import org.apache.curator.framework.CuratorFrameworkFactory;
+ import org.apache.curator.framework.api.ACLProvider;
  import org.apache.curator.framework.api.BackgroundCallback;
  import org.apache.curator.framework.api.CuratorEvent;
  import org.apache.curator.framework.api.UnhandledErrorListener;
@@@ -34,23 -34,66 +35,71 @@@ import org.apache.curator.test.BaseClas
  import org.apache.curator.test.Timing;
  import org.apache.curator.utils.CloseableUtils;
  import org.apache.zookeeper.KeeperException.Code;
+ import org.apache.zookeeper.data.ACL;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
  import org.testng.Assert;
  import org.testng.annotations.Test;
 -import java.util.Arrays;
  import java.util.List;
 +import java.util.concurrent.BlockingQueue;
  import java.util.concurrent.CountDownLatch;
 +import java.util.concurrent.TimeUnit;
  import java.util.concurrent.atomic.AtomicBoolean;
  import java.util.concurrent.atomic.AtomicLong;
  import java.util.concurrent.atomic.AtomicReference;
  
  public class TestFrameworkBackground extends BaseClassForTests
  {
 +    private final Logger log = LoggerFactory.getLogger(getClass());
 +
      @Test
+     public void testErrorListener() throws Exception
+     {
+         ACLProvider badAclProvider = new ACLProvider()
+         {
+             @Override
+             public List<ACL> getDefaultAcl()
+             {
+                 throw new UnsupportedOperationException();
+             }
+ 
+             @Override
+             public List<ACL> getAclForPath(String path)
+             {
+                 throw new UnsupportedOperationException();
+             }
+         };
+         CuratorFramework client = CuratorFrameworkFactory.builder()
+             .connectString(server.getConnectString())
+             .retryPolicy(new RetryOneTime(1))
+             .aclProvider(badAclProvider)
+             .build();
+         try
+         {
+             client.start();
+ 
+             final CountDownLatch errorLatch = new CountDownLatch(1);
+             UnhandledErrorListener listener = new UnhandledErrorListener()
+             {
+                 @Override
+                 public void unhandledError(String message, Throwable e)
+                 {
+                     if ( e instanceof UnsupportedOperationException )
+                     {
+                         errorLatch.countDown();
+                     }
+                 }
+             };
+             client.create().inBackground().withUnhandledErrorListener(listener).forPath("/foo");
+             Assert.assertTrue(new Timing().awaitLatch(errorLatch));
+         }
+         finally
+         {
+             CloseableUtils.closeQuietly(client);
+         }
+     }
+ 
+     @Test
      public void testListenerConnectedAtStart() throws Exception
      {
          server.stop();


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

Posted by ra...@apache.org.
Merge branch 'master' into CURATOR-3.0

Conflicts:
	curator-client/pom.xml
	curator-examples/pom.xml
	curator-framework/pom.xml
	curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
	curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
	curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
	curator-recipes/pom.xml
	curator-test/pom.xml
	curator-x-discovery-server/pom.xml
	curator-x-discovery/pom.xml
	curator-x-rpc/pom.xml
	pom.xml


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

Branch: refs/heads/CURATOR-3.0
Commit: 062a7d750788a187f1d41df0bf0a6a5926a78d3a
Parents: 8ef32cc 8499680
Author: randgalt <ra...@apache.org>
Authored: Thu Mar 10 17:55:14 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Thu Mar 10 17:55:14 2016 -0500

----------------------------------------------------------------------
 .../framework/api/BackgroundEnsembleable.java   |   2 +-
 .../api/BackgroundPathAndBytesable.java         |   2 +-
 .../framework/api/BackgroundPathable.java       |   2 +-
 .../api/ErrorListenerEnsembleable.java          |  14 ++
 .../api/ErrorListenerMultiTransactionMain.java  |  16 ++
 .../api/ErrorListenerPathAndBytesable.java      |  14 ++
 .../framework/api/ErrorListenerPathable.java    |  14 ++
 .../api/ErrorListenerReconfigBuilderMain.java   |  14 ++
 .../curator/framework/api/GetConfigBuilder.java |   2 +-
 .../curator/framework/api/ReconfigBuilder.java  |   2 +-
 .../transaction/CuratorMultiTransaction.java    |   3 +-
 .../curator/framework/imps/Backgrounding.java   |  80 +++++--
 .../framework/imps/CreateBuilderImpl.java       | 236 ++++++++++---------
 .../imps/CuratorMultiTransactionImpl.java       |  55 +++--
 .../framework/imps/DeleteBuilderImpl.java       |  84 ++++---
 .../framework/imps/ExistsBuilderImpl.java       |  63 ++---
 .../framework/imps/GetACLBuilderImpl.java       |  50 ++--
 .../framework/imps/GetChildrenBuilderImpl.java  |  60 +++--
 .../framework/imps/GetConfigBuilderImpl.java    |  87 +++----
 .../framework/imps/GetDataBuilderImpl.java      |  94 ++++----
 .../framework/imps/ReconfigBuilderImpl.java     |  52 ++--
 .../imps/RemoveWatchesBuilderImpl.java          |  65 +++--
 .../framework/imps/SetACLBuilderImpl.java       |  66 ++++--
 .../framework/imps/SetDataBuilderImpl.java      |  85 ++++---
 .../curator/framework/imps/SyncBuilderImpl.java |  56 +++--
 .../framework/imps/TestFrameworkBackground.java |  49 ++++
 26 files changed, 791 insertions(+), 476 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundEnsembleable.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundEnsembleable.java
index c8b323f,0000000..5f9703a
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundEnsembleable.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundEnsembleable.java
@@@ -1,25 -1,0 +1,25 @@@
 +/**
 + * 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.api;
 +
 +public interface BackgroundEnsembleable<T> extends
-     Backgroundable<Ensembleable<T>>,
++    Backgroundable<ErrorListenerEnsembleable<T>>,
 +    Ensembleable<T>
 +{
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerEnsembleable.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerEnsembleable.java
index 0000000,0000000..1072baa
new file mode 100644
--- /dev/null
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerEnsembleable.java
@@@ -1,0 -1,0 +1,14 @@@
++package org.apache.curator.framework.api;
++
++public interface ErrorListenerEnsembleable<T> extends Ensembleable<T>
++{
++    /**
++     * Set an error listener for this background operation. If an exception
++     * occurs while processing the call in the background, this listener will
++     * be called
++     *
++     * @param listener the listener
++     * @return this for chaining
++     */
++    Ensembleable<T> withUnhandledErrorListener(UnhandledErrorListener listener);
++}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerMultiTransactionMain.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerMultiTransactionMain.java
index 0000000,0000000..a217004
new file mode 100644
--- /dev/null
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerMultiTransactionMain.java
@@@ -1,0 -1,0 +1,16 @@@
++package org.apache.curator.framework.api;
++
++import org.apache.curator.framework.api.transaction.CuratorMultiTransactionMain;
++
++public interface ErrorListenerMultiTransactionMain<T> extends CuratorMultiTransactionMain
++{
++    /**
++     * Set an error listener for this background operation. If an exception
++     * occurs while processing the call in the background, this listener will
++     * be called
++     *
++     * @param listener the listener
++     * @return this for chaining
++     */
++    CuratorMultiTransactionMain withUnhandledErrorListener(UnhandledErrorListener listener);
++}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerReconfigBuilderMain.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerReconfigBuilderMain.java
index 0000000,0000000..163ecc5
new file mode 100644
--- /dev/null
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerReconfigBuilderMain.java
@@@ -1,0 -1,0 +1,14 @@@
++package org.apache.curator.framework.api;
++
++public interface ErrorListenerReconfigBuilderMain extends ReconfigBuilderMain
++{
++    /**
++     * Set an error listener for this background operation. If an exception
++     * occurs while processing the call in the background, this listener will
++     * be called
++     *
++     * @param listener the listener
++     * @return this for chaining
++     */
++    ReconfigBuilderMain withUnhandledErrorListener(UnhandledErrorListener listener);
++}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/GetConfigBuilder.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/GetConfigBuilder.java
index d137f28,0000000..3c926d4
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/GetConfigBuilder.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/GetConfigBuilder.java
@@@ -1,28 -1,0 +1,28 @@@
 +/**
 + * 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.api;
 +
 +public interface GetConfigBuilder extends
 +    Ensembleable<byte[]>,
-     Backgroundable<Ensembleable<byte[]>>,
++    Backgroundable<ErrorListenerEnsembleable<byte[]>>,
 +    Watchable<BackgroundEnsembleable<byte[]>>,
 +    Statable<WatchBackgroundEnsembleable<byte[]>>
 +{
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/ReconfigBuilder.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/ReconfigBuilder.java
index d8a2cc2,0000000..233558d
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/ReconfigBuilder.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/ReconfigBuilder.java
@@@ -1,26 -1,0 +1,26 @@@
 +/**
 + * 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.api;
 +
 +public interface ReconfigBuilder extends
 +    ReconfigBuilderMain,
-     Backgroundable<ReconfigBuilderMain>
++    Backgroundable<ErrorListenerReconfigBuilderMain>
 +{
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/CuratorMultiTransaction.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/api/transaction/CuratorMultiTransaction.java
index 07bf191,0000000..e919a33
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/CuratorMultiTransaction.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/transaction/CuratorMultiTransaction.java
@@@ -1,27 -1,0 +1,28 @@@
 +/**
 + * 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.api.transaction;
 +
 +import org.apache.curator.framework.api.Backgroundable;
++import org.apache.curator.framework.api.ErrorListenerMultiTransactionMain;
 +
 +public interface CuratorMultiTransaction extends
-     Backgroundable<CuratorMultiTransactionMain>,
++    Backgroundable<ErrorListenerMultiTransactionMain>,
 +    CuratorMultiTransactionMain
 +{
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/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 57adae3,0f893d8..ace163b
--- 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
@@@ -525,157 -508,40 +532,164 @@@ class CreateBuilderImpl implements Crea
      @Override
      public void performBackgroundOperation(final OperationAndData<PathAndBytes> operationAndData) throws Exception
      {
-         final TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Background");
-         
-         if(storingStat == null)
+         try
          {
-             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();
+             final TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Background");
 -            client.getZooKeeper().create
 +
-                         if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded )
-                         {
-                             backgroundCreateParentsThenNode(client, operationAndData, operationAndData.getData().getPath(), backgrounding, createParentsAsContainers);
-                         }
-                         else if ( (rc == KeeperException.Code.NODEEXISTS.intValue()) && setDataIfExists )
++            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)
                          {
-                             backgroundSetData(client, operationAndData, operationAndData.getData().getPath(), backgrounding);
+                             trace.commit();
+ 
+                             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, operationAndData);
++                                sendBackgroundResponse(rc, path, ctx, name, null, operationAndData);
+                             }
                          }
-                         else
-                         {
-                             sendBackgroundResponse(rc, path, ctx, name, null, operationAndData);
+                     },
+                     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);
++                            }
 +                        }
-                     }
-                 },
-                 backgrounding.getContext()
-             );
++                    },
++                    backgrounding.getContext()
++                );
++            }
          }
-         else
+         catch ( Throwable e )
          {
-             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);
-                         }
-                     }
-                 },
-                 backgrounding.getContext()
-             );
+             backgrounding.checkError(e);
          }
      }
 +    
 +    @Override
 +    public CreateProtectACLCreateModePathAndBytesable<String> storingStatIn(Stat stat) {
 +        storingStat = stat;
 +        
 +        return new CreateProtectACLCreateModePathAndBytesable<String>() {
 +
 +            @Override
 +            public BackgroundPathAndBytesable<String> withACL(List<ACL> aclList) {
 +                return CreateBuilderImpl.this.withACL(aclList);
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground() {
++            public ErrorListenerPathAndBytesable<String> inBackground() {
 +                return CreateBuilderImpl.this.inBackground();
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground(Object context) {
++            public ErrorListenerPathAndBytesable<String> inBackground(Object context) {
 +                return CreateBuilderImpl.this.inBackground(context);
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback) {
 +                return CreateBuilderImpl.this.inBackground(callback);
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context) {
 +                return CreateBuilderImpl.this.inBackground(callback, context);
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor) {
 +                return CreateBuilderImpl.this.inBackground(callback, executor);
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context,
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context,
 +                    Executor executor) {
 +                return CreateBuilderImpl.this.inBackground(callback, context, executor);
 +            }
 +
 +            @Override
 +            public String forPath(String path, byte[] data) throws Exception {
 +                return CreateBuilderImpl.this.forPath(path, data);
 +            }
 +
 +            @Override
 +            public String forPath(String path) throws Exception {
 +                return CreateBuilderImpl.this.forPath(path);
 +            }
 +
 +            @Override
 +            public ACLBackgroundPathAndBytesable<String> withMode(CreateMode mode) {
 +                return CreateBuilderImpl.this.withMode(mode);
 +            }
 +
 +            @Override
 +            public ACLCreateModeBackgroundPathAndBytesable<String> withProtection() {
 +                return CreateBuilderImpl.this.withProtection();
 +            }
 +
 +            @Override
 +            public ProtectACLCreateModePathAndBytesable<String> creatingParentsIfNeeded() {
 +                return CreateBuilderImpl.this.creatingParentsIfNeeded();
 +            }
 +
 +            @Override
 +            public ProtectACLCreateModePathAndBytesable<String> creatingParentContainersIfNeeded() {
 +                return CreateBuilderImpl.this.creatingParentContainersIfNeeded();
 +            }  
 +        };
 +    }
  
      private static String getProtectedPrefix(String protectedId)
      {
@@@ -804,141 -634,6 +818,141 @@@
              }
          };
      }
 +    
 +    private CreateBackgroundModeACLable asCreateBackgroundModeACLable()
 +    {
 +        return new CreateBackgroundModeACLable() {
 +            
 +            @Override
 +            public BackgroundPathAndBytesable<String> withACL(List<ACL> aclList) {
 +                return CreateBuilderImpl.this.withACL(aclList);
 +            }
 +            
 +            @Override
 +            public ACLBackgroundPathAndBytesable<String> withMode(CreateMode mode) {
 +                return CreateBuilderImpl.this.withMode(mode);
 +            }
 +            
 +            @Override
 +            public String forPath(String path) throws Exception {
 +                return CreateBuilderImpl.this.forPath(path);
 +            }
 +            
 +            @Override
 +            public String forPath(String path, byte[] data) throws Exception {
 +                return CreateBuilderImpl.this.forPath(path, data);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor) {
 +                return CreateBuilderImpl.this.inBackground(callback, context, executor);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor) {
 +                return CreateBuilderImpl.this.inBackground(callback, executor);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context) {
 +                return CreateBuilderImpl.this.inBackground(callback, context);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback) {
 +                return CreateBuilderImpl.this.inBackground(callback);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(Object context) {
++            public ErrorListenerPathAndBytesable<String> inBackground(Object context) {
 +                return CreateBuilderImpl.this.inBackground(context);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground() {
++            public ErrorListenerPathAndBytesable<String> inBackground() {
 +                return CreateBuilderImpl.this.inBackground();
 +            }
 +            
 +            @Override
 +            public ACLPathAndBytesable<String> withProtectedEphemeralSequential() {
 +                return CreateBuilderImpl.this.withProtectedEphemeralSequential();
 +            }
 +            
 +            @Override
 +            public ACLCreateModePathAndBytesable<String> creatingParentsIfNeeded() {
 +                createParentsIfNeeded = true;
 +                return asACLCreateModePathAndBytesable();
 +            }
 +            
 +            @Override
 +            public ACLCreateModePathAndBytesable<String> creatingParentContainersIfNeeded() {
 +                setCreateParentsAsContainers();
 +                return asACLCreateModePathAndBytesable();
 +            }
 +        };
 +    }
 +    
 +    private ACLCreateModeStatBackgroundPathAndBytesable<String> asACLCreateModeStatBackgroundPathAndBytesable()
 +    {
 +        return new ACLCreateModeStatBackgroundPathAndBytesable<String>()
 +        {
 +            @Override
 +            public BackgroundPathAndBytesable<String> withACL(List<ACL> aclList) {
 +                return CreateBuilderImpl.this.withACL(aclList);
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground() {
++            public ErrorListenerPathAndBytesable<String> inBackground() {
 +                return CreateBuilderImpl.this.inBackground();
 +            }
 +
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor) {
 +                return CreateBuilderImpl.this.inBackground(callback, context, executor);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor) {
 +                return CreateBuilderImpl.this.inBackground(callback, executor);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context) {
 +                return CreateBuilderImpl.this.inBackground(callback, context);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(BackgroundCallback callback) {
++            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback) {
 +                return CreateBuilderImpl.this.inBackground(callback);
 +            }
 +            
 +            @Override
-             public PathAndBytesable<String> inBackground(Object context) {
++            public ErrorListenerPathAndBytesable<String> inBackground(Object context) {
 +                return CreateBuilderImpl.this.inBackground(context);
 +            }
 +
 +            @Override
 +            public String forPath(String path) throws Exception {
 +                return CreateBuilderImpl.this.forPath(path);
 +            }
 +            
 +            @Override
 +            public String forPath(String path, byte[] data) throws Exception {
 +                return CreateBuilderImpl.this.forPath(path, data);
 +            }
 +
 +            @Override
 +            public ACLBackgroundPathAndBytesable<String> withMode(CreateMode mode) {
 +                return CreateBuilderImpl.this.withMode(mode);
 +            }
 +
 +            @Override
 +            public ACLCreateModeBackgroundPathAndBytesable<String> storingStatIn(Stat stat) {
 +                storingStat = stat;
 +                return CreateBuilderImpl.this;
 +            }            
 +        };
 +    }
  
      @VisibleForTesting
      volatile boolean debugForceFindProtectedNode = false;

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
index 577b0d6,0000000..528fe6f
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
@@@ -1,163 -1,0 +1,180 @@@
 +/**
 + * 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.base.Preconditions;
 +import com.google.common.collect.Lists;
 +import org.apache.curator.RetryLoop;
 +import org.apache.curator.TimeTrace;
- import org.apache.curator.framework.CuratorFramework;
 +import org.apache.curator.framework.api.BackgroundCallback;
 +import org.apache.curator.framework.api.CuratorEvent;
 +import org.apache.curator.framework.api.CuratorEventType;
++import org.apache.curator.framework.api.ErrorListenerMultiTransactionMain;
++import org.apache.curator.framework.api.UnhandledErrorListener;
 +import org.apache.curator.framework.api.transaction.CuratorMultiTransaction;
 +import org.apache.curator.framework.api.transaction.CuratorMultiTransactionMain;
 +import org.apache.curator.framework.api.transaction.CuratorOp;
 +import org.apache.curator.framework.api.transaction.CuratorTransactionResult;
 +import org.apache.zookeeper.AsyncCallback;
 +import org.apache.zookeeper.OpResult;
 +import java.util.Arrays;
 +import java.util.List;
 +import java.util.concurrent.Callable;
 +import java.util.concurrent.Executor;
++import java.util.concurrent.ThreadFactory;
 +
 +public class CuratorMultiTransactionImpl implements
 +    CuratorMultiTransaction,
 +    CuratorMultiTransactionMain,
-     BackgroundOperation<CuratorMultiTransactionRecord>
++    BackgroundOperation<CuratorMultiTransactionRecord>,
++    ErrorListenerMultiTransactionMain
 +{
 +    private final CuratorFrameworkImpl client;
 +    private Backgrounding backgrounding = new Backgrounding();
 +
 +    public CuratorMultiTransactionImpl(CuratorFrameworkImpl client)
 +    {
 +        this.client = client;
 +    }
 +
 +    @Override
-     public CuratorMultiTransactionMain inBackground()
++    public ErrorListenerMultiTransactionMain inBackground()
 +    {
 +        backgrounding = new Backgrounding(true);
 +        return this;
 +    }
 +
 +    @Override
-     public CuratorMultiTransactionMain inBackground(Object context)
++    public ErrorListenerMultiTransactionMain inBackground(Object context)
 +    {
 +        backgrounding = new Backgrounding(context);
 +        return this;
 +    }
 +
 +    @Override
-     public CuratorMultiTransactionMain inBackground(BackgroundCallback callback)
++    public ErrorListenerMultiTransactionMain inBackground(BackgroundCallback callback)
 +    {
 +        backgrounding = new Backgrounding(callback);
 +        return this;
 +    }
 +
 +    @Override
-     public CuratorMultiTransactionMain inBackground(BackgroundCallback callback, Object context)
++    public ErrorListenerMultiTransactionMain inBackground(BackgroundCallback callback, Object context)
 +    {
 +        backgrounding = new Backgrounding(callback, context);
 +        return this;
 +    }
 +
 +    @Override
-     public CuratorMultiTransactionMain inBackground(BackgroundCallback callback, Executor executor)
++    public ErrorListenerMultiTransactionMain inBackground(BackgroundCallback callback, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(callback, executor);
 +        return this;
 +    }
 +
 +    @Override
-     public CuratorMultiTransactionMain inBackground(BackgroundCallback callback, Object context, Executor executor)
++    public ErrorListenerMultiTransactionMain inBackground(BackgroundCallback callback, Object context, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(client, callback, context, executor);
 +        return this;
 +    }
 +
 +    @Override
++    public CuratorMultiTransactionMain withUnhandledErrorListener(UnhandledErrorListener listener)
++    {
++        backgrounding = new Backgrounding(backgrounding, listener);
++        return this;
++    }
++
++    @Override
 +    public List<CuratorTransactionResult> forOperations(CuratorOp... operations) throws Exception
 +    {
 +        List<CuratorOp> ops = (operations != null) ? Arrays.asList(operations) : Lists.<CuratorOp>newArrayList();
 +        return forOperations(ops);
 +    }
 +
 +    @Override
 +    public List<CuratorTransactionResult> forOperations(List<CuratorOp> operations) throws Exception
 +    {
 +        operations = Preconditions.checkNotNull(operations, "operations cannot be null");
 +        Preconditions.checkArgument(!operations.isEmpty(), "operations list cannot be empty");
 +
 +        CuratorMultiTransactionRecord record = new CuratorMultiTransactionRecord();
 +        for ( CuratorOp curatorOp : operations )
 +        {
 +            record.add(curatorOp.get(), curatorOp.getTypeAndPath().getType(), curatorOp.getTypeAndPath().getForPath());
 +        }
 +
 +        if ( backgrounding.inBackground() )
 +        {
 +            client.processBackgroundOperation(new OperationAndData<>(this, record, backgrounding.getCallback(), null, backgrounding.getContext()), null);
 +            return null;
 +        }
 +        else
 +        {
 +            return forOperationsInForeground(record);
 +        }
 +    }
 +
 +    @Override
 +    public void performBackgroundOperation(final OperationAndData<CuratorMultiTransactionRecord> operationAndData) throws Exception
 +    {
-         final TimeTrace trace = client.getZookeeperClient().startTracer("CuratorMultiTransactionImpl-Background");
-         AsyncCallback.MultiCallback callback = new AsyncCallback.MultiCallback()
++        try
 +        {
-             @Override
-             public void processResult(int rc, String path, Object ctx, List<OpResult> opResults)
++            final TimeTrace trace = client.getZookeeperClient().startTracer("CuratorMultiTransactionImpl-Background");
++            AsyncCallback.MultiCallback callback = new AsyncCallback.MultiCallback()
 +            {
-                 trace.commit();
-                 List<CuratorTransactionResult> curatorResults = (opResults != null) ? CuratorTransactionImpl.wrapResults(client, opResults, operationAndData.getData()) : null;
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.TRANSACTION, rc, path, null, ctx, null, null, null, null, null, curatorResults);
-                 client.processBackgroundOperation(operationAndData, event);
-             }
-         };
-         client.getZooKeeper().multi(operationAndData.getData(), callback, backgrounding.getContext());
++                @Override
++                public void processResult(int rc, String path, Object ctx, List<OpResult> opResults)
++                {
++                    trace.commit();
++                    List<CuratorTransactionResult> curatorResults = (opResults != null) ? CuratorTransactionImpl.wrapResults(client, opResults, operationAndData.getData()) : null;
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.TRANSACTION, rc, path, null, ctx, null, null, null, null, null, curatorResults);
++                    client.processBackgroundOperation(operationAndData, event);
++                }
++            };
++            client.getZooKeeper().multi(operationAndData.getData(), callback, backgrounding.getContext());
++        }
++        catch ( Throwable e )
++        {
++            backgrounding.checkError(e);
++        }
 +    }
 +
 +    private List<CuratorTransactionResult> forOperationsInForeground(final CuratorMultiTransactionRecord record) throws Exception
 +    {
 +        TimeTrace trace = client.getZookeeperClient().startTracer("CuratorMultiTransactionImpl-Foreground");
 +        List<OpResult> responseData = RetryLoop.callWithRetry
 +        (
 +            client.getZookeeperClient(),
 +            new Callable<List<OpResult>>()
 +            {
 +                @Override
 +                public List<OpResult> call() throws Exception
 +                {
 +                    return client.getZooKeeper().multi(record);
 +                }
 +            }
 +        );
 +        trace.commit();
 +
 +        return CuratorTransactionImpl.wrapResults(client, responseData, record);
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
index ab72308,833904b..21c5cd8
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
@@@ -20,15 -20,8 +20,7 @@@ package org.apache.curator.framework.im
  
  import org.apache.curator.RetryLoop;
  import org.apache.curator.TimeTrace;
- import org.apache.curator.framework.api.BackgroundCallback;
- import org.apache.curator.framework.api.BackgroundPathable;
- import org.apache.curator.framework.api.BackgroundVersionable;
- import org.apache.curator.framework.api.ChildrenDeletable;
- import org.apache.curator.framework.api.CuratorEvent;
- import org.apache.curator.framework.api.CuratorEventType;
- import org.apache.curator.framework.api.DeleteBuilder;
- import org.apache.curator.framework.api.DeleteBuilderMain;
- import org.apache.curator.framework.api.Pathable;
+ import org.apache.curator.framework.api.*;
 -import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
  import org.apache.curator.framework.api.transaction.OperationType;
  import org.apache.curator.framework.api.transaction.TransactionDeleteBuilder;
  import org.apache.curator.utils.ThreadUtils;
@@@ -150,36 -134,46 +142,50 @@@ class DeleteBuilderImpl implements Dele
      }
  
      @Override
+     public Pathable<Void> withUnhandledErrorListener(UnhandledErrorListener listener)
+     {
+         backgrounding = new Backgrounding(backgrounding, listener);
+         return this;
+     }
+ 
+     @Override
      public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
      {
-         final TimeTrace trace = client.getZookeeperClient().startTracer("DeleteBuilderImpl-Background");
-         client.getZooKeeper().delete
-             (
-                 operationAndData.getData(),
-                 version,
-                 new AsyncCallback.VoidCallback()
-                 {
-                     @Override
-                     public void processResult(int rc, String path, Object ctx)
+         try
+         {
+             final TimeTrace trace = client.getZookeeperClient().startTracer("DeleteBuilderImpl-Background");
+             client.getZooKeeper().delete
+                 (
+                     operationAndData.getData(),
+                     version,
+                     new AsyncCallback.VoidCallback()
                      {
-                         trace.commit();
-                         if ( (rc == KeeperException.Code.NOTEMPTY.intValue()) && deletingChildrenIfNeeded )
-                         {
-                             backgroundDeleteChildrenThenNode(operationAndData);
-                         }
-                         else
+                         @Override
+                         public void processResult(int rc, String path, Object ctx)
                          {
-                             if ( (rc == KeeperException.Code.NONODE.intValue()) && quietly )
+                             trace.commit();
+                             if ( (rc == KeeperException.Code.NOTEMPTY.intValue()) && deletingChildrenIfNeeded )
                              {
-                                 rc = KeeperException.Code.OK.intValue();
+                                 backgroundDeleteChildrenThenNode(operationAndData);
+                             }
+                             else
+                             {
 -                                CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.DELETE, rc, path, null, ctx, null, null, null, null, null);
++                                if ( (rc == KeeperException.Code.NONODE.intValue()) && quietly )
++                                {
++                                    rc = KeeperException.Code.OK.intValue();
++                                }
++                                CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.DELETE, rc, path, null, ctx, null, null, null, null, null, null);
+                                 client.processBackgroundOperation(operationAndData, event);
                              }
-                             CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.DELETE, rc, path, null, ctx, null, null, null, null, null, null);
-                             client.processBackgroundOperation(operationAndData, event);
                          }
-                     }
-                 },
-                 backgrounding.getContext()
-             );
+                     },
+                     backgrounding.getContext()
+                 );
+         }
+         catch ( Throwable e )
+         {
+             backgrounding.checkError(e);
+         }
      }
  
      private void backgroundDeleteChildrenThenNode(final OperationAndData<String> mainOperationAndData)

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
index 4b3d214,5fb7056..7f55cf7
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
@@@ -122,26 -115,40 +115,40 @@@ class ExistsBuilderImpl implements Exis
      }
  
      @Override
+     public Pathable<Stat> withUnhandledErrorListener(UnhandledErrorListener listener)
+     {
+         backgrounding = new Backgrounding(backgrounding, listener);
+         return this;
+     }
+ 
+     @Override
      public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
      {
-         final TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Background");
-         AsyncCallback.StatCallback callback = new AsyncCallback.StatCallback()
+         try
          {
-             @Override
-             public void processResult(int rc, String path, Object ctx, Stat stat)
+             final TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Background");
+             AsyncCallback.StatCallback callback = new AsyncCallback.StatCallback()
              {
-                 trace.commit();
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.EXISTS, rc, path, null, ctx, stat, null, null, null, null, null);
-                 client.processBackgroundOperation(operationAndData, event);
+                 @Override
+                 public void processResult(int rc, String path, Object ctx, Stat stat)
+                 {
+                     trace.commit();
 -                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.EXISTS, rc, path, null, ctx, stat, null, null, null, null);
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.EXISTS, rc, path, null, ctx, stat, null, null, null, null, null);
+                     client.processBackgroundOperation(operationAndData, event);
+                 }
+             };
+             if ( watching.isWatched() )
+             {
+                 client.getZooKeeper().exists(operationAndData.getData(), true, callback, backgrounding.getContext());
+             }
+             else
+             {
 -                client.getZooKeeper().exists(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
++                client.getZooKeeper().exists(operationAndData.getData(), watching.getWatcher(client, operationAndData.getData()), callback, backgrounding.getContext());
              }
-         };
-         if ( watching.isWatched() )
-         {
-             client.getZooKeeper().exists(operationAndData.getData(), true, callback, backgrounding.getContext());
          }
-         else
+         catch ( Throwable e )
          {
-             client.getZooKeeper().exists(operationAndData.getData(), watching.getWatcher(client, operationAndData.getData()), callback, backgrounding.getContext());
+             backgrounding.checkError(e);
          }
      }
  

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
index f65c933,351a8c5..fa02740
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
@@@ -97,18 -106,25 +106,25 @@@ class GetACLBuilderImpl implements GetA
      @Override
      public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
      {
-         final TimeTrace             trace = client.getZookeeperClient().startTracer("GetACLBuilderImpl-Background");
-         AsyncCallback.ACLCallback   callback = new AsyncCallback.ACLCallback()
+         try
          {
-             @Override
-             public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat)
+             final TimeTrace             trace = client.getZookeeperClient().startTracer("GetACLBuilderImpl-Background");
+             AsyncCallback.ACLCallback   callback = new AsyncCallback.ACLCallback()
              {
-                 trace.commit();
-                 CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.GET_ACL, rc, path, null, ctx, stat, null, null, null, acl, null);
-                 client.processBackgroundOperation(operationAndData, event);
-             }
-         };
-         client.getZooKeeper().getACL(operationAndData.getData(), responseStat, callback, backgrounding.getContext());
+                 @Override
+                 public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat)
+                 {
+                     trace.commit();
 -                    CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.GET_ACL, rc, path, null, ctx, stat, null, null, null, acl);
++                    CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.GET_ACL, rc, path, null, ctx, stat, null, null, null, acl, null);
+                     client.processBackgroundOperation(operationAndData, event);
+                 }
+             };
+             client.getZooKeeper().getACL(operationAndData.getData(), responseStat, callback, backgrounding.getContext());
+         }
+         catch ( Throwable e )
+         {
+             backgrounding.checkError(e);
+         }
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
index 8365585,745800d..bc9cfc6
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
@@@ -151,28 -160,35 +160,35 @@@ class GetChildrenBuilderImpl implement
      @Override
      public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
      {
-         final TimeTrace       trace = client.getZookeeperClient().startTracer("GetChildrenBuilderImpl-Background");
-         AsyncCallback.Children2Callback callback = new AsyncCallback.Children2Callback()
+         try
          {
-             @Override
-             public void processResult(int rc, String path, Object o, List<String> strings, Stat stat)
+             final TimeTrace       trace = client.getZookeeperClient().startTracer("GetChildrenBuilderImpl-Background");
+             AsyncCallback.Children2Callback callback = new AsyncCallback.Children2Callback()
              {
-                 trace.commit();
-                 if ( strings == null )
+                 @Override
+                 public void processResult(int rc, String path, Object o, List<String> strings, Stat stat)
                  {
-                     strings = Lists.newArrayList();
+                     trace.commit();
+                     if ( strings == null )
+                     {
+                         strings = Lists.newArrayList();
+                     }
 -                    CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.CHILDREN, rc, path, null, o, stat, null, strings, null, null);
++                    CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.CHILDREN, rc, path, null, o, stat, null, strings, null, null, null);
+                     client.processBackgroundOperation(operationAndData, event);
                  }
-                 CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.CHILDREN, rc, path, null, o, stat, null, strings, null, null, null);
-                 client.processBackgroundOperation(operationAndData, event);
+             };
+             if ( watching.isWatched() )
+             {
+                 client.getZooKeeper().getChildren(operationAndData.getData(), true, callback, backgrounding.getContext());
+             }
+             else
+             {
 -                client.getZooKeeper().getChildren(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
++                client.getZooKeeper().getChildren(operationAndData.getData(), watching.getWatcher(client, operationAndData.getData()), callback, backgrounding.getContext());
              }
-         };
-         if ( watching.isWatched() )
-         {
-             client.getZooKeeper().getChildren(operationAndData.getData(), true, callback, backgrounding.getContext());
          }
-         else
+         catch ( Throwable e )
          {
-             client.getZooKeeper().getChildren(operationAndData.getData(), watching.getWatcher(client, operationAndData.getData()), callback, backgrounding.getContext());
+             backgrounding.checkError(e);
          }
      }
  

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
index b64f38e,0000000..2ba4d71
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
@@@ -1,295 -1,0 +1,302 @@@
 +/**
 + * 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.RetryLoop;
 +import org.apache.curator.TimeTrace;
- import org.apache.curator.framework.api.BackgroundCallback;
- import org.apache.curator.framework.api.BackgroundEnsembleable;
- import org.apache.curator.framework.api.CuratorEvent;
- import org.apache.curator.framework.api.CuratorEventType;
- import org.apache.curator.framework.api.CuratorWatcher;
- import org.apache.curator.framework.api.Ensembleable;
- import org.apache.curator.framework.api.GetConfigBuilder;
- import org.apache.curator.framework.api.WatchBackgroundEnsembleable;
++import org.apache.curator.framework.api.*;
 +import org.apache.zookeeper.AsyncCallback;
 +import org.apache.zookeeper.Watcher;
 +import org.apache.zookeeper.ZooDefs;
 +import org.apache.zookeeper.data.Stat;
 +import java.util.concurrent.Callable;
 +import java.util.concurrent.Executor;
 +
- public class GetConfigBuilderImpl implements GetConfigBuilder, BackgroundOperation<Void>
++public class GetConfigBuilderImpl implements GetConfigBuilder, BackgroundOperation<Void>, ErrorListenerEnsembleable<byte[]>
 +{
 +    private final CuratorFrameworkImpl client;
 +
 +    private Backgrounding backgrounding;
 +    private Watching watching;
 +    private Stat stat;
 +
 +    public GetConfigBuilderImpl(CuratorFrameworkImpl client)
 +    {
 +        this.client = client;
 +        backgrounding = new Backgrounding();
 +        watching = new Watching();
 +    }
 +
 +    @Override
 +    public WatchBackgroundEnsembleable<byte[]> storingStatIn(Stat stat)
 +    {
 +        this.stat = stat;
 +        return new WatchBackgroundEnsembleable<byte[]>()
 +        {
 +            @Override
-             public Ensembleable<byte[]> inBackground()
++            public ErrorListenerEnsembleable<byte[]> inBackground()
 +            {
 +                return GetConfigBuilderImpl.this.inBackground();
 +            }
 +
 +            @Override
-             public Ensembleable<byte[]> inBackground(Object context)
++            public ErrorListenerEnsembleable<byte[]> inBackground(Object context)
 +            {
 +                return GetConfigBuilderImpl.this.inBackground(context);
 +            }
 +
 +            @Override
-             public Ensembleable<byte[]> inBackground(BackgroundCallback callback)
++            public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback)
 +            {
 +                return GetConfigBuilderImpl.this.inBackground(callback);
 +            }
 +
 +            @Override
-             public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Object context)
++            public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Object context)
 +            {
 +                return GetConfigBuilderImpl.this.inBackground(callback, context);
 +            }
 +
 +            @Override
-             public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
++            public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
 +            {
 +                return GetConfigBuilderImpl.this.inBackground(callback, executor);
 +            }
 +
 +            @Override
-             public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
++            public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
 +            {
 +                return GetConfigBuilderImpl.this.inBackground(callback, context, executor);
 +            }
 +
 +            @Override
 +            public byte[] forEnsemble() throws Exception
 +            {
 +                return GetConfigBuilderImpl.this.forEnsemble();
 +            }
 +
 +            @Override
 +            public BackgroundEnsembleable<byte[]> watched()
 +            {
 +                return GetConfigBuilderImpl.this.watched();
 +            }
 +
 +            @Override
 +            public BackgroundEnsembleable<byte[]> usingWatcher(Watcher watcher)
 +            {
 +                return GetConfigBuilderImpl.this.usingWatcher(watcher);
 +            }
 +
 +            @Override
 +            public BackgroundEnsembleable<byte[]> usingWatcher(CuratorWatcher watcher)
 +            {
 +                return GetConfigBuilderImpl.this.usingWatcher(watcher);
 +            }
 +        };
 +    }
 +
 +    @Override
 +    public BackgroundEnsembleable<byte[]> watched()
 +    {
 +        watching = new Watching(true);
 +        return new InternalBackgroundEnsembleable();
 +    }
 +
 +    @Override
 +    public BackgroundEnsembleable<byte[]> usingWatcher(Watcher watcher)
 +    {
 +        watching = new Watching(watcher);
 +        return new InternalBackgroundEnsembleable();
 +    }
 +
 +    @Override
 +    public BackgroundEnsembleable<byte[]> usingWatcher(CuratorWatcher watcher)
 +    {
 +        watching = new Watching(watcher);
 +        return new InternalBackgroundEnsembleable();
 +    }
 +
 +    @Override
-     public Ensembleable<byte[]> inBackground()
++    public ErrorListenerEnsembleable<byte[]> inBackground()
 +    {
 +        backgrounding = new Backgrounding(true);
 +        return this;
 +    }
 +
 +    @Override
-     public Ensembleable<byte[]> inBackground(Object context)
++    public ErrorListenerEnsembleable<byte[]> inBackground(Object context)
 +    {
 +        backgrounding = new Backgrounding(context);
 +        return this;
 +    }
 +
 +    @Override
-     public Ensembleable<byte[]> inBackground(BackgroundCallback callback)
++    public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback)
 +    {
 +        backgrounding = new Backgrounding(callback);
 +        return this;
 +    }
 +
 +    @Override
-     public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Object context)
++    public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Object context)
 +    {
 +        backgrounding = new Backgrounding(callback, context);
 +        return this;
 +    }
 +
 +    @Override
-     public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
++    public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(callback, executor);
 +        return this;
 +    }
 +
 +    @Override
-     public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
++    public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(client, callback, context, executor);
 +        return this;
 +    }
 +
 +    @Override
++    public Ensembleable<byte[]> withUnhandledErrorListener(UnhandledErrorListener listener)
++    {
++        backgrounding = new Backgrounding(backgrounding, listener);
++        return this;
++    }
++
++    @Override
 +    public byte[] forEnsemble() throws Exception
 +    {
 +        if ( backgrounding.inBackground() )
 +        {
 +            client.processBackgroundOperation(new OperationAndData<Void>(this, null, backgrounding.getCallback(), null, backgrounding.getContext()), null);
 +            return null;
 +        }
 +        else
 +        {
 +            return configInForeground();
 +        }
 +    }
 +
 +    @Override
 +    public void performBackgroundOperation(final OperationAndData<Void> operationAndData) throws Exception
 +    {
-         final TimeTrace trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
-         AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
++        try
 +        {
-             @Override
-             public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
++            final TimeTrace trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
++            AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
 +            {
-                 trace.commit();
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_CONFIG, rc, path, null, ctx, stat, data, null, null, null, null);
-                 client.processBackgroundOperation(operationAndData, event);
++                @Override
++                public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
++                {
++                    trace.commit();
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_CONFIG, rc, path, null, ctx, stat, data, null, null, null, null);
++                    client.processBackgroundOperation(operationAndData, event);
++                }
++            };
++            if ( watching.isWatched() )
++            {
++                client.getZooKeeper().getConfig(true, callback, backgrounding.getContext());
++            }
++            else
++            {
++                client.getZooKeeper().getConfig(watching.getWatcher(client, ZooDefs.CONFIG_NODE), callback, backgrounding.getContext());
 +            }
-         };
-         if ( watching.isWatched() )
-         {
-             client.getZooKeeper().getConfig(true, callback, backgrounding.getContext());
 +        }
-         else
++        catch ( Throwable e )
 +        {
-             client.getZooKeeper().getConfig(watching.getWatcher(client, ZooDefs.CONFIG_NODE), callback, backgrounding.getContext());
++            backgrounding.checkError(e);
 +        }
 +    }
 +
 +    private byte[] configInForeground() throws Exception
 +    {
 +        TimeTrace trace = client.getZookeeperClient().startTracer("GetConfigBuilderImpl-Foreground");
 +        try
 +        {
 +            return RetryLoop.callWithRetry
 +            (
 +                client.getZookeeperClient(),
 +                new Callable<byte[]>()
 +                {
 +                    @Override
 +                    public byte[] call() throws Exception
 +                    {
 +                        if ( watching.isWatched() )
 +                        {
 +                            return client.getZooKeeper().getConfig(true, stat);
 +                        }
 +                        return client.getZooKeeper().getConfig(watching.getWatcher(client, ZooDefs.CONFIG_NODE), stat);
 +                    }
 +                }
 +            );
 +        }
 +        finally
 +        {
 +            trace.commit();
 +        }
 +    }
 +
 +    private class InternalBackgroundEnsembleable implements BackgroundEnsembleable<byte[]>
 +    {
 +        @Override
-         public Ensembleable<byte[]> inBackground()
++        public ErrorListenerEnsembleable<byte[]> inBackground()
 +        {
 +            return GetConfigBuilderImpl.this.inBackground();
 +        }
 +
 +        @Override
-         public Ensembleable<byte[]> inBackground(Object context)
++        public ErrorListenerEnsembleable<byte[]> inBackground(Object context)
 +        {
 +            return GetConfigBuilderImpl.this.inBackground(context);
 +        }
 +
 +        @Override
-         public Ensembleable<byte[]> inBackground(BackgroundCallback callback)
++        public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback)
 +        {
 +            return GetConfigBuilderImpl.this.inBackground(callback);
 +        }
 +
 +        @Override
-         public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Object context)
++        public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Object context)
 +        {
 +            return GetConfigBuilderImpl.this.inBackground(callback, context);
 +        }
 +
 +        @Override
-         public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
++        public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
 +        {
 +            return GetConfigBuilderImpl.this.inBackground(callback, executor);
 +        }
 +
 +        @Override
-         public Ensembleable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
++        public ErrorListenerEnsembleable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
 +        {
 +            return GetConfigBuilderImpl.this.inBackground(callback, context, executor);
 +        }
 +
 +        @Override
 +        public byte[] forEnsemble() throws Exception
 +        {
 +            return GetConfigBuilderImpl.this.forEnsemble();
 +        }
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
index e2aa053,94d27ad..72103b9
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
@@@ -232,37 -231,44 +231,44 @@@ class GetDataBuilderImpl implements Get
      @Override
      public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
      {
-         final TimeTrace   trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
-         AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
+         try
          {
-             @Override
-             public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
+             final TimeTrace   trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
+             AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
              {
-                 trace.commit();
-                 if ( decompress && (data != null) )
+                 @Override
+                 public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
                  {
-                     try
-                     {
-                         data = client.getCompressionProvider().decompress(path, data);
-                     }
-                     catch ( Exception e )
+                     trace.commit();
+                     if ( decompress && (data != null) )
                      {
-                         ThreadUtils.checkInterrupted(e);
-                         log.error("Decompressing for path: " + path, e);
-                         rc = KeeperException.Code.DATAINCONSISTENCY.intValue();
+                         try
+                         {
+                             data = client.getCompressionProvider().decompress(path, data);
+                         }
+                         catch ( Exception e )
+                         {
+                             ThreadUtils.checkInterrupted(e);
+                             log.error("Decompressing for path: " + path, e);
+                             rc = KeeperException.Code.DATAINCONSISTENCY.intValue();
+                         }
                      }
 -                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_DATA, rc, path, null, ctx, stat, data, null, null, null);
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_DATA, rc, path, null, ctx, stat, data, null, null, null, null);
+                     client.processBackgroundOperation(operationAndData, event);
                  }
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_DATA, rc, path, null, ctx, stat, data, null, null, null, null);
-                 client.processBackgroundOperation(operationAndData, event);
+             };
+             if ( watching.isWatched() )
+             {
+                 client.getZooKeeper().getData(operationAndData.getData(), true, callback, backgrounding.getContext());
+             }
+             else
+             {
 -                client.getZooKeeper().getData(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
++                client.getZooKeeper().getData(operationAndData.getData(), watching.getWatcher(client, operationAndData.getData()), callback, backgrounding.getContext());
              }
-         };
-         if ( watching.isWatched() )
-         {
-             client.getZooKeeper().getData(operationAndData.getData(), true, callback, backgrounding.getContext());
          }
-         else
+         catch ( Throwable e )
          {
-             client.getZooKeeper().getData(operationAndData.getData(), watching.getWatcher(client, operationAndData.getData()), callback, backgrounding.getContext());
+             backgrounding.checkError(e);
          }
      }
  

http://git-wip-us.apache.org/repos/asf/curator/blob/062a7d75/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
----------------------------------------------------------------------
diff --cc curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
index e786883,0000000..74683de
mode 100644,000000..100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
@@@ -1,272 -1,0 +1,286 @@@
 +/**
 + * 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.ImmutableList;
 +import org.apache.curator.RetryLoop;
 +import org.apache.curator.TimeTrace;
 +import org.apache.curator.framework.api.*;
 +import org.apache.zookeeper.AsyncCallback;
 +import org.apache.zookeeper.data.Stat;
 +import org.apache.zookeeper.server.DataTree;
 +import java.util.Arrays;
 +import java.util.List;
 +import java.util.concurrent.Callable;
 +import java.util.concurrent.Executor;
 +
- public class ReconfigBuilderImpl implements ReconfigBuilder, BackgroundOperation<Void>
++public class ReconfigBuilderImpl implements ReconfigBuilder, BackgroundOperation<Void>, ErrorListenerReconfigBuilderMain
 +{
 +    private final CuratorFrameworkImpl client;
 +
 +    private Backgrounding backgrounding = new Backgrounding();
 +    private Stat responseStat;
 +    private long fromConfig = -1;
 +    private List<String> newMembers;
 +    private List<String> joining;
 +    private List<String> leaving;
 +
 +    public ReconfigBuilderImpl(CuratorFrameworkImpl client)
 +    {
 +        this.client = client;
 +    }
 +
 +    private byte[] forEnsemble() throws Exception
 +    {
 +        if ( backgrounding.inBackground() )
 +        {
 +            client.processBackgroundOperation(new OperationAndData<>(this, null, backgrounding.getCallback(), null, backgrounding.getContext()), null);
 +            return new byte[0];
 +        }
 +        else
 +        {
 +            return ensembleInForeground();
 +        }
 +    }
 +
 +    @Override
-     public ReconfigBuilderMain inBackground()
++    public ErrorListenerReconfigBuilderMain inBackground()
 +    {
 +        backgrounding = new Backgrounding(true);
 +        return this;
 +    }
 +
 +    @Override
-     public ReconfigBuilderMain inBackground(Object context)
++    public ErrorListenerReconfigBuilderMain inBackground(Object context)
 +    {
 +        backgrounding = new Backgrounding(context);
 +        return this;
 +    }
 +
 +    @Override
-     public ReconfigBuilderMain inBackground(BackgroundCallback callback)
++    public ErrorListenerReconfigBuilderMain inBackground(BackgroundCallback callback)
 +    {
 +        backgrounding = new Backgrounding(callback);
 +        return this;
 +    }
 +
 +    @Override
-     public ReconfigBuilderMain inBackground(BackgroundCallback callback, Object context)
++    public ErrorListenerReconfigBuilderMain inBackground(BackgroundCallback callback, Object context)
 +    {
 +        backgrounding = new Backgrounding(callback, context);
 +        return this;
 +    }
 +
 +    @Override
-     public ReconfigBuilderMain inBackground(BackgroundCallback callback, Executor executor)
++    public ErrorListenerReconfigBuilderMain inBackground(BackgroundCallback callback, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(callback, executor);
 +        return this;
 +    }
 +
 +    @Override
-     public ReconfigBuilderMain inBackground(BackgroundCallback callback, Object context, Executor executor)
++    public ErrorListenerReconfigBuilderMain inBackground(BackgroundCallback callback, Object context, Executor executor)
 +    {
 +        backgrounding = new Backgrounding(client, callback, context, executor);
 +        return this;
 +    }
 +
 +    @Override
++    public ReconfigBuilderMain withUnhandledErrorListener(UnhandledErrorListener listener)
++    {
++        backgrounding = new Backgrounding(backgrounding, listener);
++        return this;
++    }
++
++    @Override
 +    public StatConfigureEnsembleable withNewMembers(String... server)
 +    {
 +        return withNewMembers((server != null) ? Arrays.asList(server) : null);
 +    }
 +
 +    @Override
 +    public StatConfigureEnsembleable withNewMembers(List<String> servers)
 +    {
 +        newMembers = (servers != null) ? ImmutableList.copyOf(servers) : ImmutableList.<String>of();
 +        return new StatConfigureEnsembleable()
 +        {
 +            @Override
 +            public Ensembleable<byte[]> fromConfig(long config) throws Exception
 +            {
 +                fromConfig = config;
 +                return this;
 +            }
 +
 +            @Override
 +            public byte[] forEnsemble() throws Exception
 +            {
 +                return ReconfigBuilderImpl.this.forEnsemble();
 +            }
 +
 +            @Override
 +            public ConfigureEnsembleable storingStatIn(Stat stat)
 +            {
 +                responseStat = stat;
 +                return this;
 +            }
 +        };
 +    }
 +
 +    @Override
 +    public LeaveStatConfigEnsembleable joining(String... server)
 +    {
 +        return joining((server != null) ? Arrays.asList(server) : null);
 +    }
 +
 +    @Override
 +    public LeaveStatConfigEnsembleable joining(List<String> servers)
 +    {
 +        joining = (servers != null) ? ImmutableList.copyOf(servers) : ImmutableList.<String>of();
 +
 +        return new LeaveStatConfigEnsembleable()
 +        {
 +            @Override
 +            public byte[] forEnsemble() throws Exception
 +            {
 +                return ReconfigBuilderImpl.this.forEnsemble();
 +            }
 +
 +            @Override
 +            public ConfigureEnsembleable storingStatIn(Stat stat)
 +            {
 +                responseStat = stat;
 +                return this;
 +            }
 +
 +            @Override
 +            public Ensembleable<byte[]> fromConfig(long config) throws Exception
 +            {
 +                fromConfig = config;
 +                return this;
 +            }
 +
 +            @Override
 +            public JoinStatConfigEnsembleable leaving(String... server)
 +            {
 +                return ReconfigBuilderImpl.this.leaving(server);
 +            }
 +
 +            @Override
 +            public JoinStatConfigEnsembleable leaving(List<String> servers)
 +            {
 +                return ReconfigBuilderImpl.this.leaving(servers);
 +            }
 +        };
 +    }
 +
 +    @Override
 +    public JoinStatConfigEnsembleable leaving(String... server)
 +    {
 +        return leaving((server != null) ? Arrays.asList(server) : null);
 +    }
 +
 +    @Override
 +    public JoinStatConfigEnsembleable leaving(List<String> servers)
 +    {
 +        leaving = (servers != null) ? ImmutableList.copyOf(servers) : ImmutableList.<String>of();
 +
 +        return new JoinStatConfigEnsembleable()
 +        {
 +            @Override
 +            public byte[] forEnsemble() throws Exception
 +            {
 +                return ReconfigBuilderImpl.this.forEnsemble();
 +            }
 +
 +            @Override
 +            public ConfigureEnsembleable storingStatIn(Stat stat)
 +            {
 +                responseStat = stat;
 +                return this;
 +            }
 +
 +            @Override
 +            public Ensembleable<byte[]> fromConfig(long config) throws Exception
 +            {
 +                fromConfig = config;
 +                return this;
 +            }
 +
 +            @Override
 +            public LeaveStatConfigEnsembleable joining(String... server)
 +            {
 +                return joining((server != null) ? Arrays.asList(server) : null);
 +            }
 +
 +            @Override
 +            public LeaveStatConfigEnsembleable joining(List<String> servers)
 +            {
 +                return ReconfigBuilderImpl.this.joining(servers);
 +            }
 +        };
 +    }
 +
 +    @Override
 +    public void performBackgroundOperation(final OperationAndData<Void> data) throws Exception
 +    {
-         final TimeTrace trace = client.getZookeeperClient().startTracer("ReconfigBuilderImpl-Background");
-         AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
++        try
 +        {
-             @Override
-             public void processResult(int rc, String path, Object ctx, byte[] bytes, Stat stat)
++            final TimeTrace trace = client.getZookeeperClient().startTracer("ReconfigBuilderImpl-Background");
++            AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
 +            {
-                 trace.commit();
-                 if ( (responseStat != null) && (stat != null) )
++                @Override
++                public void processResult(int rc, String path, Object ctx, byte[] bytes, Stat stat)
 +                {
-                     DataTree.copyStat(stat, responseStat);
++                    trace.commit();
++                    if ( (responseStat != null) && (stat != null) )
++                    {
++                        DataTree.copyStat(stat, responseStat);
++                    }
++                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.RECONFIG, rc, path, null, ctx, stat, bytes, null, null, null, null);
++                    client.processBackgroundOperation(data, event);
 +                }
-                 CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.RECONFIG, rc, path, null, ctx, stat, bytes, null, null, null, null);
-                 client.processBackgroundOperation(data, event);
-             }
-         };
-         client.getZooKeeper().reconfig(joining, leaving, newMembers, fromConfig, callback, backgrounding.getContext());
++            };
++            client.getZooKeeper().reconfig(joining, leaving, newMembers, fromConfig, callback, backgrounding.getContext());
++        }
++        catch ( Throwable e )
++        {
++            backgrounding.checkError(e);
++        }
 +    }
 +
 +    private byte[] ensembleInForeground() throws Exception
 +    {
 +        TimeTrace trace = client.getZookeeperClient().startTracer("ReconfigBuilderImpl-Foreground");
 +        byte[] responseData = RetryLoop.callWithRetry
 +            (
 +                client.getZookeeperClient(),
 +                new Callable<byte[]>()
 +                {
 +                    @Override
 +                    public byte[] call() throws Exception
 +                    {
 +                        return client.getZooKeeper().reconfig(joining, leaving, newMembers, fromConfig, responseStat);
 +                    }
 +                }
 +            );
 +        trace.commit();
 +        return responseData;
 +    }
 +}


[6/8] curator git commit: Added a method for background operations to intercept exeptions.

Posted by ra...@apache.org.
Added a method for background operations to intercept exeptions.


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

Branch: refs/heads/CURATOR-3.0
Commit: 8499680187d1f1061ca8597886e9f869bf637321
Parents: 18e912d
Author: randgalt <ra...@apache.org>
Authored: Mon Mar 7 09:15:07 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Mon Mar 7 09:15:07 2016 -0500

----------------------------------------------------------------------
 .../api/BackgroundPathAndBytesable.java         |   2 +-
 .../framework/api/BackgroundPathable.java       |   2 +-
 .../api/ErrorListenerPathAndBytesable.java      |  14 +++
 .../framework/api/ErrorListenerPathable.java    |  14 +++
 .../curator/framework/imps/Backgrounding.java   |  80 ++++++++++----
 .../framework/imps/CreateBuilderImpl.java       | 110 +++++++++++--------
 .../framework/imps/DeleteBuilderImpl.java       |  79 +++++++------
 .../framework/imps/ExistsBuilderImpl.java       |  63 ++++++-----
 .../framework/imps/GetACLBuilderImpl.java       |  50 ++++++---
 .../framework/imps/GetChildrenBuilderImpl.java  |  62 +++++++----
 .../framework/imps/GetDataBuilderImpl.java      |  94 ++++++++--------
 .../framework/imps/SetACLBuilderImpl.java       |  66 ++++++-----
 .../framework/imps/SetDataBuilderImpl.java      |  85 +++++++-------
 .../curator/framework/imps/SyncBuilderImpl.java |  56 ++++++----
 .../framework/imps/TestFrameworkBackground.java |  50 ++++++++-
 15 files changed, 523 insertions(+), 304 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathAndBytesable.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathAndBytesable.java b/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathAndBytesable.java
index 5cefd08..ce9d4eb 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathAndBytesable.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathAndBytesable.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.api;
 
 public interface BackgroundPathAndBytesable<T> extends
-    Backgroundable<PathAndBytesable<T>>,
+    Backgroundable<ErrorListenerPathAndBytesable<T>>,
     PathAndBytesable<T>
 {
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathable.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathable.java b/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathable.java
index 956cf6a..5a053a2 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathable.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/BackgroundPathable.java
@@ -19,7 +19,7 @@
 package org.apache.curator.framework.api;
 
 public interface BackgroundPathable<T> extends
-    Backgroundable<Pathable<T>>,
+    Backgroundable<ErrorListenerPathable<T>>,
     Pathable<T>
 {
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathAndBytesable.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathAndBytesable.java b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathAndBytesable.java
new file mode 100644
index 0000000..9882a3e
--- /dev/null
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathAndBytesable.java
@@ -0,0 +1,14 @@
+package org.apache.curator.framework.api;
+
+public interface ErrorListenerPathAndBytesable<T> extends PathAndBytesable<T>
+{
+    /**
+     * Set an error listener for this background operation. If an exception
+     * occurs while processing the call in the background, this listener will
+     * be called
+     *
+     * @param listener the listener
+     * @return this for chaining
+     */
+    PathAndBytesable<T> withUnhandledErrorListener(UnhandledErrorListener listener);
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathable.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathable.java b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathable.java
new file mode 100644
index 0000000..8245076
--- /dev/null
+++ b/curator-framework/src/main/java/org/apache/curator/framework/api/ErrorListenerPathable.java
@@ -0,0 +1,14 @@
+package org.apache.curator.framework.api;
+
+public interface ErrorListenerPathable<T> extends Pathable<T>
+{
+    /**
+     * Set an error listener for this background operation. If an exception
+     * occurs while processing the call in the background, this listener will
+     * be called
+     *
+     * @param listener the listener
+     * @return this for chaining
+     */
+    Pathable<T> withUnhandledErrorListener(UnhandledErrorListener listener);
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
index 1bb2423..dac06c2 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
@@ -16,26 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.curator.framework.imps;
 
+import com.google.common.base.Throwables;
+import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEvent;
-import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.curator.utils.ThreadUtils;
 import org.apache.zookeeper.KeeperException;
 import java.util.concurrent.Executor;
 
 class Backgrounding
 {
-    private final boolean               inBackground;
-    private final Object                context;
-    private final BackgroundCallback    callback;
+    private final boolean inBackground;
+    private final Object context;
+    private final BackgroundCallback callback;
+    private final UnhandledErrorListener errorListener;
 
     Backgrounding(Object context)
     {
         this.inBackground = true;
         this.context = context;
         this.callback = null;
+        errorListener = null;
     }
 
     Backgrounding(BackgroundCallback callback)
@@ -43,6 +48,7 @@ class Backgrounding
         this.inBackground = true;
         this.context = null;
         this.callback = callback;
+        errorListener = null;
     }
 
     Backgrounding(boolean inBackground)
@@ -50,6 +56,7 @@ class Backgrounding
         this.inBackground = inBackground;
         this.context = null;
         this.callback = null;
+        errorListener = null;
     }
 
     Backgrounding(BackgroundCallback callback, Object context)
@@ -57,6 +64,7 @@ class Backgrounding
         this.inBackground = true;
         this.context = context;
         this.callback = callback;
+        errorListener = null;
     }
 
     Backgrounding(CuratorFrameworkImpl client, BackgroundCallback callback, Object context, Executor executor)
@@ -69,11 +77,24 @@ class Backgrounding
         this(wrapCallback(client, callback, executor));
     }
 
+    Backgrounding(Backgrounding rhs, UnhandledErrorListener errorListener)
+    {
+        if ( rhs == null )
+        {
+            rhs = new Backgrounding();
+        }
+        this.inBackground = rhs.inBackground;
+        this.context = rhs.context;
+        this.callback = rhs.callback;
+        this.errorListener = errorListener;
+    }
+
     Backgrounding()
     {
         inBackground = false;
         context = null;
         this.callback = null;
+        errorListener = null;
     }
 
     boolean inBackground()
@@ -91,6 +112,25 @@ class Backgrounding
         return callback;
     }
 
+    void checkError(Throwable e) throws Exception
+    {
+        if ( e != null )
+        {
+            if ( errorListener != null )
+            {
+                errorListener.unhandledError("n/a", e);
+            }
+            else if ( e instanceof Exception )
+            {
+                throw (Exception)e;
+            }
+            else
+            {
+                Throwables.propagate(e);
+            }
+        }
+    }
+
     private static BackgroundCallback wrapCallback(final CuratorFrameworkImpl client, final BackgroundCallback callback, final Executor executor)
     {
         return new BackgroundCallback()
@@ -99,28 +139,28 @@ class Backgrounding
             public void processResult(CuratorFramework dummy, final CuratorEvent event) throws Exception
             {
                 executor.execute
-                (
-                    new Runnable()
-                    {
-                        @Override
-                        public void run()
+                    (
+                        new Runnable()
                         {
-                            try
-                            {
-                                callback.processResult(client, event);
-                            }
-                            catch ( Exception e )
+                            @Override
+                            public void run()
                             {
-                                ThreadUtils.checkInterrupted(e);
-                                if ( e instanceof KeeperException )
+                                try
+                                {
+                                    callback.processResult(client, event);
+                                }
+                                catch ( Exception e )
                                 {
-                                    client.validateConnection(client.codeToState(((KeeperException)e).code()));
+                                    ThreadUtils.checkInterrupted(e);
+                                    if ( e instanceof KeeperException )
+                                    {
+                                        client.validateConnection(client.codeToState(((KeeperException)e).code()));
+                                    }
+                                    client.logError("Background operation result handling threw exception", e);
                                 }
-                                client.logError("Background operation result handling threw exception", e);
                             }
                         }
-                    }
-                );
+                    );
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/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 e11d74f..0f893d8 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
@@ -41,7 +41,7 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndBytes>
+class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndBytes>, ErrorListenerPathAndBytesable<String>
 {
     private final CuratorFrameworkImpl client;
     private CreateMode createMode;
@@ -151,37 +151,37 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
             {
                 return CreateBuilderImpl.this.inBackground(callback, context);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
             {
                 return CreateBuilderImpl.this.inBackground(callback, context, executor);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground()
+            public ErrorListenerPathAndBytesable<String> inBackground()
             {
                 return CreateBuilderImpl.this.inBackground();
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(Object context)
+            public ErrorListenerPathAndBytesable<String> inBackground(Object context)
             {
                 return CreateBuilderImpl.this.inBackground(context);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback)
             {
                 return CreateBuilderImpl.this.inBackground(callback);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
             {
                 return CreateBuilderImpl.this.inBackground(callback, executor);
             }
@@ -219,37 +219,37 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
             }
 
             @Override
-            public PathAndBytesable<String> inBackground()
+            public ErrorListenerPathAndBytesable<String> inBackground()
             {
                 return CreateBuilderImpl.this.inBackground();
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
             {
                 return CreateBuilderImpl.this.inBackground(callback, context);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
             {
                 return CreateBuilderImpl.this.inBackground(callback, context, executor);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(Object context)
+            public ErrorListenerPathAndBytesable<String> inBackground(Object context)
             {
                 return CreateBuilderImpl.this.inBackground(context);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback)
             {
                 return CreateBuilderImpl.this.inBackground(callback);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
             {
                 return CreateBuilderImpl.this.inBackground(callback, executor);
             }
@@ -302,37 +302,37 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
             }
 
             @Override
-            public PathAndBytesable<String> inBackground()
+            public ErrorListenerPathAndBytesable<String> inBackground()
             {
                 return CreateBuilderImpl.this.inBackground();
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(Object context)
+            public ErrorListenerPathAndBytesable<String> inBackground(Object context)
             {
                 return CreateBuilderImpl.this.inBackground(context);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback)
             {
                 return CreateBuilderImpl.this.inBackground(callback);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
             {
                 return CreateBuilderImpl.this.inBackground(callback, context);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
             {
                 return CreateBuilderImpl.this.inBackground(callback, executor);
             }
 
             @Override
-            public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
+            public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
             {
                 return CreateBuilderImpl.this.inBackground(callback, context, executor);
             }
@@ -400,48 +400,55 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
     }
 
     @Override
-    public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public PathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public PathAndBytesable<String> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public PathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathAndBytesable<String> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
-    public PathAndBytesable<String> inBackground()
+    public ErrorListenerPathAndBytesable<String> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public PathAndBytesable<String> inBackground(Object context)
+    public ErrorListenerPathAndBytesable<String> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
+    public PathAndBytesable<String> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public String forPath(String path) throws Exception
     {
         return forPath(path, client.getDefaultData());
@@ -501,32 +508,39 @@ class CreateBuilderImpl implements CreateBuilder, BackgroundOperation<PathAndByt
     @Override
     public void performBackgroundOperation(final OperationAndData<PathAndBytes> operationAndData) throws Exception
     {
-        final TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Background");
-        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)
+        try
+        {
+            final TimeTrace trace = client.getZookeeperClient().startTracer("CreateBuilderImpl-Background");
+            client.getZooKeeper().create
+                (
+                    operationAndData.getData().getPath(),
+                    operationAndData.getData().getData(),
+                    acling.getAclList(operationAndData.getData().getPath()),
+                    createMode,
+                    new AsyncCallback.StringCallback()
                     {
-                        trace.commit();
-
-                        if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded )
-                        {
-                            backgroundCreateParentsThenNode(client, operationAndData, operationAndData.getData().getPath(), backgrounding, createParentsAsContainers);
-                        }
-                        else
+                        @Override
+                        public void processResult(int rc, String path, Object ctx, String name)
                         {
-                            sendBackgroundResponse(rc, path, ctx, name, operationAndData);
+                            trace.commit();
+
+                            if ( (rc == KeeperException.Code.NONODE.intValue()) && createParentsIfNeeded )
+                            {
+                                backgroundCreateParentsThenNode(client, operationAndData, operationAndData.getData().getPath(), backgrounding, createParentsAsContainers);
+                            }
+                            else
+                            {
+                                sendBackgroundResponse(rc, path, ctx, name, operationAndData);
+                            }
                         }
-                    }
-                },
-                backgrounding.getContext()
-            );
+                    },
+                    backgrounding.getContext()
+                );
+        }
+        catch ( Throwable e )
+        {
+            backgrounding.checkError(e);
+        }
     }
 
     private static String getProtectedPrefix(String protectedId)

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
index c3247a1..833904b 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
@@ -20,14 +20,7 @@ package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
 import org.apache.curator.TimeTrace;
-import org.apache.curator.framework.api.BackgroundCallback;
-import org.apache.curator.framework.api.BackgroundPathable;
-import org.apache.curator.framework.api.BackgroundVersionable;
-import org.apache.curator.framework.api.ChildrenDeletable;
-import org.apache.curator.framework.api.CuratorEvent;
-import org.apache.curator.framework.api.CuratorEventType;
-import org.apache.curator.framework.api.DeleteBuilder;
-import org.apache.curator.framework.api.Pathable;
+import org.apache.curator.framework.api.*;
 import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
 import org.apache.curator.framework.api.transaction.OperationType;
 import org.apache.curator.framework.api.transaction.TransactionDeleteBuilder;
@@ -39,7 +32,7 @@ import org.apache.zookeeper.Op;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>
+class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>, ErrorListenerPathable<Void>
 {
     private final CuratorFrameworkImpl client;
     private int version;
@@ -99,74 +92,88 @@ class DeleteBuilderImpl implements DeleteBuilder, BackgroundOperation<String>
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground()
+    public ErrorListenerPathable<Void> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(Object context)
+    public ErrorListenerPathable<Void> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
+    public Pathable<Void> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace trace = client.getZookeeperClient().startTracer("DeleteBuilderImpl-Background");
-        client.getZooKeeper().delete
-            (
-                operationAndData.getData(),
-                version,
-                new AsyncCallback.VoidCallback()
-                {
-                    @Override
-                    public void processResult(int rc, String path, Object ctx)
+        try
+        {
+            final TimeTrace trace = client.getZookeeperClient().startTracer("DeleteBuilderImpl-Background");
+            client.getZooKeeper().delete
+                (
+                    operationAndData.getData(),
+                    version,
+                    new AsyncCallback.VoidCallback()
                     {
-                        trace.commit();
-                        if ( (rc == KeeperException.Code.NOTEMPTY.intValue()) && deletingChildrenIfNeeded )
-                        {
-                            backgroundDeleteChildrenThenNode(operationAndData);
-                        }
-                        else
+                        @Override
+                        public void processResult(int rc, String path, Object ctx)
                         {
-                            CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.DELETE, rc, path, null, ctx, null, null, null, null, null);
-                            client.processBackgroundOperation(operationAndData, event);
+                            trace.commit();
+                            if ( (rc == KeeperException.Code.NOTEMPTY.intValue()) && deletingChildrenIfNeeded )
+                            {
+                                backgroundDeleteChildrenThenNode(operationAndData);
+                            }
+                            else
+                            {
+                                CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.DELETE, rc, path, null, ctx, null, null, null, null, null);
+                                client.processBackgroundOperation(operationAndData, event);
+                            }
                         }
-                    }
-                },
-                backgrounding.getContext()
-            );
+                    },
+                    backgrounding.getContext()
+                );
+        }
+        catch ( Throwable e )
+        {
+            backgrounding.checkError(e);
+        }
     }
 
     private void backgroundDeleteChildrenThenNode(final OperationAndData<String> mainOperationAndData)

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
index d4a059d..5fb7056 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
@@ -20,14 +20,7 @@ package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
 import org.apache.curator.TimeTrace;
-import org.apache.curator.framework.api.BackgroundCallback;
-import org.apache.curator.framework.api.BackgroundPathable;
-import org.apache.curator.framework.api.CuratorEvent;
-import org.apache.curator.framework.api.CuratorEventType;
-import org.apache.curator.framework.api.CuratorWatcher;
-import org.apache.curator.framework.api.ExistsBuilder;
-import org.apache.curator.framework.api.ExistsBuilderMain;
-import org.apache.curator.framework.api.Pathable;
+import org.apache.curator.framework.api.*;
 import org.apache.curator.utils.ZKPaths;
 import org.apache.zookeeper.AsyncCallback;
 import org.apache.zookeeper.KeeperException;
@@ -36,7 +29,7 @@ import org.apache.zookeeper.data.Stat;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>
+class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>, ErrorListenerPathable<Stat>
 {
     private final CuratorFrameworkImpl client;
     private Backgrounding backgrounding;
@@ -80,68 +73,82 @@ class ExistsBuilderImpl implements ExistsBuilder, BackgroundOperation<String>
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground()
+    public ErrorListenerPathable<Stat> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(Object context)
+    public ErrorListenerPathable<Stat> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
+    public Pathable<Stat> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Background");
-        AsyncCallback.StatCallback callback = new AsyncCallback.StatCallback()
+        try
         {
-            @Override
-            public void processResult(int rc, String path, Object ctx, Stat stat)
+            final TimeTrace   trace = client.getZookeeperClient().startTracer("ExistsBuilderImpl-Background");
+            AsyncCallback.StatCallback callback = new AsyncCallback.StatCallback()
             {
-                trace.commit();
-                CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.EXISTS, rc, path, null, ctx, stat, null, null, null, null);
-                client.processBackgroundOperation(operationAndData, event);
+                @Override
+                public void processResult(int rc, String path, Object ctx, Stat stat)
+                {
+                    trace.commit();
+                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.EXISTS, rc, path, null, ctx, stat, null, null, null, null);
+                    client.processBackgroundOperation(operationAndData, event);
+                }
+            };
+            if ( watching.isWatched() )
+            {
+                client.getZooKeeper().exists(operationAndData.getData(), true, callback, backgrounding.getContext());
+            }
+            else
+            {
+                client.getZooKeeper().exists(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
             }
-        };
-        if ( watching.isWatched() )
-        {
-            client.getZooKeeper().exists(operationAndData.getData(), true, callback, backgrounding.getContext());
         }
-        else
+        catch ( Throwable e )
         {
-            client.getZooKeeper().exists(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
+            backgrounding.checkError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
index 250c2c8..351a8c5 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
@@ -22,8 +22,10 @@ import org.apache.curator.RetryLoop;
 import org.apache.curator.TimeTrace;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEventType;
+import org.apache.curator.framework.api.ErrorListenerPathable;
 import org.apache.curator.framework.api.GetACLBuilder;
 import org.apache.curator.framework.api.Pathable;
+import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.zookeeper.AsyncCallback;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
@@ -31,7 +33,7 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>
+class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>, ErrorListenerPathable<List<ACL>>
 {
     private final CuratorFrameworkImpl client;
 
@@ -46,48 +48,55 @@ class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>
     }
 
     @Override
-    public Pathable<List<ACL>> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<List<ACL>> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<List<ACL>> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<List<ACL>> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public Pathable<List<ACL>> inBackground()
+    public ErrorListenerPathable<List<ACL>> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public Pathable<List<ACL>> inBackground(Object context)
+    public ErrorListenerPathable<List<ACL>> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
-    public Pathable<List<ACL>> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<List<ACL>> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<List<ACL>> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<List<ACL>> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
+    public Pathable<List<ACL>> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public Pathable<List<ACL>> storingStatIn(Stat stat)
     {
         responseStat = stat;
@@ -97,18 +106,25 @@ class GetACLBuilderImpl implements GetACLBuilder, BackgroundOperation<String>
     @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace             trace = client.getZookeeperClient().startTracer("GetACLBuilderImpl-Background");
-        AsyncCallback.ACLCallback   callback = new AsyncCallback.ACLCallback()
+        try
         {
-            @Override
-            public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat)
+            final TimeTrace             trace = client.getZookeeperClient().startTracer("GetACLBuilderImpl-Background");
+            AsyncCallback.ACLCallback   callback = new AsyncCallback.ACLCallback()
             {
-                trace.commit();
-                CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.GET_ACL, rc, path, null, ctx, stat, null, null, null, acl);
-                client.processBackgroundOperation(operationAndData, event);
-            }
-        };
-        client.getZooKeeper().getACL(operationAndData.getData(), responseStat, callback, backgrounding.getContext());
+                @Override
+                public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat)
+                {
+                    trace.commit();
+                    CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.GET_ACL, rc, path, null, ctx, stat, null, null, null, acl);
+                    client.processBackgroundOperation(operationAndData, event);
+                }
+            };
+            client.getZooKeeper().getACL(operationAndData.getData(), responseStat, callback, backgrounding.getContext());
+        }
+        catch ( Throwable e )
+        {
+            backgrounding.checkError(e);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
index 16f6d4b..745800d 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
@@ -25,8 +25,10 @@ import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.BackgroundPathable;
 import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.curator.framework.api.CuratorWatcher;
+import org.apache.curator.framework.api.ErrorListenerPathable;
 import org.apache.curator.framework.api.GetChildrenBuilder;
 import org.apache.curator.framework.api.Pathable;
+import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.curator.framework.api.WatchPathable;
 import org.apache.zookeeper.AsyncCallback;
 import org.apache.zookeeper.Watcher;
@@ -35,12 +37,12 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<String>
+class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<String>, ErrorListenerPathable<List<String>>
 {
     private final CuratorFrameworkImpl client;
     private Watching watching;
     private Backgrounding backgrounding;
-    private Stat                                    responseStat;
+    private Stat responseStat;
 
     GetChildrenBuilderImpl(CuratorFrameworkImpl client)
     {
@@ -86,48 +88,55 @@ class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<
     }
 
     @Override
-    public Pathable<List<String>> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<List<String>> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<List<String>> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<List<String>> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public Pathable<List<String>> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<List<String>> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<List<String>> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<List<String>> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
-    public Pathable<List<String>> inBackground()
+    public ErrorListenerPathable<List<String>> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public Pathable<List<String>> inBackground(Object context)
+    public ErrorListenerPathable<List<String>> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
+    public Pathable<List<String>> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public BackgroundPathable<List<String>> watched()
     {
         watching = new Watching(true);
@@ -151,28 +160,35 @@ class GetChildrenBuilderImpl implements GetChildrenBuilder, BackgroundOperation<
     @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace       trace = client.getZookeeperClient().startTracer("GetChildrenBuilderImpl-Background");
-        AsyncCallback.Children2Callback callback = new AsyncCallback.Children2Callback()
+        try
         {
-            @Override
-            public void processResult(int rc, String path, Object o, List<String> strings, Stat stat)
+            final TimeTrace       trace = client.getZookeeperClient().startTracer("GetChildrenBuilderImpl-Background");
+            AsyncCallback.Children2Callback callback = new AsyncCallback.Children2Callback()
             {
-                trace.commit();
-                if ( strings == null )
+                @Override
+                public void processResult(int rc, String path, Object o, List<String> strings, Stat stat)
                 {
-                    strings = Lists.newArrayList();
+                    trace.commit();
+                    if ( strings == null )
+                    {
+                        strings = Lists.newArrayList();
+                    }
+                    CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.CHILDREN, rc, path, null, o, stat, null, strings, null, null);
+                    client.processBackgroundOperation(operationAndData, event);
                 }
-                CuratorEventImpl event = new CuratorEventImpl(client, CuratorEventType.CHILDREN, rc, path, null, o, stat, null, strings, null, null);
-                client.processBackgroundOperation(operationAndData, event);
+            };
+            if ( watching.isWatched() )
+            {
+                client.getZooKeeper().getChildren(operationAndData.getData(), true, callback, backgrounding.getContext());
+            }
+            else
+            {
+                client.getZooKeeper().getChildren(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
             }
-        };
-        if ( watching.isWatched() )
-        {
-            client.getZooKeeper().getChildren(operationAndData.getData(), true, callback, backgrounding.getContext());
         }
-        else
+        catch ( Throwable e )
         {
-            client.getZooKeeper().getChildren(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
+            backgrounding.checkError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
index 5a8d16c..94d27ad 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
@@ -20,15 +20,7 @@ package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
 import org.apache.curator.TimeTrace;
-import org.apache.curator.framework.api.BackgroundCallback;
-import org.apache.curator.framework.api.BackgroundPathable;
-import org.apache.curator.framework.api.CuratorEvent;
-import org.apache.curator.framework.api.CuratorEventType;
-import org.apache.curator.framework.api.CuratorWatcher;
-import org.apache.curator.framework.api.GetDataBuilder;
-import org.apache.curator.framework.api.GetDataWatchBackgroundStatable;
-import org.apache.curator.framework.api.Pathable;
-import org.apache.curator.framework.api.WatchPathable;
+import org.apache.curator.framework.api.*;
 import org.apache.curator.utils.ThreadUtils;
 import org.apache.zookeeper.AsyncCallback;
 import org.apache.zookeeper.KeeperException;
@@ -39,7 +31,7 @@ import org.slf4j.LoggerFactory;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>
+class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>, ErrorListenerPathable<byte[]>
 {
     private final Logger                log = LoggerFactory.getLogger(getClass());
     private final CuratorFrameworkImpl  client;
@@ -64,37 +56,37 @@ class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>
         return new GetDataWatchBackgroundStatable()
         {
             @Override
-            public Pathable<byte[]> inBackground()
+            public ErrorListenerPathable<byte[]> inBackground()
             {
                 return GetDataBuilderImpl.this.inBackground();
             }
 
             @Override
-            public Pathable<byte[]> inBackground(BackgroundCallback callback, Object context)
+            public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback, Object context)
             {
                 return GetDataBuilderImpl.this.inBackground(callback, context);
             }
 
             @Override
-            public Pathable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
+            public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
             {
                 return GetDataBuilderImpl.this.inBackground(callback, context, executor);
             }
 
             @Override
-            public Pathable<byte[]> inBackground(Object context)
+            public ErrorListenerPathable<byte[]> inBackground(Object context)
             {
                 return GetDataBuilderImpl.this.inBackground(context);
             }
 
             @Override
-            public Pathable<byte[]> inBackground(BackgroundCallback callback)
+            public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback)
             {
                 return GetDataBuilderImpl.this.inBackground(callback);
             }
 
             @Override
-            public Pathable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
+            public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
             {
                 return GetDataBuilderImpl.this.inBackground(callback, executor);
             }
@@ -167,48 +159,55 @@ class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>
     }
 
     @Override
-    public Pathable<byte[]> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public Pathable<byte[]> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<byte[]> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
-    public Pathable<byte[]> inBackground()
+    public ErrorListenerPathable<byte[]> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public Pathable<byte[]> inBackground(Object context)
+    public ErrorListenerPathable<byte[]> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
+    public Pathable<byte[]> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public BackgroundPathable<byte[]> watched()
     {
         watching = new Watching(true);
@@ -232,37 +231,44 @@ class GetDataBuilderImpl implements GetDataBuilder, BackgroundOperation<String>
     @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace   trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
-        AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
+        try
         {
-            @Override
-            public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
+            final TimeTrace   trace = client.getZookeeperClient().startTracer("GetDataBuilderImpl-Background");
+            AsyncCallback.DataCallback callback = new AsyncCallback.DataCallback()
             {
-                trace.commit();
-                if ( decompress && (data != null) )
+                @Override
+                public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat)
                 {
-                    try
+                    trace.commit();
+                    if ( decompress && (data != null) )
                     {
-                        data = client.getCompressionProvider().decompress(path, data);
-                    }
-                    catch ( Exception e )
-                    {
-                        ThreadUtils.checkInterrupted(e);
-                        log.error("Decompressing for path: " + path, e);
-                        rc = KeeperException.Code.DATAINCONSISTENCY.intValue();
+                        try
+                        {
+                            data = client.getCompressionProvider().decompress(path, data);
+                        }
+                        catch ( Exception e )
+                        {
+                            ThreadUtils.checkInterrupted(e);
+                            log.error("Decompressing for path: " + path, e);
+                            rc = KeeperException.Code.DATAINCONSISTENCY.intValue();
+                        }
                     }
+                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_DATA, rc, path, null, ctx, stat, data, null, null, null);
+                    client.processBackgroundOperation(operationAndData, event);
                 }
-                CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.GET_DATA, rc, path, null, ctx, stat, data, null, null, null);
-                client.processBackgroundOperation(operationAndData, event);
+            };
+            if ( watching.isWatched() )
+            {
+                client.getZooKeeper().getData(operationAndData.getData(), true, callback, backgrounding.getContext());
+            }
+            else
+            {
+                client.getZooKeeper().getData(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
             }
-        };
-        if ( watching.isWatched() )
-        {
-            client.getZooKeeper().getData(operationAndData.getData(), true, callback, backgrounding.getContext());
         }
-        else
+        catch ( Throwable e )
         {
-            client.getZooKeeper().getData(operationAndData.getData(), watching.getWatcher(), callback, backgrounding.getContext());
+            backgrounding.checkError(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
index f7b2480..5507529 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
@@ -32,7 +32,7 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, BackgroundOperation<String>
+class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, BackgroundOperation<String>, ErrorListenerPathable<Stat>
 {
     private final CuratorFrameworkImpl client;
 
@@ -63,48 +63,55 @@ class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, Back
     }
 
     @Override
-    public Pathable<Stat> inBackground()
+    public ErrorListenerPathable<Stat> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(Object context)
+    public ErrorListenerPathable<Stat> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public Pathable<Stat> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<Stat> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
+    public Pathable<Stat> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public Stat forPath(String path) throws Exception
     {
         path = client.fixForNamespace(path);
@@ -124,26 +131,33 @@ class SetACLBuilderImpl implements SetACLBuilder, BackgroundPathable<Stat>, Back
     @Override
     public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
     {
-        final TimeTrace     trace = client.getZookeeperClient().startTracer("SetACLBuilderImpl-Background");
-        String              path = operationAndData.getData();
-        client.getZooKeeper().setACL
-        (
-            path,
-            acling.getAclList(path),
-            version,
-            new AsyncCallback.StatCallback()
-            {
-                @SuppressWarnings({"unchecked"})
-                @Override
-                public void processResult(int rc, String path, Object ctx, Stat stat)
+        try
+        {
+            final TimeTrace     trace = client.getZookeeperClient().startTracer("SetACLBuilderImpl-Background");
+            String              path = operationAndData.getData();
+            client.getZooKeeper().setACL
+            (
+                path,
+                acling.getAclList(path),
+                version,
+                new AsyncCallback.StatCallback()
                 {
-                    trace.commit();
-                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_ACL, rc, path, null, ctx, stat, null, null, null, null);
-                    client.processBackgroundOperation(operationAndData, event);
-                }
-            },
-            backgrounding.getContext()
-        );
+                    @SuppressWarnings({"unchecked"})
+                    @Override
+                    public void processResult(int rc, String path, Object ctx, Stat stat)
+                    {
+                        trace.commit();
+                        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_ACL, rc, path, null, ctx, stat, null, null, null, null);
+                        client.processBackgroundOperation(operationAndData, event);
+                    }
+                },
+                backgrounding.getContext()
+            );
+        }
+        catch ( Throwable e )
+        {
+            backgrounding.checkError(e);
+        }
     }
 
     private Stat pathInForeground(final String path) throws Exception

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
----------------------------------------------------------------------
diff --git 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
index 4117930..62e39cf 100644
--- 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
@@ -20,14 +20,7 @@ package org.apache.curator.framework.imps;
 
 import org.apache.curator.RetryLoop;
 import org.apache.curator.TimeTrace;
-import org.apache.curator.framework.api.BackgroundCallback;
-import org.apache.curator.framework.api.BackgroundPathAndBytesable;
-import org.apache.curator.framework.api.CuratorEvent;
-import org.apache.curator.framework.api.CuratorEventType;
-import org.apache.curator.framework.api.PathAndBytesable;
-import org.apache.curator.framework.api.SetDataBackgroundVersionable;
-import org.apache.curator.framework.api.SetDataBuilder;
-import org.apache.curator.framework.api.VersionPathAndBytesable;
+import org.apache.curator.framework.api.*;
 import org.apache.curator.framework.api.transaction.CuratorTransactionBridge;
 import org.apache.curator.framework.api.transaction.OperationType;
 import org.apache.curator.framework.api.transaction.TransactionSetDataBuilder;
@@ -38,7 +31,7 @@ import org.apache.zookeeper.data.Stat;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 
-class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndBytes>
+class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndBytes>, ErrorListenerPathAndBytesable<Stat>
 {
     private final CuratorFrameworkImpl      client;
     private Backgrounding                   backgrounding;
@@ -99,37 +92,37 @@ class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndB
         return new SetDataBackgroundVersionable()
         {
             @Override
-            public PathAndBytesable<Stat> inBackground()
+            public ErrorListenerPathAndBytesable<Stat> inBackground()
             {
                 return SetDataBuilderImpl.this.inBackground();
             }
 
             @Override
-            public PathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context)
+            public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context)
             {
                 return SetDataBuilderImpl.this.inBackground(callback, context);
             }
 
             @Override
-            public PathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
+            public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
             {
                 return SetDataBuilderImpl.this.inBackground(callback, context, executor);
             }
 
             @Override
-            public PathAndBytesable<Stat> inBackground(Object context)
+            public ErrorListenerPathAndBytesable<Stat> inBackground(Object context)
             {
                 return SetDataBuilderImpl.this.inBackground(context);
             }
 
             @Override
-            public PathAndBytesable<Stat> inBackground(BackgroundCallback callback)
+            public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback)
             {
                 return SetDataBuilderImpl.this.inBackground(callback);
             }
 
             @Override
-            public PathAndBytesable<Stat> inBackground(BackgroundCallback callback, Executor executor)
+            public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback, Executor executor)
             {
                 return SetDataBuilderImpl.this.inBackground(callback, executor);
             }
@@ -162,69 +155,83 @@ class SetDataBuilderImpl implements SetDataBuilder, BackgroundOperation<PathAndB
     }
 
     @Override
-    public PathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public PathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public PathAndBytesable<Stat> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public PathAndBytesable<Stat> inBackground()
+    public ErrorListenerPathAndBytesable<Stat> inBackground()
     {
         backgrounding = new Backgrounding(true);
         return this;
     }
 
     @Override
-    public PathAndBytesable<Stat> inBackground(Object context)
+    public ErrorListenerPathAndBytesable<Stat> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
-    public PathAndBytesable<Stat> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathAndBytesable<Stat> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
+    public PathAndBytesable<Stat> withUnhandledErrorListener(UnhandledErrorListener listener)
+    {
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
+
+    @Override
     public void performBackgroundOperation(final OperationAndData<PathAndBytes> operationAndData) throws Exception
     {
-        final TimeTrace   trace = client.getZookeeperClient().startTracer("SetDataBuilderImpl-Background");
-        client.getZooKeeper().setData
-        (
-            operationAndData.getData().getPath(),
-            operationAndData.getData().getData(),
-            version,
-            new AsyncCallback.StatCallback()
-            {
-                @SuppressWarnings({"unchecked"})
-                @Override
-                public void processResult(int rc, String path, Object ctx, Stat stat)
+        try
+        {
+            final TimeTrace   trace = client.getZookeeperClient().startTracer("SetDataBuilderImpl-Background");
+            client.getZooKeeper().setData
+            (
+                operationAndData.getData().getPath(),
+                operationAndData.getData().getData(),
+                version,
+                new AsyncCallback.StatCallback()
                 {
-                    trace.commit();
-                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_DATA, rc, path, null, ctx, stat, null, null, null, null);
-                    client.processBackgroundOperation(operationAndData, event);
-                }
-            },
-            backgrounding.getContext()
-        );
+                    @SuppressWarnings({"unchecked"})
+                    @Override
+                    public void processResult(int rc, String path, Object ctx, Stat stat)
+                    {
+                        trace.commit();
+                        CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SET_DATA, rc, path, null, ctx, stat, null, null, null, null);
+                        client.processBackgroundOperation(operationAndData, event);
+                    }
+                },
+                backgrounding.getContext()
+            );
+        }
+        catch ( Throwable e )
+        {
+            backgrounding.checkError(e);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
index 09dfbae..1e5f371 100755
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
@@ -22,12 +22,14 @@ import org.apache.curator.TimeTrace;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEvent;
 import org.apache.curator.framework.api.CuratorEventType;
+import org.apache.curator.framework.api.ErrorListenerPathable;
 import org.apache.curator.framework.api.Pathable;
 import org.apache.curator.framework.api.SyncBuilder;
+import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.zookeeper.AsyncCallback;
 import java.util.concurrent.Executor;
 
-public class SyncBuilderImpl implements SyncBuilder, BackgroundOperation<String>
+public class SyncBuilderImpl implements SyncBuilder, BackgroundOperation<String>, ErrorListenerPathable<Void>
 {
     private final CuratorFrameworkImpl client;
     private Backgrounding backgrounding = new Backgrounding();
@@ -39,65 +41,79 @@ public class SyncBuilderImpl implements SyncBuilder, BackgroundOperation<String>
     }
 
     @Override
-    public Pathable<Void> inBackground()
+    public ErrorListenerPathable<Void> inBackground()
     {
         // NOP always in background
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(Object context)
+    public ErrorListenerPathable<Void> inBackground(Object context)
     {
         backgrounding = new Backgrounding(context);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback)
     {
         backgrounding = new Backgrounding(callback);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback, Object context)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Object context)
     {
         backgrounding = new Backgrounding(callback, context);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback, Executor executor)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, executor);
         return this;
     }
 
     @Override
-    public Pathable<Void> inBackground(BackgroundCallback callback, Object context, Executor executor)
+    public ErrorListenerPathable<Void> inBackground(BackgroundCallback callback, Object context, Executor executor)
     {
         backgrounding = new Backgrounding(client, callback, context, executor);
         return this;
     }
 
     @Override
-    public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
+    public Pathable<Void> withUnhandledErrorListener(UnhandledErrorListener listener)
     {
-        final TimeTrace trace = client.getZookeeperClient().startTracer("SyncBuilderImpl-Background");
-        final String path = operationAndData.getData();
-        String adjustedPath = client.fixForNamespace(path);
+        backgrounding = new Backgrounding(backgrounding, listener);
+        return this;
+    }
 
-        AsyncCallback.VoidCallback voidCallback = new AsyncCallback.VoidCallback()
+    @Override
+    public void performBackgroundOperation(final OperationAndData<String> operationAndData) throws Exception
+    {
+        try
         {
-            @Override
-            public void processResult(int rc, String path, Object ctx)
+            final TimeTrace trace = client.getZookeeperClient().startTracer("SyncBuilderImpl-Background");
+            final String path = operationAndData.getData();
+            String adjustedPath = client.fixForNamespace(path);
+
+            AsyncCallback.VoidCallback voidCallback = new AsyncCallback.VoidCallback()
             {
-                trace.commit();
-                CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, path, ctx, null, null, null, null, null);
-                client.processBackgroundOperation(operationAndData, event);
-            }
-        };
-        client.getZooKeeper().sync(adjustedPath, voidCallback, backgrounding.getContext());
+                @Override
+                public void processResult(int rc, String path, Object ctx)
+                {
+                    trace.commit();
+                    CuratorEvent event = new CuratorEventImpl(client, CuratorEventType.SYNC, rc, path, path, ctx, null, null, null, null, null);
+                    client.processBackgroundOperation(operationAndData, event);
+                }
+            };
+            client.getZooKeeper().sync(adjustedPath, voidCallback, backgrounding.getContext());
+        }
+        catch ( Throwable e )
+        {
+            backgrounding.checkError(e);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/84996801/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
index 26cc941..8e21929 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
@@ -22,6 +22,7 @@ package org.apache.curator.framework.imps;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLProvider;
 import org.apache.curator.framework.api.BackgroundCallback;
 import org.apache.curator.framework.api.CuratorEvent;
 import org.apache.curator.framework.api.UnhandledErrorListener;
@@ -30,10 +31,10 @@ import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.curator.retry.RetryNTimes;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.TestingServer;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.KeeperException.Code;
+import org.apache.zookeeper.data.ACL;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 import java.util.Arrays;
@@ -46,6 +47,53 @@ import java.util.concurrent.atomic.AtomicReference;
 public class TestFrameworkBackground extends BaseClassForTests
 {
     @Test
+    public void testErrorListener() throws Exception
+    {
+        ACLProvider badAclProvider = new ACLProvider()
+        {
+            @Override
+            public List<ACL> getDefaultAcl()
+            {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public List<ACL> getAclForPath(String path)
+            {
+                throw new UnsupportedOperationException();
+            }
+        };
+        CuratorFramework client = CuratorFrameworkFactory.builder()
+            .connectString(server.getConnectString())
+            .retryPolicy(new RetryOneTime(1))
+            .aclProvider(badAclProvider)
+            .build();
+        try
+        {
+            client.start();
+
+            final CountDownLatch errorLatch = new CountDownLatch(1);
+            UnhandledErrorListener listener = new UnhandledErrorListener()
+            {
+                @Override
+                public void unhandledError(String message, Throwable e)
+                {
+                    if ( e instanceof UnsupportedOperationException )
+                    {
+                        errorLatch.countDown();
+                    }
+                }
+            };
+            client.create().inBackground().withUnhandledErrorListener(listener).forPath("/foo");
+            Assert.assertTrue(new Timing().awaitLatch(errorLatch));
+        }
+        finally
+        {
+            CloseableUtils.closeQuietly(client);
+        }
+    }
+
+    @Test
     public void testListenerConnectedAtStart() throws Exception
     {
         server.stop();


[3/8] curator git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/curator

Posted by ra...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/curator


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

Branch: refs/heads/CURATOR-3.0
Commit: c43116a28fd0737a05754f9db3f3c1eec36329b3
Parents: 7149890 33c19d6
Author: randgalt <ra...@apache.org>
Authored: Wed Feb 10 08:54:11 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Wed Feb 10 08:54:11 2016 -0500

----------------------------------------------------------------------
 .../framework/recipes/cache/TreeCache.java      |  3 ++
 .../recipes/cache/BaseTestTreeCache.java        |  3 +-
 .../framework/recipes/cache/TestTreeCache.java  | 37 +++++++++-----------
 3 files changed, 22 insertions(+), 21 deletions(-)
----------------------------------------------------------------------



[4/8] curator git commit: [maven-release-plugin] prepare release apache-curator-2.10.0

Posted by ra...@apache.org.
[maven-release-plugin] prepare release apache-curator-2.10.0


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

Branch: refs/heads/CURATOR-3.0
Commit: 72ce8563341e35966ed8eb753024adf052144070
Parents: c43116a
Author: randgalt <ra...@apache.org>
Authored: Wed Feb 10 15:14:23 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Wed Feb 10 15:14:23 2016 -0500

----------------------------------------------------------------------
 curator-client/pom.xml             | 4 ++--
 curator-examples/pom.xml           | 2 +-
 curator-framework/pom.xml          | 4 ++--
 curator-recipes/pom.xml            | 4 ++--
 curator-test/pom.xml               | 4 ++--
 curator-x-discovery-server/pom.xml | 4 ++--
 curator-x-discovery/pom.xml        | 4 ++--
 curator-x-rpc/pom.xml              | 4 ++--
 pom.xml                            | 4 ++--
 9 files changed, 17 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-client/pom.xml
----------------------------------------------------------------------
diff --git a/curator-client/pom.xml b/curator-client/pom.xml
index 4080eb5..f25e331 100644
--- a/curator-client/pom.xml
+++ b/curator-client/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-client</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Client</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-examples/pom.xml
----------------------------------------------------------------------
diff --git a/curator-examples/pom.xml b/curator-examples/pom.xml
index 21be8fd..f3a7840 100644
--- a/curator-examples/pom.xml
+++ b/curator-examples/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-examples</artifactId>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-framework/pom.xml
----------------------------------------------------------------------
diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml
index 660fc15..d71c7fa 100644
--- a/curator-framework/pom.xml
+++ b/curator-framework/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-framework</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Framework</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-recipes/pom.xml
----------------------------------------------------------------------
diff --git a/curator-recipes/pom.xml b/curator-recipes/pom.xml
index 6f4c81a..5534a52 100644
--- a/curator-recipes/pom.xml
+++ b/curator-recipes/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-recipes</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Recipes</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-test/pom.xml
----------------------------------------------------------------------
diff --git a/curator-test/pom.xml b/curator-test/pom.xml
index f63fb0a..ff7cd11 100644
--- a/curator-test/pom.xml
+++ b/curator-test/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-test</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
 
     <name>Curator Testing</name>
     <description>Unit testing utilities.</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-x-discovery-server/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery-server/pom.xml b/curator-x-discovery-server/pom.xml
index b60b0a0..7f7a4c1 100644
--- a/curator-x-discovery-server/pom.xml
+++ b/curator-x-discovery-server/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-x-discovery-server</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery Server</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-x-discovery/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery/pom.xml b/curator-x-discovery/pom.xml
index 7a0890f..7bcb64f 100644
--- a/curator-x-discovery/pom.xml
+++ b/curator-x-discovery/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
 
     <artifactId>curator-x-discovery</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/curator-x-rpc/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-rpc/pom.xml b/curator-x-rpc/pom.xml
index d28a02b..8bbce93 100644
--- a/curator-x-rpc/pom.xml
+++ b/curator-x-rpc/pom.xml
@@ -22,12 +22,12 @@
     <parent>
         <artifactId>apache-curator</artifactId>
         <groupId>org.apache.curator</groupId>
-        <version>2.10.1-SNAPSHOT</version>
+        <version>2.10.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>curator-x-rpc</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
 
     <name>Curator RPC Proxy</name>
     <description>A proxy that bridges non-java environments with the Curator framework and recipes</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/72ce8563/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ea86185..33f22cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.apache.curator</groupId>
     <artifactId>apache-curator</artifactId>
-    <version>2.10.1-SNAPSHOT</version>
+    <version>2.10.0</version>
     <packaging>pom</packaging>
 
     <name>Apache Curator</name>
@@ -98,7 +98,7 @@
         <connection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git</connection>
         <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git
         </developerConnection>
-        <tag>apache-curator-2.8.0</tag>
+        <tag>apache-curator-2.10.0</tag>
     </scm>
 
     <issueManagement>


[2/8] curator git commit: [maven-release-plugin] prepare for next development iteration

Posted by ra...@apache.org.
[maven-release-plugin] prepare for next development iteration


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

Branch: refs/heads/CURATOR-3.0
Commit: 71498909f940735b8b0c3c214f2f6ee83b9b555b
Parents: 4956fd9
Author: randgalt <ra...@apache.org>
Authored: Mon Feb 8 13:25:54 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Mon Feb 8 13:25:54 2016 -0500

----------------------------------------------------------------------
 curator-client/pom.xml             | 4 ++--
 curator-examples/pom.xml           | 2 +-
 curator-framework/pom.xml          | 4 ++--
 curator-recipes/pom.xml            | 4 ++--
 curator-test/pom.xml               | 4 ++--
 curator-x-discovery-server/pom.xml | 4 ++--
 curator-x-discovery/pom.xml        | 4 ++--
 curator-x-rpc/pom.xml              | 4 ++--
 pom.xml                            | 4 ++--
 9 files changed, 17 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-client/pom.xml
----------------------------------------------------------------------
diff --git a/curator-client/pom.xml b/curator-client/pom.xml
index f25e331..4080eb5 100644
--- a/curator-client/pom.xml
+++ b/curator-client/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-client</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Client</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-examples/pom.xml
----------------------------------------------------------------------
diff --git a/curator-examples/pom.xml b/curator-examples/pom.xml
index f3a7840..21be8fd 100644
--- a/curator-examples/pom.xml
+++ b/curator-examples/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-examples</artifactId>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-framework/pom.xml
----------------------------------------------------------------------
diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml
index d71c7fa..660fc15 100644
--- a/curator-framework/pom.xml
+++ b/curator-framework/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-framework</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Framework</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-recipes/pom.xml
----------------------------------------------------------------------
diff --git a/curator-recipes/pom.xml b/curator-recipes/pom.xml
index 5534a52..6f4c81a 100644
--- a/curator-recipes/pom.xml
+++ b/curator-recipes/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-recipes</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Recipes</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-test/pom.xml
----------------------------------------------------------------------
diff --git a/curator-test/pom.xml b/curator-test/pom.xml
index ff7cd11..f63fb0a 100644
--- a/curator-test/pom.xml
+++ b/curator-test/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-test</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
 
     <name>Curator Testing</name>
     <description>Unit testing utilities.</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-x-discovery-server/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery-server/pom.xml b/curator-x-discovery-server/pom.xml
index 7f7a4c1..b60b0a0 100644
--- a/curator-x-discovery-server/pom.xml
+++ b/curator-x-discovery-server/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-x-discovery-server</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery Server</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-x-discovery/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery/pom.xml b/curator-x-discovery/pom.xml
index 7bcb64f..7a0890f 100644
--- a/curator-x-discovery/pom.xml
+++ b/curator-x-discovery/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-x-discovery</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/curator-x-rpc/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-rpc/pom.xml b/curator-x-rpc/pom.xml
index 8bbce93..d28a02b 100644
--- a/curator-x-rpc/pom.xml
+++ b/curator-x-rpc/pom.xml
@@ -22,12 +22,12 @@
     <parent>
         <artifactId>apache-curator</artifactId>
         <groupId>org.apache.curator</groupId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>curator-x-rpc</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
 
     <name>Curator RPC Proxy</name>
     <description>A proxy that bridges non-java environments with the Curator framework and recipes</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/71498909/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 33f22cd..ea86185 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.apache.curator</groupId>
     <artifactId>apache-curator</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <name>Apache Curator</name>
@@ -98,7 +98,7 @@
         <connection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git</connection>
         <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git
         </developerConnection>
-        <tag>apache-curator-2.10.0</tag>
+        <tag>apache-curator-2.8.0</tag>
     </scm>
 
     <issueManagement>


[5/8] curator git commit: [maven-release-plugin] prepare for next development iteration

Posted by ra...@apache.org.
[maven-release-plugin] prepare for next development iteration


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

Branch: refs/heads/CURATOR-3.0
Commit: 18e912dc973f888526352b24db807708c547caa7
Parents: 72ce856
Author: randgalt <ra...@apache.org>
Authored: Wed Feb 10 15:14:36 2016 -0500
Committer: randgalt <ra...@apache.org>
Committed: Wed Feb 10 15:14:36 2016 -0500

----------------------------------------------------------------------
 curator-client/pom.xml             | 4 ++--
 curator-examples/pom.xml           | 2 +-
 curator-framework/pom.xml          | 4 ++--
 curator-recipes/pom.xml            | 4 ++--
 curator-test/pom.xml               | 4 ++--
 curator-x-discovery-server/pom.xml | 4 ++--
 curator-x-discovery/pom.xml        | 4 ++--
 curator-x-rpc/pom.xml              | 4 ++--
 pom.xml                            | 4 ++--
 9 files changed, 17 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-client/pom.xml
----------------------------------------------------------------------
diff --git a/curator-client/pom.xml b/curator-client/pom.xml
index f25e331..4080eb5 100644
--- a/curator-client/pom.xml
+++ b/curator-client/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-client</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Client</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-examples/pom.xml
----------------------------------------------------------------------
diff --git a/curator-examples/pom.xml b/curator-examples/pom.xml
index f3a7840..21be8fd 100644
--- a/curator-examples/pom.xml
+++ b/curator-examples/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-examples</artifactId>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-framework/pom.xml
----------------------------------------------------------------------
diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml
index d71c7fa..660fc15 100644
--- a/curator-framework/pom.xml
+++ b/curator-framework/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-framework</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Framework</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-recipes/pom.xml
----------------------------------------------------------------------
diff --git a/curator-recipes/pom.xml b/curator-recipes/pom.xml
index 5534a52..6f4c81a 100644
--- a/curator-recipes/pom.xml
+++ b/curator-recipes/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-recipes</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Recipes</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-test/pom.xml
----------------------------------------------------------------------
diff --git a/curator-test/pom.xml b/curator-test/pom.xml
index ff7cd11..f63fb0a 100644
--- a/curator-test/pom.xml
+++ b/curator-test/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-test</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
 
     <name>Curator Testing</name>
     <description>Unit testing utilities.</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-x-discovery-server/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery-server/pom.xml b/curator-x-discovery-server/pom.xml
index 7f7a4c1..b60b0a0 100644
--- a/curator-x-discovery-server/pom.xml
+++ b/curator-x-discovery-server/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-x-discovery-server</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery Server</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-x-discovery/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-discovery/pom.xml b/curator-x-discovery/pom.xml
index 7bcb64f..7a0890f 100644
--- a/curator-x-discovery/pom.xml
+++ b/curator-x-discovery/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <groupId>org.apache.curator</groupId>
         <artifactId>apache-curator</artifactId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
 
     <artifactId>curator-x-discovery</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Curator Service Discovery</name>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/curator-x-rpc/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-rpc/pom.xml b/curator-x-rpc/pom.xml
index 8bbce93..d28a02b 100644
--- a/curator-x-rpc/pom.xml
+++ b/curator-x-rpc/pom.xml
@@ -22,12 +22,12 @@
     <parent>
         <artifactId>apache-curator</artifactId>
         <groupId>org.apache.curator</groupId>
-        <version>2.10.0</version>
+        <version>2.10.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>curator-x-rpc</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
 
     <name>Curator RPC Proxy</name>
     <description>A proxy that bridges non-java environments with the Curator framework and recipes</description>

http://git-wip-us.apache.org/repos/asf/curator/blob/18e912dc/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 33f22cd..ea86185 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.apache.curator</groupId>
     <artifactId>apache-curator</artifactId>
-    <version>2.10.0</version>
+    <version>2.10.1-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <name>Apache Curator</name>
@@ -98,7 +98,7 @@
         <connection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git</connection>
         <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/curator.git
         </developerConnection>
-        <tag>apache-curator-2.10.0</tag>
+        <tag>apache-curator-2.8.0</tag>
     </scm>
 
     <issueManagement>