From f7e81799acea52204617cb651a94da18fe73e617 Mon Sep 17 00:00:00 2001 From: Roman Coedo Date: Mon, 28 Jul 2014 08:13:48 +0200 Subject: [PATCH] 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. --- .../glacier/blobstore/GlacierBlobStore.java | 29 +++++++++++++++++++ .../strategy/ClearVaultStrategy.java | 8 +++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java b/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java index 20d6c073a5..f2f62263a0 100644 --- a/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java +++ b/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/GlacierBlobStore.java @@ -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; @@ -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() { + 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); diff --git a/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/ClearVaultStrategy.java b/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/ClearVaultStrategy.java index 276ed01487..1758460d43 100644 --- a/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/ClearVaultStrategy.java +++ b/apis/glacier/src/main/java/org/jclouds/glacier/blobstore/strategy/ClearVaultStrategy.java @@ -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) {