Repository: jclouds Updated Branches: refs/heads/master a845471b8 -> 6df0472ab
JCLOUDS-1125: local blobstore list MPUs Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/6df0472a Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/6df0472a Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/6df0472a Branch: refs/heads/master Commit: 6df0472ab5f70b96ea55ee6f75abd45d218f64ee Parents: a845471 Author: Andrew Gaul <[email protected]> Authored: Mon Jun 20 23:32:04 2016 -0700 Committer: Andrew Gaul <[email protected]> Committed: Thu Jun 23 21:45:04 2016 -0700 ---------------------------------------------------------------------- .../FilesystemBlobIntegrationTest.java | 9 ---- .../blobstore/config/LocalBlobStore.java | 48 ++++++++++++++++---- .../TransientBlobIntegrationTest.java | 9 ---- 3 files changed, 40 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/6df0472a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java ---------------------------------------------------------------------- diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java index fd75a94..d469037 100644 --- a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java +++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemBlobIntegrationTest.java @@ -93,13 +93,4 @@ public class FilesystemBlobIntegrationTest extends BaseBlobIntegrationTest { public void testSetBlobAccess() throws Exception { throw new SkipException("filesystem does not support anonymous access"); } - - @Test(groups = { "integration", "live" }) - public void testListMultipartUploads() throws Exception { - try { - super.testListMultipartUploads(); - } catch (UnsupportedOperationException uoe) { - throw new SkipException("filesystem does not support listing multipart uploads"); - } - } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/6df0472a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java index 577243d..1b46b34 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java @@ -100,6 +100,7 @@ import com.google.common.net.HttpHeaders; @Singleton public final class LocalBlobStore implements BlobStore { + private static final String MULTIPART_PREFIX = ".mpus-"; @Resource private Logger logger = Logger.NULL; @@ -783,7 +784,11 @@ public final class LocalBlobStore implements BlobStore { @Override public MultipartUpload initiateMultipartUpload(String container, BlobMetadata blobMetadata, PutOptions options) { - return MultipartUpload.create(container, blobMetadata.getName(), UUID.randomUUID().toString(), + String uploadId = UUID.randomUUID().toString(); + // create a stub blob + Blob blob = blobBuilder(MULTIPART_PREFIX + uploadId + "-" + blobMetadata.getName() + "-stub").payload(ByteSource.empty()).build(); + putBlob(container, blob); + return MultipartUpload.create(container, blobMetadata.getName(), uploadId, blobMetadata, options); } @@ -791,8 +796,9 @@ public final class LocalBlobStore implements BlobStore { public void abortMultipartUpload(MultipartUpload mpu) { List<MultipartPart> parts = listMultipartUpload(mpu); for (MultipartPart part : parts) { - removeBlob(mpu.containerName(), mpu.blobName() + "-" + part.partNumber()); + removeBlob(mpu.containerName(), MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-" + part.partNumber()); } + removeBlob(mpu.containerName(), MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-stub"); } @Override @@ -800,7 +806,7 @@ public final class LocalBlobStore implements BlobStore { ImmutableList.Builder<InputStream> streams = ImmutableList.builder(); long contentLength = 0; for (MultipartPart part : parts) { - Blob blobPart = getBlob(mpu.containerName(), mpu.blobName() + "-" + part.partNumber()); + Blob blobPart = getBlob(mpu.containerName(), MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-" + part.partNumber()); contentLength += blobPart.getMetadata().getContentMetadata().getContentLength(); InputStream is; try { @@ -843,8 +849,9 @@ public final class LocalBlobStore implements BlobStore { String eTag = putBlob(mpu.containerName(), blobBuilder.build()); for (MultipartPart part : parts) { - storageStrategy.removeBlob(mpu.containerName(), mpu.blobName() + "-" + part.partNumber()); + removeBlob(mpu.containerName(), MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-" + part.partNumber()); } + removeBlob(mpu.containerName(), MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-stub"); setBlobAccess(mpu.containerName(), mpu.blobName(), mpu.putOptions().getBlobAccess()); @@ -853,7 +860,7 @@ public final class LocalBlobStore implements BlobStore { @Override public MultipartPart uploadMultipartPart(MultipartUpload mpu, int partNumber, Payload payload) { - String partName = mpu.blobName() + "-" + partNumber; + String partName = MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-" + partNumber; Blob blob = blobBuilder(partName) .payload(payload) .build(); @@ -866,11 +873,14 @@ public final class LocalBlobStore implements BlobStore { public List<MultipartPart> listMultipartUpload(MultipartUpload mpu) { ImmutableList.Builder<MultipartPart> parts = ImmutableList.builder(); ListContainerOptions options = - new ListContainerOptions().prefix(mpu.blobName() + "-").recursive(); + new ListContainerOptions().prefix(MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-").recursive(); while (true) { PageSet<? extends StorageMetadata> pageSet = list(mpu.containerName(), options); for (StorageMetadata sm : pageSet) { - int partNumber = Integer.parseInt(sm.getName().substring((mpu.blobName() + "-").length())); + if (sm.getName().endsWith("-stub")) { + continue; + } + int partNumber = Integer.parseInt(sm.getName().substring((MULTIPART_PREFIX + mpu.id() + "-" + mpu.blobName() + "-").length())); long partSize = -1; // TODO: could call getContentMetadata but did not above parts.add(MultipartPart.create(partNumber, partSize, sm.getETag())); } @@ -884,7 +894,29 @@ public final class LocalBlobStore implements BlobStore { @Override public List<MultipartUpload> listMultipartUploads(String container) { - throw new UnsupportedOperationException(); + ImmutableList.Builder<MultipartUpload> mpus = ImmutableList.builder(); + ListContainerOptions options = new ListContainerOptions().prefix(MULTIPART_PREFIX).recursive(); + int uuidLength = UUID.randomUUID().toString().length(); + while (true) { + PageSet<? extends StorageMetadata> pageSet = list(container, options); + for (StorageMetadata sm : pageSet) { + if (!sm.getName().endsWith("-stub")) { + continue; + } + String uploadId = sm.getName().substring(MULTIPART_PREFIX.length(), MULTIPART_PREFIX.length() + uuidLength); + String blobName = sm.getName().substring(MULTIPART_PREFIX.length() + uuidLength + 1); + int index = blobName.lastIndexOf('-'); + blobName = blobName.substring(0, index); + + mpus.add(MultipartUpload.create(container, blobName, uploadId, null, null)); + } + if (pageSet.isEmpty() || pageSet.getNextMarker() == null) { + break; + } + options.afterMarker(pageSet.getNextMarker()); + } + + return mpus.build(); } @Override http://git-wip-us.apache.org/repos/asf/jclouds/blob/6df0472a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java ---------------------------------------------------------------------- diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java index 739e7ba..e2b842e 100644 --- a/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/TransientBlobIntegrationTest.java @@ -31,13 +31,4 @@ public class TransientBlobIntegrationTest extends BaseBlobIntegrationTest { public void testSetBlobAccess() throws Exception { throw new SkipException("transient does not support anonymous access"); } - - @Test(groups = { "integration", "live" }) - public void testListMultipartUploads() throws Exception { - try { - super.testListMultipartUploads(); - } catch (UnsupportedOperationException uoe) { - throw new SkipException("transient does not support listing multipart uploads"); - } - } }
