JCLOUDS-457: Fix deleteContainer

The ClearVaultStrategy now ignores ResourceNotFound exceptions.

deleteContainer now tries to delete the vault first to avoid long waits.
If the delete request fails, retries it every 24 hours.
This commit is contained in:
Roman Coedo 2014-07-28 08:13:48 +02:00 committed by Andrew Gaul
parent 3b3939b798
commit f7e81799ac
2 changed files with 35 additions and 2 deletions

View File

@ -18,8 +18,11 @@ package org.jclouds.glacier.blobstore;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static org.jclouds.util.Predicates2.retry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.domain.Blob;
@ -48,11 +51,19 @@ import org.jclouds.glacier.domain.ArchiveRetrievalJobRequest;
import org.jclouds.glacier.util.ContentRange;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.name.Named;
public class GlacierBlobStore extends BaseBlobStore {
public static final long DEFAULT_INVENTORY_UPDATE_TIME = TimeUnit.HOURS.toMillis(24);
@Inject(optional = true)
@Named("jclouds.inventory.update.time")
private final long inventoryUpdateTime = DEFAULT_INVENTORY_UPDATE_TIME;
private final GlacierClient sync;
private final Crypto crypto;
private final Provider<MultipartUploadStrategy> multipartUploadStrategy;
@ -79,6 +90,24 @@ public class GlacierBlobStore extends BaseBlobStore {
this.crypto = checkNotNull(crypto, "crypto");
}
@Override
public void deleteContainer(String container) {
// attempt to delete possibly-empty vault to avoid inventory retrieval
if (!sync.deleteVault(container)) {
deletePathAndEnsureGone(container);
}
}
@Override
protected void deletePathAndEnsureGone(String container) {
checkState(retry(new Predicate<String>() {
public boolean apply(String container) {
clearContainer(container);
return sync.deleteVault(container);
}
}, inventoryUpdateTime).apply(container), "%s still exists after deleting!", container);
}
@Override
protected boolean deleteAndVerifyContainerGone(String container) {
return sync.deleteVault(container);

View File

@ -24,6 +24,7 @@ import org.jclouds.glacier.GlacierClient;
import org.jclouds.glacier.domain.ArchiveMetadata;
import org.jclouds.glacier.domain.ArchiveMetadataCollection;
import org.jclouds.glacier.domain.InventoryRetrievalJobRequest;
import org.jclouds.rest.ResourceNotFoundException;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@ -45,8 +46,11 @@ public class ClearVaultStrategy implements ClearListStrategy {
try {
if (pollingStrategy.waitForSuccess(container, jobId)) {
ArchiveMetadataCollection archives = sync.getInventoryRetrievalOutput(container, jobId);
for(ArchiveMetadata archive : archives) {
sync.deleteArchive(container, archive.getArchiveId());
for (ArchiveMetadata archive : archives) {
try {
sync.deleteArchive(container, archive.getArchiveId());
} catch (ResourceNotFoundException ignored) {
}
}
}
} catch (InterruptedException e) {