public void execute(String containerName) { execute(containerName, recursive()); }
executeOneIteration(containerName, listOptions, semaphore, outstandingFutures, deleteFailure, /*blocking=*/ false); waitForCompletion(semaphore, outstandingFutures); String message = getMessage(containerName, listOptions); retryHandler.imposeBackoffExponentialDelay(maxErrors - retries, message); cancelOutstandingFutures(outstandingFutures); throw new BlobRuntimeException("Exceeded maximum retry attempts");
final AtomicBoolean deleteFailure, final boolean blocking) { ListContainerOptions options = listOptions.clone(); String message = getMessage(containerName, listOptions); if (options.isRecursive()) { message += " recursively"; PageSet<? extends StorageMetadata> listing = getListing(containerName, options, semaphore, outstandingFutures, deleteFailure); while (listing != null && !listing.isEmpty()) { try { deleteBlobsAndEmptyDirs(containerName, options, listing, semaphore, deleteFailure, outstandingFutures); } catch (TimeoutException te) { logger.debug("TimeoutException while deleting blobs: {}", te.getMessage()); cancelOutstandingFutures(outstandingFutures); deleteFailure.set(true); logger.debug("%s with marker %s", message, marker); options = options.afterMarker(marker); listing = getListing(containerName, options, semaphore, outstandingFutures, deleteFailure); } else { waitForCompletion(semaphore, outstandingFutures);
String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case RELATIVE_PATH: if (options.isRecursive() && !fullPath.equals(options.getDir())) { execute(containerName, options.clone().inDirectory(fullPath)); final String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) {
String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case RELATIVE_PATH: if (!fullPath.equals(options.getDir())) { executeOneIteration(containerName, options.clone().inDirectory(fullPath), semaphore, outstandingFutures, deleteFailure, /*blocking=*/ true);
throws TimeoutException { for (final StorageMetadata md : listing) { final String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); break; case RELATIVE_PATH: blobDelFuture = deleteDirectory(options, containerName, md.getName()); break;
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; } } }
@SuppressWarnings("unchecked") public void testExceptionThrownAfterMaxRetries() { IMocksControl mockControl = createControl(); ListeningExecutorService executorService = mockControl .createMock(ListeningExecutorService.class); DeleteAllKeysInList testDeleter = createMockBuilder( DeleteAllKeysInList.class).withConstructor(executorService, blobstore, retryHandler, maxParallelDeletes).createMock(); // Fail the first future that is created for deleting blobs. EasyMock.<ListenableFuture<?>> expect( executorService.submit(isA(Callable.class))) .andReturn( Futures.<Void> immediateFailedFuture(new RuntimeException())) .once(); EasyMock.expectLastCall().andReturn(Futures.<Void> immediateFuture(null)) .anyTimes(); replay(executorService); testDeleter.setMaxErrors(1); boolean blobRunTimeExceptionThrown = false; try { testDeleter.execute(containerName, ListContainerOptions.Builder.recursive()); } catch (BlobRuntimeException be) { blobRunTimeExceptionThrown = true; } assertTrue(blobRunTimeExceptionThrown, "Expected a BlobRunTimeException"); }
testDeleter.setMaxErrors(1); testDeleter.executeOneIteration(containerName, ListContainerOptions.Builder.recursive(), semaphore, outstandingFutures, deleteFailure, /* blocking = */false);
private void waitForCompletion(final Semaphore semaphore, final Set<ListenableFuture<Void>> outstandingFutures) { // Wait for all futures to complete by waiting to acquire all // semaphores. try { semaphore.acquire(maxParallelDeletes); semaphore.release(maxParallelDeletes); } catch (InterruptedException e) { logger.debug("Interrupted while waiting for blobs to be deleted"); cancelOutstandingFutures(outstandingFutures); Thread.currentThread().interrupt(); } }
final AtomicBoolean deleteFailure, final boolean blocking) { ListContainerOptions options = listOptions.clone(); String message = getMessage(containerName, listOptions); if (options.isRecursive()) { message += " recursively"; PageSet<? extends StorageMetadata> listing = getListing(containerName, options, semaphore, outstandingFutures, deleteFailure); while (listing != null && !listing.isEmpty()) { try { deleteBlobsAndEmptyDirs(containerName, options, listing, semaphore, deleteFailure, outstandingFutures); } catch (TimeoutException te) { logger.debug("TimeoutException while deleting blobs: {}", te.getMessage()); cancelOutstandingFutures(outstandingFutures); deleteFailure.set(true); logger.debug("%s with marker %s", message, marker); options = options.afterMarker(marker); listing = getListing(containerName, options, semaphore, outstandingFutures, deleteFailure); } else { waitForCompletion(semaphore, outstandingFutures);
String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case RELATIVE_PATH: if (options.isRecursive() && !fullPath.equals(options.getDir())) { execute(containerName, options.clone().inDirectory(fullPath)); String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) {
String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case RELATIVE_PATH: if (!fullPath.equals(options.getDir())) { executeOneIteration(containerName, options.clone().inDirectory(fullPath), semaphore, outstandingFutures, deleteFailure, /*blocking=*/ true);
throws TimeoutException { for (final StorageMetadata md : listing) { final String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); break; case RELATIVE_PATH: blobDelFuture = deleteDirectory(options, containerName, md.getName()); break;
private void waitForCompletion(final Semaphore semaphore, final Set<ListenableFuture<Void>> outstandingFutures) { // Wait for all futures to complete by waiting to acquire all // semaphores. try { semaphore.acquire(maxParallelDeletes); semaphore.release(maxParallelDeletes); } catch (InterruptedException e) { logger.debug("Interrupted while waiting for blobs to be deleted"); cancelOutstandingFutures(outstandingFutures); Thread.currentThread().interrupt(); } }
final AtomicBoolean deleteFailure, final boolean blocking) { ListContainerOptions options = listOptions.clone(); String message = getMessage(containerName, listOptions); if (options.isRecursive()) { message += " recursively"; PageSet<? extends StorageMetadata> listing = getListing(containerName, options, semaphore, outstandingFutures, deleteFailure); while (listing != null && !listing.isEmpty()) { try { deleteBlobsAndEmptyDirs(containerName, options, listing, semaphore, deleteFailure, outstandingFutures); } catch (TimeoutException te) { logger.debug("TimeoutException while deleting blobs: {}", te.getMessage()); cancelOutstandingFutures(outstandingFutures); deleteFailure.set(true); logger.debug("%s with marker %s", message, marker); options = options.afterMarker(marker); listing = getListing(containerName, options, semaphore, outstandingFutures, deleteFailure); } else { waitForCompletion(semaphore, outstandingFutures);
public void execute(String containerName) { execute(containerName, recursive()); }
executeOneIteration(containerName, listOptions, semaphore, outstandingFutures, deleteFailure, /*blocking=*/ false); waitForCompletion(semaphore, outstandingFutures); String message = getMessage(containerName, listOptions); retryHandler.imposeBackoffExponentialDelay(maxErrors - retries, message); cancelOutstandingFutures(outstandingFutures); throw new BlobRuntimeException("Exceeded maximum retry attempts");
String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case RELATIVE_PATH: if (options.isRecursive() && !fullPath.equals(options.getDir())) { execute(containerName, options.clone().inDirectory(fullPath)); String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) {
String fullPath = parentIsFolder(options, md) ? options.getDir() + "/" + md.getName() : md.getName(); switch (md.getType()) { case RELATIVE_PATH: if (!fullPath.equals(options.getDir())) { executeOneIteration(containerName, options.clone().inDirectory(fullPath), semaphore, outstandingFutures, deleteFailure, /*blocking=*/ true);