Repository: jclouds Updated Branches: refs/heads/master 8344ddcc2 -> e446b5b8b
JCLOUDS-1111: Force overwriting Atmos objects This avoids a racy delete then write in the portable abstraction. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e446b5b8 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e446b5b8 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e446b5b8 Branch: refs/heads/master Commit: e446b5b8b433327d8a11c0364abb051cff833431 Parents: 8344ddc Author: Andrew Gaul <[email protected]> Authored: Sat Jul 8 15:17:37 2017 -0700 Committer: Andrew Gaul <[email protected]> Committed: Sat Jul 8 15:50:04 2017 -0700 ---------------------------------------------------------------------- .../org/jclouds/atmos/blobstore/AtmosBlobStore.java | 1 + .../java/org/jclouds/atmos/options/PutOptions.java | 11 +++++++++++ .../java/org/jclouds/atmos/util/AtmosUtils.java | 10 +--------- .../internal/BaseBlobIntegrationTest.java | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/e446b5b8/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java index a75fee2..d172129 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/AtmosBlobStore.java @@ -258,6 +258,7 @@ public class AtmosBlobStore extends BaseBlobStore { if (options.getBlobAccess() == BlobAccess.PUBLIC_READ) { atmosOptions.publicRead(); } + atmosOptions.overwrite(); return AtmosUtils.putBlob(sync, crypto, blob2Object, container, blob, atmosOptions); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e446b5b8/apis/atmos/src/main/java/org/jclouds/atmos/options/PutOptions.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/options/PutOptions.java b/apis/atmos/src/main/java/org/jclouds/atmos/options/PutOptions.java index a0bdded..7811d84 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/options/PutOptions.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/options/PutOptions.java @@ -53,6 +53,12 @@ public class PutOptions extends BaseHttpRequestOptions { return this; } + /** By default Atmos does not allow overwriting objects. */ + public PutOptions overwrite() { + this.replaceHeader("x-emc-force-overwrite", "true"); + return this; + } + public static class Builder { /** @@ -67,5 +73,10 @@ public class PutOptions extends BaseHttpRequestOptions { PutOptions options = new PutOptions(); return options.publicNone(); } + + public static PutOptions overwrite() { + PutOptions options = new PutOptions(); + return options.overwrite(); + } } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e446b5b8/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java ---------------------------------------------------------------------- diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java b/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java index 4534ea2..790745c 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java @@ -33,7 +33,6 @@ import org.jclouds.atmos.options.PutOptions; import org.jclouds.atmos.reference.AtmosErrorCode; import org.jclouds.atmos.xml.ErrorHandler; import org.jclouds.blobstore.ContainerNotFoundException; -import org.jclouds.blobstore.KeyAlreadyExistsException; import org.jclouds.blobstore.domain.Blob; import org.jclouds.crypto.Crypto; import org.jclouds.http.HttpCommand; @@ -72,14 +71,7 @@ public class AtmosUtils { Blob blob, PutOptions options) { final String path = container + "/" + blob.getMetadata().getName(); final AtmosObject object = blob2Object.apply(blob); - - try { - sync.createFile(container, object, options); - - } catch (KeyAlreadyExistsException e) { - deletePathAndEnsureGone(sync, path); - sync.createFile(container, object, options); - } + sync.createFile(container, object, options); return path; } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e446b5b8/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java ---------------------------------------------------------------------- diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java index 2e13783..5aee9f7 100644 --- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java @@ -230,6 +230,22 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest { } @Test(groups = { "integration", "live" }) + public void testOverwriteBlob() throws InterruptedException { + String container = getContainerName(); + BlobStore blobStore = view.getBlobStore(); + try { + String blobName = "hello"; + Blob blob = blobStore.blobBuilder(blobName) + .payload(TEST_STRING) + .build(); + blobStore.putBlob(container, blob); + blobStore.putBlob(container, blob); + } finally { + returnContainer(container); + } + } + + @Test(groups = { "integration", "live" }) public void testCreateBlobWithExpiry() throws InterruptedException { String container = getContainerName(); BlobStore blobStore = view.getBlobStore();
