This is an automated email from the ASF dual-hosted git repository. matthieu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit e4382de0dddc2f5edba44485b22bdb0d5cf703a5 Author: Matthieu Baechler <matth...@apache.org> AuthorDate: Thu Jan 9 14:57:45 2020 +0100 JAMES-3028 implement MemoryBlobStore with MemoryDumbBlobStore --- .../james/vault/DeletedMessageVaultHookTest.java | 3 +- .../blob/BlobStoreDeletedMessageVaultTest.java | 3 +- .../file/LocalFileBlobExportMechanismTest.java | 3 +- .../apache/james/blob/memory/MemoryBlobStore.java | 47 +++++++--------------- .../james/blob/memory/MemoryBlobStoreTest.java | 3 +- .../james/blob/union/HybridBlobStoreTest.java | 25 ++++++------ .../james/blob/mail/MimeMessageStoreTest.java | 3 +- .../routes/DeletedMessagesVaultRoutesTest.java | 4 +- .../linshare/LinshareBlobExportMechanismTest.java | 3 +- 9 files changed, 42 insertions(+), 52 deletions(-) diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java index 852a3cb..8c5cfc8 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java @@ -31,6 +31,7 @@ import java.util.List; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.apache.james.core.MailAddress; import org.apache.james.core.MaybeSender; import org.apache.james.core.Username; @@ -108,7 +109,7 @@ class DeletedMessageVaultHookTest { void setUp() throws Exception { clock = Clock.fixed(DELETION_DATE.toInstant(), ZoneOffset.UTC); messageVault = new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(), - new MemoryBlobStore(new HashBlobId.Factory()), new BucketNameGenerator(clock), clock, + new MemoryBlobStore(new HashBlobId.Factory(), new MemoryDumbBlobStore()), new BucketNameGenerator(clock), clock, RetentionConfiguration.DEFAULT); DeletedMessageConverter deletedMessageConverter = new DeletedMessageConverter(); diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java index cf09ffb..6c03f4f 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java @@ -41,6 +41,7 @@ import java.time.ZonedDateTime; import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.apache.james.metrics.tests.RecordingMetricFactory; import org.apache.james.utils.UpdatableTickingClock; import org.apache.james.vault.DeletedMessageVault; @@ -64,7 +65,7 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D clock = new UpdatableTickingClock(NOW.toInstant()); metricFactory = new RecordingMetricFactory(); messageVault = new BlobStoreDeletedMessageVault(metricFactory, new MemoryDeletedMessageMetadataVault(), - new MemoryBlobStore(new HashBlobId.Factory()), + new MemoryBlobStore(new HashBlobId.Factory(), new MemoryDumbBlobStore()), new BucketNameGenerator(clock), clock, RetentionConfiguration.DEFAULT); } diff --git a/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java b/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java index 174b2c3..91a85a0 100644 --- a/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java +++ b/server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java @@ -43,6 +43,7 @@ import org.apache.james.blob.api.ObjectStoreException; import org.apache.james.blob.export.api.FileExtension; import org.apache.james.blob.export.file.LocalFileBlobExportMechanism.Configuration; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.apache.james.dnsservice.api.DNSService; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.util.MimeMessageUtil; @@ -67,7 +68,7 @@ class LocalFileBlobExportMechanismTest { @BeforeEach void setUp(FileSystem fileSystem) throws Exception { mailetContext = FakeMailContext.builder().postmaster(MailAddressFixture.POSTMASTER_AT_JAMES).build(); - blobStore = new MemoryBlobStore(new HashBlobId.Factory()); + blobStore = new MemoryBlobStore(new HashBlobId.Factory(), new MemoryDumbBlobStore()); InetAddress localHost = mock(InetAddress.class); when(localHost.getHostName()).thenReturn(JAMES_HOST); 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 bd2615c..6c5b67c 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 @@ -22,7 +22,6 @@ package org.apache.james.blob.memory; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Optional; import javax.inject.Inject; @@ -30,30 +29,27 @@ import org.apache.commons.io.IOUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; -import org.apache.james.blob.api.ObjectNotFoundException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Table; import reactor.core.publisher.Mono; public class MemoryBlobStore implements BlobStore { private final BlobId.Factory factory; private final BucketName defaultBucketName; - private final Table<BucketName, BlobId, byte[]> blobs; + private final MemoryDumbBlobStore dumbBlobStore; @Inject - public MemoryBlobStore(BlobId.Factory factory) { - this(factory, BucketName.DEFAULT); + public MemoryBlobStore(BlobId.Factory factory, MemoryDumbBlobStore dumbBlobStore) { + this(factory, BucketName.DEFAULT, dumbBlobStore); } @VisibleForTesting - public MemoryBlobStore(BlobId.Factory factory, BucketName defaultBucketName) { + public MemoryBlobStore(BlobId.Factory factory, BucketName defaultBucketName, MemoryDumbBlobStore dumbBlobStore) { this.factory = factory; this.defaultBucketName = defaultBucketName; - blobs = HashBasedTable.create(); + this.dumbBlobStore = dumbBlobStore; } @Override @@ -63,12 +59,8 @@ public class MemoryBlobStore implements BlobStore { BlobId blobId = factory.forPayload(data); - return Mono.fromCallable(() -> { - synchronized (blobs) { - blobs.put(bucketName, blobId, data); - return blobId; - } - }); + return dumbBlobStore.save(bucketName, blobId, data) + .then(Mono.just(blobId)); } @Override @@ -86,31 +78,26 @@ public class MemoryBlobStore implements BlobStore { @Override public Mono<byte[]> readBytes(BucketName bucketName, BlobId blobId) { Preconditions.checkNotNull(bucketName); - return Mono.fromCallable(() -> retrieveStoredValue(bucketName, blobId)); + return retrieveStoredValue(bucketName, blobId); } @Override public InputStream read(BucketName bucketName, BlobId blobId) { Preconditions.checkNotNull(bucketName); - return new ByteArrayInputStream(retrieveStoredValue(bucketName, blobId)); + return retrieveStoredValue(bucketName, blobId) + .map(ByteArrayInputStream::new) + .block(); } @Override public Mono<Void> deleteBucket(BucketName bucketName) { Preconditions.checkNotNull(bucketName); - return Mono.fromRunnable(() -> { - synchronized (blobs) { - blobs.row(bucketName).clear(); - } - }); + return dumbBlobStore.deleteBucket(bucketName); } - private byte[] retrieveStoredValue(BucketName bucketName, BlobId blobId) { - synchronized (blobs) { - return Optional.ofNullable(blobs.get(bucketName, blobId)) - .orElseThrow(() -> new ObjectNotFoundException("Unable to find blob with id " + blobId + " in bucket " + bucketName.asString())); - } + private Mono<byte[]> retrieveStoredValue(BucketName bucketName, BlobId blobId) { + return dumbBlobStore.readBytes(bucketName, blobId); } @Override @@ -123,11 +110,7 @@ public class MemoryBlobStore implements BlobStore { Preconditions.checkNotNull(bucketName); Preconditions.checkNotNull(blobId); - return Mono.fromRunnable(() -> { - synchronized (blobs) { - blobs.remove(bucketName, blobId); - } - }); + return dumbBlobStore.delete(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 6dbac34..f482139 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 @@ -21,6 +21,7 @@ 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.DumbBlobStore; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -33,7 +34,7 @@ public class MemoryBlobStoreTest implements MetricableBlobStoreContract { @BeforeEach void setUp() { - blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new MemoryBlobStore(BLOB_ID_FACTORY)); + blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore())); } @Override diff --git a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java index ad9d38f..a17dc55 100644 --- a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java +++ b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/HybridBlobStoreTest.java @@ -37,6 +37,7 @@ import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.ObjectNotFoundException; import org.apache.james.blob.api.ObjectStoreException; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -157,8 +158,8 @@ class HybridBlobStoreTest implements BlobStoreContract { @BeforeEach void setup() { - lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); - highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); hybridBlobStore = HybridBlobStore.builder() .lowCost(lowCostBlobStore) .highPerformance(highPerformanceBlobStore) @@ -279,7 +280,7 @@ class HybridBlobStoreTest implements BlobStoreContract { class LowCostSaveThrowsExceptionDirectly { @Test void saveShouldFailWhenException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -292,7 +293,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void saveInputStreamShouldFailWhenException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -309,7 +310,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void saveShouldFailWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -322,7 +323,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void saveInputStreamShouldFallBackToPerformingWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -340,7 +341,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readShouldReturnFallbackToPerformingWhenLowCostGotException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -354,7 +355,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readBytesShouldReturnFallbackToPerformingWhenLowCostGotException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) @@ -374,7 +375,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readShouldReturnFallbackToPerformingWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -388,7 +389,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readBytesShouldReturnFallbackToPerformingWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -474,8 +475,8 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void getDefaultBucketNameShouldThrowWhenBlobStoreDontShareTheSameDefaultBucketName() { - lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("lowCost")); - highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("highPerformance")); + lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("lowCost"), new MemoryDumbBlobStore()); + highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("highPerformance"), new MemoryDumbBlobStore()); hybridBlobStore = HybridBlobStore.builder() .lowCost(lowCostBlobStore) .highPerformance(highPerformanceBlobStore) diff --git a/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java b/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java index 9bd8327..ca3e64d 100644 --- a/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java +++ b/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java @@ -31,6 +31,7 @@ import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.Store; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.util.MimeMessageUtil; import org.assertj.core.api.SoftAssertions; @@ -45,7 +46,7 @@ class MimeMessageStoreTest { @BeforeEach void setUp() { - blobStore = new MemoryBlobStore(BLOB_ID_FACTORY); + blobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); testee = MimeMessageStore.factory(blobStore).mimeMessageStore(); } diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java index a7457c0..50a0cec 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java @@ -77,6 +77,7 @@ import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.export.api.BlobExportMechanism; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.apache.james.core.Domain; import org.apache.james.core.MailAddress; import org.apache.james.core.MaybeSender; @@ -128,7 +129,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import com.google.common.collect.ImmutableList; - import io.restassured.RestAssured; import io.restassured.filter.log.LogDetail; import reactor.core.publisher.Flux; @@ -174,7 +174,7 @@ class DeletedMessagesVaultRoutesTest { @BeforeEach void beforeEach() throws Exception { blobIdFactory = new HashBlobId.Factory(); - blobStore = spy(new MemoryBlobStore(blobIdFactory)); + blobStore = spy(new MemoryBlobStore(blobIdFactory, new MemoryDumbBlobStore())); clock = new UpdatableTickingClock(OLD_DELETION_DATE.toInstant()); vault = spy(new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(), blobStore, new BucketNameGenerator(clock), clock, diff --git a/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java index 729bbeb..2988281 100644 --- a/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java +++ b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareBlobExportMechanismTest.java @@ -37,6 +37,7 @@ import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.export.api.BlobExportMechanism; import org.apache.james.blob.export.api.FileExtension; import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.memory.MemoryDumbBlobStore; import org.apache.james.core.MailAddress; import org.apache.james.linshare.client.Document; import org.apache.james.linshare.client.LinshareAPI; @@ -64,7 +65,7 @@ class LinshareBlobExportMechanismTest { @BeforeEach void setUp() throws Exception { blobIdFactory = new HashBlobId.Factory(); - blobStore = new MemoryBlobStore(blobIdFactory); + blobStore = new MemoryBlobStore(blobIdFactory, new MemoryDumbBlobStore()); testee = new LinshareBlobExportMechanism( linshareExtension.getAPIFor(USER_1), --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org