Cancel Futures in clearContainer

This prevents Futures from hanging around on exceptional code paths like
interrupts and timeouts.
This commit is contained in:
Andrew Gaul 2012-11-01 17:14:56 -07:00
parent ddbb41130d
commit 76a5538229
1 changed files with 11 additions and 2 deletions

View File

@ -91,12 +91,14 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr
if (options.isRecursive())
message = message + " recursively";
Map<StorageMetadata, Exception> exceptions = Maps.newHashMap();
PageSet<? extends StorageMetadata> listing;
int maxErrors = 3; // TODO parameterize
for (int numErrors = 0; numErrors < maxErrors; ) {
// fetch partial directory listing
PageSet<? extends StorageMetadata> listing;
Future<PageSet<? extends StorageMetadata>> listFuture =
connection.list(containerName, options);
try {
listing = connection.list(containerName, options).get();
listing = listFuture.get();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
break;
@ -107,6 +109,8 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr
}
retryHandler.imposeBackoffExponentialDelay(numErrors, message);
continue;
} finally {
listFuture.cancel(true);
}
// recurse on subdirectories
@ -162,7 +166,12 @@ public class DeleteAllKeysInList implements ClearListStrategy, ClearContainerStr
}
retryHandler.imposeBackoffExponentialDelay(numErrors, message);
continue;
} finally {
for (Future<?> future : responses.values()) {
future.cancel(true);
}
}
if (!exceptions.isEmpty()) {
++numErrors;
retryHandler.imposeBackoffExponentialDelay(numErrors, message);