Merge branch 'CURATOR-161' into CURATOR-217
Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/fb274b1c Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/fb274b1c Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/fb274b1c Branch: refs/heads/CURATOR-3.0 Commit: fb274b1c8d56eeae97c50966ba69e6b98fd71274 Parents: 43afca7 a47c036 Author: randgalt <[email protected]> Authored: Tue May 19 17:52:58 2015 -0700 Committer: randgalt <[email protected]> Committed: Tue May 19 17:52:58 2015 -0700 ---------------------------------------------------------------------- .../curator/framework/CuratorFramework.java | 4 + .../curator/framework/api/DeleteBuilder.java | 2 +- .../curator/framework/api/Guaranteeable.java | 20 +- .../framework/api/GuaranteeableDelete.java | 39 ++ .../framework/api/RemoveWatchesLocal.java | 4 +- .../framework/api/RemoveWatchesType.java | 2 +- .../framework/imps/CuratorFrameworkImpl.java | 10 +- .../framework/imps/DeleteBuilderImpl.java | 4 +- .../framework/imps/FailedDeleteManager.java | 39 +- .../framework/imps/FailedOperationManager.java | 65 +++ .../imps/FailedRemoveWatchManager.java | 56 +++ .../framework/imps/NamespaceWatcherMap.java | 8 + .../framework/imps/OperationAndData.java | 16 +- .../imps/RemoveWatchesBuilderImpl.java | 126 ++++-- .../framework/imps/TestFailedDeleteManager.java | 9 +- .../framework/imps/TestRemoveWatches.java | 407 +++++++++++++++---- 16 files changed, 635 insertions(+), 176 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/fb274b1c/curator-framework/src/main/java/org/apache/curator/framework/CuratorFramework.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/fb274b1c/curator-framework/src/main/java/org/apache/curator/framework/api/RemoveWatchesLocal.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/fb274b1c/curator-framework/src/main/java/org/apache/curator/framework/api/RemoveWatchesType.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/fb274b1c/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/fb274b1c/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 10d58d0,932706b..4b1b029 --- 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 @@@ -169,44 -164,87 +190,87 @@@ public class RemoveWatchesBuilderImpl i return null; } - private void pathInBackground(String path) + private void pathInBackground(final String path) { - OperationAndData.ErrorCallback<String> errorCallback = null; - client.processBackgroundOperation(new OperationAndData<String>(this, path, backgrounding.getCallback(), errorCallback, backgrounding.getContext()), null); + 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 + void pathInForeground(final String path) throws Exception { - RetryLoop.callWithRetry(client.getZookeeperClient(), - new Callable<Void>() - { - @Override - public Void call() throws Exception + //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(watcher == null) + { + zkClient.removeAllWatches(path, watcherType, local); + } + else + { + zkClient.removeWatches(path, watcher, watcherType, local); + } + } + else + { + RetryLoop.callWithRetry(client.getZookeeperClient(), + new Callable<Void>() { - try + @Override + public Void call() throws Exception { - ZooKeeper zkClient = client.getZooKeeper(); - if(watcher == null) - { - zkClient.removeAllWatches(path, watcherType, local); - } - else + try { - zkClient.removeWatches(path, watcher, watcherType, local); + ZooKeeper zkClient = client.getZookeeperClient().getZooKeeper(); + + if(watcher == null) + { + zkClient.removeAllWatches(path, watcherType, local); + } + else + { + zkClient.removeWatches(path, watcher, watcherType, local); + } } - } - catch(KeeperException.NoWatcherException e) - { - //Swallow this exception if the quietly flag is set, otherwise rethrow. - if(!quietly) + catch(Exception e) { - throw e; + if( RetryLoop.isRetryException(e) && guaranteed ) + { + //Setup the guaranteed handler + client.getFailedRemoveWatcherManager().addFailedOperation(new FailedRemoveWatchManager.FailedRemoveWatchDetails(path, watcher)); + throw e; + } + else if(e instanceof KeeperException.NoWatcherException && quietly) + { + //Ignore + } + else + { + //Rethrow + throw e; + } } - } - return null; - } - }); + return null; + } + }); + } } @Override http://git-wip-us.apache.org/repos/asf/curator/blob/fb274b1c/curator-framework/src/test/java/org/apache/curator/framework/imps/TestRemoveWatches.java ----------------------------------------------------------------------
