Updated Branches: refs/heads/master d113b0ba6 -> 86147cd96
Remove AsyncBlobStore from DeleteAllKeysInList We deprecated AsyncBlobStore in 1.6.0. Subsequent commits will require the caller to provide an ExecutorService. Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/86147cd9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/86147cd9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/86147cd9 Branch: refs/heads/master Commit: 86147cd961680e81108a5c535690c1d4478fdab4 Parents: d113b0b Author: Andrew Gaul <[email protected]> Authored: Fri May 31 20:26:11 2013 -0700 Committer: Andrew Gaul <[email protected]> Committed: Wed Jun 5 10:41:55 2013 -0700 ---------------------------------------------------------------------- .../strategy/internal/DeleteAllKeysInList.java | 68 +++++++-------- .../strategy/internal/DeleteAllKeysInListTest.java | 22 ----- 2 files changed, 30 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/86147cd9/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInList.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInList.java b/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInList.java index c30f10d..a5bb19b 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInList.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInList.java @@ -30,7 +30,7 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.Constants; -import org.jclouds.blobstore.AsyncBlobStore; +import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.internal.BlobRuntimeException; @@ -58,9 +58,9 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr protected Logger logger = Logger.NULL; protected final BackoffLimitedRetryHandler retryHandler; - private final ListeningExecutorService userExecutor; + private final ListeningExecutorService executorService; - protected final AsyncBlobStore connection; + protected final BlobStore blobStore; /** Maximum duration in milliseconds of a request. */ protected long maxTime = Long.MAX_VALUE; @@ -69,10 +69,10 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr protected int maxErrors = 3; @Inject - DeleteAllKeysInList(@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, - AsyncBlobStore connection, BackoffLimitedRetryHandler retryHandler) { - this.userExecutor = userExecutor; - this.connection = connection; + DeleteAllKeysInList(@Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService executorService, + BlobStore blobStore, BackoffLimitedRetryHandler retryHandler) { + this.executorService = executorService; + this.blobStore = blobStore; this.retryHandler = retryHandler; } @@ -101,31 +101,8 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr Map<StorageMetadata, Exception> exceptions = Maps.newHashMap(); for (int numErrors = 0; numErrors < maxErrors; ) { // fetch partial directory listing - PageSet<? extends StorageMetadata> listing; - ListenableFuture<PageSet<? extends StorageMetadata>> listFuture = - connection.list(containerName, options); - try { - listing = listFuture.get(maxTime, TimeUnit.MILLISECONDS); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - break; - } catch (ExecutionException ee) { - ++numErrors; - if (numErrors == maxErrors) { - throw propagate(ee.getCause()); - } - retryHandler.imposeBackoffExponentialDelay(numErrors, message); - continue; - } catch (TimeoutException te) { - ++numErrors; - if (numErrors == maxErrors) { - throw propagate(te); - } - retryHandler.imposeBackoffExponentialDelay(numErrors, message); - continue; - } finally { - listFuture.cancel(true); - } + PageSet<? extends StorageMetadata> listing = + blobStore.list(containerName, options); // recurse on subdirectories if (options.isRecursive()) { @@ -149,21 +126,36 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr // remove blobs and now-empty subdirectories Map<StorageMetadata, ListenableFuture<?>> responses = Maps.newHashMap(); - for (StorageMetadata md : listing) { - String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + for (final StorageMetadata md : listing) { + final String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case BLOB: - responses.put(md, connection.removeBlob(containerName, fullPath)); + responses.put(md, executorService.submit(new Runnable() { + @Override + public void run() { + blobStore.removeBlob(containerName, fullPath); + } + })); break; case FOLDER: if (options.isRecursive()) { - responses.put(md, connection.deleteDirectory(containerName, fullPath)); + responses.put(md, executorService.submit(new Runnable() { + @Override + public void run() { + blobStore.deleteDirectory(containerName, fullPath); + } + })); } break; case RELATIVE_PATH: if (options.isRecursive()) { - responses.put(md, connection.deleteDirectory(containerName, md.getName())); + responses.put(md, executorService.submit(new Runnable() { + @Override + public void run() { + blobStore.deleteDirectory(containerName, md.getName()); + } + })); } break; case CONTAINER: @@ -172,7 +164,7 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr } try { - exceptions = awaitCompletion(responses, userExecutor, maxTime, logger, message); + exceptions = awaitCompletion(responses, executorService, maxTime, logger, message); } catch (TimeoutException te) { ++numErrors; if (numErrors == maxErrors) { http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/86147cd9/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInListTest.java ---------------------------------------------------------------------- diff --git a/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInListTest.java b/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInListTest.java index 3cf80c5..3f6e12b 100644 --- a/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInListTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/strategy/internal/DeleteAllKeysInListTest.java @@ -28,7 +28,6 @@ import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeUnit; import org.jclouds.ContextBuilder; -import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.domain.PageSet; @@ -86,27 +85,6 @@ public class DeleteAllKeysInListTest { assertEquals(blobstore.countBlobs(containerName), 1111); } - public void testListTimeoutException() throws Exception { - ListenableFuture<PageSet<? extends StorageMetadata>> future = createMock(ListenableFuture.class); - expect(future.get(anyLong(), anyObject(TimeUnit.class))).andThrow(new RuntimeException(new TimeoutException())); - expect(future.cancel(true)).andReturn(true); - replay(future); - - AsyncBlobStore asyncBlobStore = createMock(AsyncBlobStore.class); - expect(asyncBlobStore.list(anyObject(String.class), anyObject(ListContainerOptions.class))).andReturn(future); - replay(asyncBlobStore); - - deleter = new DeleteAllKeysInList(null, asyncBlobStore, null); - try { - deleter.execute(containerName, ListContainerOptions.NONE); - fail(); - } catch (Exception e) { - if (Throwables2.getFirstThrowableOfType(e, TimeoutException.class) == null) { - throw e; - } - } - } - /** * Create a container "container" with 1111 blobs named "blob-%d". Create a * subdirectory "directory" which contains 2222 more blobs named
