This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 0a6fd194467e253644d375c7c88d41e5ac4455a0 Author: Rene Cordier <[email protected]> AuthorDate: Mon Jul 15 17:38:07 2019 +0700 JAMES-2829 memory implementation of delete method for BlobStore --- .../blob/api/MetricableBlobStoreContract.java | 2 -- .../blob/cassandra/CassandraBlobsDAOTest.java | 6 ++++ .../apache/james/blob/memory/MemoryBlobStore.java | 10 ++++-- .../james/blob/memory/MemoryBlobStoreTest.java | 3 +- .../ObjectStorageBlobsDAOAWSCryptoTest.java | 7 ++++ .../ObjectStorageBlobsDAOAWSNamespaceTest.java | 6 ++++ ...ctStorageBlobsDAOAWSPrefixAndNamespaceTest.java | 6 ++++ .../ObjectStorageBlobsDAOAWSPrefixTest.java | 6 ++++ .../ObjectStorageBlobsDAOAWSTest.java | 7 ++++ .../objectstorage/ObjectStorageBlobsDAOTest.java | 7 ++++ .../apache/james/blob/union/UnionBlobStore.java | 16 ++++++--- .../james/blob/union/UnionBlobStoreTest.java | 39 ++++++++++++++++++++++ 12 files changed, 105 insertions(+), 10 deletions(-) diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java index 481aa98..e3c50c9 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java @@ -31,7 +31,6 @@ import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import org.apache.james.metrics.tests.RecordingMetricFactory; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -119,7 +118,6 @@ public interface MetricableBlobStoreContract extends BlobStoreContract { } @Test - @Disabled("JAMES-2829 Not supported yet") default void deleteShouldPublishDeleteTimerMetrics() { BlobId blobId1 = testee().save(testee().getDefaultBucketName(), BYTES_CONTENT).block(); BlobId blobId2 = testee().save(testee().getDefaultBucketName(), BYTES_CONTENT).block(); diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java index 2ba4ccd..cd3d2ad 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobsDAOTest.java @@ -93,4 +93,10 @@ public class CassandraBlobsDAOTest implements MetricableBlobStoreContract { assertThat(bytes).hasSameContentAs(new ZeroedInputStream(100_000_000)); } + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } + } \ No newline at end of file diff --git a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java index d28437c..f10e75e 100644 --- a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java +++ b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java @@ -27,7 +27,6 @@ import java.util.Optional; import javax.inject.Inject; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.NotImplementedException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; @@ -121,7 +120,14 @@ public class MemoryBlobStore implements BlobStore { @Override public Mono<Void> delete(BucketName bucketName, BlobId blobId) { - throw new NotImplementedException("not implemented"); + Preconditions.checkNotNull(bucketName); + Preconditions.checkNotNull(blobId); + + return Mono.fromRunnable(() -> { + synchronized (blobs) { + blobs.remove(bucketName, blobId); + } + }); } } diff --git a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java index 721c198..6f8686a 100644 --- a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java +++ b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java @@ -22,12 +22,13 @@ package org.apache.james.blob.memory; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketBlobStoreContract; +import org.apache.james.blob.api.DeleteBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; import org.junit.jupiter.api.BeforeEach; -public class MemoryBlobStoreTest implements MetricableBlobStoreContract, BucketBlobStoreContract { +public class MemoryBlobStoreTest implements MetricableBlobStoreContract, BucketBlobStoreContract, DeleteBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); private BlobStore blobStore; diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java index 0e56285..242e8ce 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSCryptoTest.java @@ -33,6 +33,7 @@ import org.apache.james.blob.objectstorage.crypto.CryptoConfig; import org.apache.james.blob.objectstorage.swift.Credentials; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) @@ -84,4 +85,10 @@ public class ObjectStorageBlobsDAOAWSCryptoTest implements MetricableBlobStoreCo public BlobId.Factory blobIdFactory() { return BLOB_ID_FACTORY; } + + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } } diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java index 8eab612..e17b34a 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSNamespaceTest.java @@ -32,6 +32,7 @@ import org.apache.james.blob.objectstorage.aws.DockerAwsS3Container; import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) @@ -78,5 +79,10 @@ public class ObjectStorageBlobsDAOAWSNamespaceTest implements MetricableBlobStor return new HashBlobId.Factory(); } + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } } diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java index dae3ff8..c377d32 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest.java @@ -32,6 +32,7 @@ import org.apache.james.blob.objectstorage.aws.DockerAwsS3Container; import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) @@ -79,5 +80,10 @@ public class ObjectStorageBlobsDAOAWSPrefixAndNamespaceTest implements Metricabl return new HashBlobId.Factory(); } + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } } diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java index e9cd435..8835d0f 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSPrefixTest.java @@ -31,6 +31,7 @@ import org.apache.james.blob.objectstorage.aws.DockerAwsS3Container; import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) @@ -77,5 +78,10 @@ public class ObjectStorageBlobsDAOAWSPrefixTest implements MetricableBlobStoreCo return new HashBlobId.Factory(); } + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } } diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java index 6fd6a6f..a61618a 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOAWSTest.java @@ -31,6 +31,7 @@ import org.apache.james.blob.objectstorage.aws.DockerAwsS3Container; import org.apache.james.blob.objectstorage.aws.DockerAwsS3Extension; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) @@ -76,4 +77,10 @@ public class ObjectStorageBlobsDAOAWSTest implements MetricableBlobStoreContract public BlobId.Factory blobIdFactory() { return BLOB_ID_FACTORY; } + + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } } diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java index 2a3b534..b887ad8 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java @@ -46,6 +46,7 @@ import org.jclouds.blobstore.domain.StorageType; import org.jclouds.domain.Location; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -205,5 +206,11 @@ public class ObjectStorageBlobsDAOTest implements MetricableBlobStoreContract, B Mono<byte[]> resultFuture = testee.readBytes(testee.getDefaultBucketName(), blobId).subscribeOn(Schedulers.elastic()); assertThat(resultFuture.toFuture()).isNotCompleted(); } + + @Override + @Disabled("JAMES-2829 Not supported yet") + public void deleteShouldPublishDeleteTimerMetrics() { + + } } diff --git a/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java b/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java index 7fd0aa6..b822b02 100644 --- a/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java +++ b/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java @@ -26,7 +26,6 @@ import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; -import org.apache.commons.lang3.NotImplementedException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; @@ -154,7 +153,14 @@ public class UnionBlobStore implements BlobStore { public Mono<Void> deleteBucket(BucketName bucketName) { return Mono.defer(() -> currentBlobStore.deleteBucket(bucketName)) .and(legacyBlobStore.deleteBucket(bucketName)) - .onErrorResume(this::logAndReturnEmpty); + .onErrorResume(this::logDeleteFailureAndReturnEmpty); + } + + @Override + public Mono<Void> delete(BucketName bucketName, BlobId blobId) { + return Mono.defer(() -> currentBlobStore.delete(bucketName, blobId)) + .and(legacyBlobStore.delete(bucketName, blobId)) + .onErrorResume(this::logDeleteFailureAndReturnEmpty); } private InputStream readFallBackIfEmptyResult(BucketName bucketName, BlobId blobId) { @@ -197,9 +203,9 @@ public class UnionBlobStore implements BlobStore { return Mono.empty(); } - @Override - public Mono<Void> delete(BucketName bucketName, BlobId blobId) { - throw new NotImplementedException("not implemented"); + private <T> Mono<T> logDeleteFailureAndReturnEmpty(Throwable throwable) { + LOGGER.error("Cannot delete from either legacy or current blob store", throwable); + return Mono.empty(); } @Override diff --git a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java index d7ea4e8..e981edf 100644 --- a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java +++ b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java @@ -561,4 +561,43 @@ class UnionBlobStoreTest implements BlobStoreContract { assertThatThrownBy(() -> unionBlobStore.getDefaultBucketName()) .isInstanceOf(IllegalStateException.class); } + + @Test + void deleteShouldDeleteBothCurrentAndLegacyBlob() { + BlobId legacyBlobId = legacyBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT).block(); + BlobId currentBlobId = currentBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT).block(); + + unionBlobStore.delete(BucketName.DEFAULT, currentBlobId).block(); + + assertThatThrownBy(() -> legacyBlobStore.readBytes(BucketName.DEFAULT, legacyBlobId).block()) + .isInstanceOf(ObjectStoreException.class); + assertThatThrownBy(() -> currentBlobStore.readBytes(BucketName.DEFAULT, currentBlobId).block()) + .isInstanceOf(ObjectStoreException.class); + } + + @Test + void deleteShouldDeleteCurrentBlobEvenWhenLegacyDoesNotExist() { + BlobId currentBlobId = currentBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT).block(); + + unionBlobStore.delete(BucketName.DEFAULT, currentBlobId).block(); + + assertThatThrownBy(() -> currentBlobStore.readBytes(BucketName.DEFAULT, currentBlobId).block()) + .isInstanceOf(ObjectStoreException.class); + } + + @Test + void deleteShouldDeleteLegacyBlobEvenWhenCurrentDoesNotExist() { + BlobId legacyBlobId = legacyBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT).block(); + + unionBlobStore.delete(BucketName.DEFAULT, legacyBlobId).block(); + + assertThatThrownBy(() -> legacyBlobStore.readBytes(BucketName.DEFAULT, legacyBlobId).block()) + .isInstanceOf(ObjectStoreException.class); + } + + @Test + void deleteShouldNotThrowWhenCurrentAndLegacyBlobsDoNotExist() { + assertThatCode(() -> unionBlobStore.delete(BucketName.DEFAULT, blobIdFactory().randomId()).block()) + .doesNotThrowAnyException(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
