This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 62d934caf9fffe3463b2c5309e97ece8c51238c1 Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Fri Jul 17 16:41:01 2020 +0700 JAMES-3313 MemoryBlobStore should use DeduplicatingBlobStore --- .../james/vault/DeletedMessageVaultHookTest.java | 5 +- .../blob/BlobStoreDeletedMessageVaultTest.java | 5 +- pom.xml | 5 + .../file/LocalFileBlobExportMechanismTest.java | 5 +- server/blob/blob-memory/pom.xml | 4 + .../apache/james/blob/memory/MemoryBlobStore.java | 116 --------------------- .../james/blob/memory/MemoryBlobStoreFactory.java} | 25 ++--- .../james/blob/memory/MemoryBlobStoreTest.java | 2 +- .../james/blob/union/HybridBlobStoreTest.java | 75 +++++++------ .../james/blob/mail/MimeMessageStoreTest.java | 5 +- .../org/apache/james/modules/BlobMemoryModule.java | 17 ++- .../routes/DeletedMessagesVaultRoutesTest.java | 8 +- .../webadmin/service/ExportServiceTestSystem.java | 5 +- .../linshare/LinshareBlobExportMechanismTest.java | 8 +- 14 files changed, 90 insertions(+), 195 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 3b6fd29..766fdd9 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 @@ -30,8 +30,7 @@ import java.time.ZoneOffset; 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.blob.memory.MemoryBlobStoreFactory; import org.apache.james.core.MailAddress; import org.apache.james.core.MaybeSender; import org.apache.james.core.Username; @@ -110,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 MemoryDumbBlobStore()), new BucketNameGenerator(clock), clock, + MemoryBlobStoreFactory.create(new HashBlobId.Factory()), 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 c499529..a965a89 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 @@ -40,8 +40,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.blob.memory.MemoryBlobStoreFactory; import org.apache.james.metrics.tests.RecordingMetricFactory; import org.apache.james.utils.UpdatableTickingClock; import org.apache.james.vault.DeletedMessageVault; @@ -65,7 +64,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 MemoryDumbBlobStore()), + MemoryBlobStoreFactory.create(new HashBlobId.Factory()), new BucketNameGenerator(clock), clock, RetentionConfiguration.DEFAULT); } diff --git a/pom.xml b/pom.xml index 46add5d..8881160 100644 --- a/pom.xml +++ b/pom.xml @@ -1128,6 +1128,11 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>blob-deduplicating</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>blob-export-api</artifactId> <version>${project.version}</version> </dependency> 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 dc1262c..4eff0c4 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 @@ -41,8 +41,7 @@ import org.apache.james.blob.api.HashBlobId; 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.blob.memory.MemoryBlobStoreFactory; import org.apache.james.dnsservice.api.DNSService; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.util.MimeMessageUtil; @@ -68,7 +67,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(), new MemoryDumbBlobStore()); + blobStore = MemoryBlobStoreFactory.create(new HashBlobId.Factory()); InetAddress localHost = mock(InetAddress.class); when(localHost.getHostName()).thenReturn(JAMES_HOST); diff --git a/server/blob/blob-memory/pom.xml b/server/blob/blob-memory/pom.xml index 48c7bba..4224387 100644 --- a/server/blob/blob-memory/pom.xml +++ b/server/blob/blob-memory/pom.xml @@ -44,6 +44,10 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>blob-deduplicating</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>james-server-util</artifactId> <scope>test</scope> </dependency> 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 deleted file mode 100644 index 6c5b67c..0000000 --- a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.blob.memory; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -import javax.inject.Inject; - -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 com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; - -import reactor.core.publisher.Mono; - -public class MemoryBlobStore implements BlobStore { - private final BlobId.Factory factory; - private final BucketName defaultBucketName; - private final MemoryDumbBlobStore dumbBlobStore; - - @Inject - public MemoryBlobStore(BlobId.Factory factory, MemoryDumbBlobStore dumbBlobStore) { - this(factory, BucketName.DEFAULT, dumbBlobStore); - } - - @VisibleForTesting - public MemoryBlobStore(BlobId.Factory factory, BucketName defaultBucketName, MemoryDumbBlobStore dumbBlobStore) { - this.factory = factory; - this.defaultBucketName = defaultBucketName; - this.dumbBlobStore = dumbBlobStore; - } - - @Override - public Mono<BlobId> save(BucketName bucketName, byte[] data, StoragePolicy storagePolicy) { - Preconditions.checkNotNull(bucketName); - Preconditions.checkNotNull(data); - - BlobId blobId = factory.forPayload(data); - - return dumbBlobStore.save(bucketName, blobId, data) - .then(Mono.just(blobId)); - } - - @Override - public Mono<BlobId> save(BucketName bucketName, InputStream data, StoragePolicy storagePolicy) { - Preconditions.checkNotNull(bucketName); - Preconditions.checkNotNull(data); - try { - byte[] bytes = IOUtils.toByteArray(data); - return save(bucketName, bytes, storagePolicy); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public Mono<byte[]> readBytes(BucketName bucketName, BlobId blobId) { - Preconditions.checkNotNull(bucketName); - return retrieveStoredValue(bucketName, blobId); - } - - @Override - public InputStream read(BucketName bucketName, BlobId blobId) { - Preconditions.checkNotNull(bucketName); - return retrieveStoredValue(bucketName, blobId) - .map(ByteArrayInputStream::new) - .block(); - } - - @Override - public Mono<Void> deleteBucket(BucketName bucketName) { - Preconditions.checkNotNull(bucketName); - - return dumbBlobStore.deleteBucket(bucketName); - } - - private Mono<byte[]> retrieveStoredValue(BucketName bucketName, BlobId blobId) { - return dumbBlobStore.readBytes(bucketName, blobId); - } - - @Override - public BucketName getDefaultBucketName() { - return defaultBucketName; - } - - @Override - public Mono<Void> delete(BucketName bucketName, BlobId blobId) { - Preconditions.checkNotNull(bucketName); - Preconditions.checkNotNull(blobId); - - return dumbBlobStore.delete(bucketName, blobId); - } - -} diff --git a/server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreFactory.java similarity index 70% copy from server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java copy to server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreFactory.java index a9ab646..5e7c7e2 100644 --- a/server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java +++ b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreFactory.java @@ -17,24 +17,21 @@ * under the License. * ****************************************************************/ -package org.apache.james.modules; +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.HashBlobId; -import org.apache.james.blob.memory.MemoryBlobStore; +import org.apache.james.blob.api.BucketName; +import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore; -import com.google.inject.AbstractModule; -import com.google.inject.Scopes; - -public class BlobMemoryModule extends AbstractModule { - - @Override - protected void configure() { - bind(HashBlobId.Factory.class).in(Scopes.SINGLETON); - bind(BlobId.Factory.class).to(HashBlobId.Factory.class); +public class MemoryBlobStoreFactory { + public static BlobStore create(BlobId.Factory factory) { + return create(factory, BucketName.DEFAULT); + } - bind(MemoryBlobStore.class).in(Scopes.SINGLETON); - bind(BlobStore.class).to(MemoryBlobStore.class); + public static BlobStore create(BlobId.Factory factory, BucketName defaultBucketName) { + return new DeDuplicationBlobStore( + new MemoryDumbBlobStore(), + defaultBucketName, factory); } } 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 9d7f052..80dba7e 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 @@ -33,7 +33,7 @@ public class MemoryBlobStoreTest implements MetricableBlobStoreContract { @BeforeEach void setUp() { - blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore())); + blobStore = new MetricableBlobStore(metricsTestExtension.getMetricFactory(), MemoryBlobStoreFactory.create(BLOB_ID_FACTORY)); } @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 a17dc55..ee36d52 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 @@ -36,8 +36,7 @@ import org.apache.james.blob.api.BucketName; 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.apache.james.blob.memory.MemoryBlobStoreFactory; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -152,14 +151,14 @@ class HybridBlobStoreTest implements BlobStoreContract { private static final String STRING_CONTENT = "blob content"; private static final byte [] BLOB_CONTENT = STRING_CONTENT.getBytes(); - private MemoryBlobStore lowCostBlobStore; - private MemoryBlobStore highPerformanceBlobStore; + private BlobStore lowCostBlobStore; + private BlobStore highPerformanceBlobStore; private HybridBlobStore hybridBlobStore; @BeforeEach void setup() { - lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); - highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + lowCostBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); + highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); hybridBlobStore = HybridBlobStore.builder() .lowCost(lowCostBlobStore) .highPerformance(highPerformanceBlobStore) @@ -280,7 +279,7 @@ class HybridBlobStoreTest implements BlobStoreContract { class LowCostSaveThrowsExceptionDirectly { @Test void saveShouldFailWhenException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -293,7 +292,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void saveInputStreamShouldFailWhenException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -310,7 +309,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void saveShouldFailWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -323,7 +322,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void saveInputStreamShouldFallBackToPerformingWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) @@ -341,13 +340,13 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readShouldReturnFallbackToPerformingWhenLowCostGotException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) .configuration(HybridBlobStore.Configuration.DEFAULT) .build(); - BlobId blobId = highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.read(hybridBlobStore.getDefaultBucketName(), blobId)) .hasSameContentAs(new ByteArrayInputStream(BLOB_CONTENT)); @@ -355,14 +354,14 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readBytesShouldReturnFallbackToPerformingWhenLowCostGotException() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new ThrowingBlobStore()) .highPerformance(highPerformanceBlobStore) .configuration(HybridBlobStore.Configuration.DEFAULT) .build(); - BlobId blobId = highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.readBytes(hybridBlobStore.getDefaultBucketName(), blobId).block()) .isEqualTo(BLOB_CONTENT); @@ -375,13 +374,13 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readShouldReturnFallbackToPerformingWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) .configuration(HybridBlobStore.Configuration.DEFAULT) .build(); - BlobId blobId = highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.read(hybridBlobStore.getDefaultBucketName(), blobId)) .hasSameContentAs(new ByteArrayInputStream(BLOB_CONTENT)); @@ -389,13 +388,13 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readBytesShouldReturnFallbackToPerformingWhenLowCostCompletedExceptionally() { - MemoryBlobStore highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + BlobStore highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); HybridBlobStore hybridBlobStore = HybridBlobStore.builder() .lowCost(new FailingBlobStore()) .highPerformance(highPerformanceBlobStore) .configuration(HybridBlobStore.Configuration.DEFAULT) .build(); - BlobId blobId = highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.readBytes(hybridBlobStore.getDefaultBucketName(), blobId).block()) .isEqualTo(BLOB_CONTENT); @@ -404,7 +403,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readShouldReturnFromLowCostWhenAvailable() { - BlobId blobId = lowCostBlobStore.save(lowCostBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(lowCostBlobStore.save(lowCostBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.read(hybridBlobStore.getDefaultBucketName(), blobId)) .hasSameContentAs(new ByteArrayInputStream(BLOB_CONTENT)); @@ -412,7 +411,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readShouldReturnFromPerformingWhenLowCostNotAvailable() { - BlobId blobId = highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.read(hybridBlobStore.getDefaultBucketName(), blobId)) .hasSameContentAs(new ByteArrayInputStream(BLOB_CONTENT)); @@ -420,7 +419,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readBytesShouldReturnFromLowCostWhenAvailable() { - BlobId blobId = lowCostBlobStore.save(lowCostBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(lowCostBlobStore.save(lowCostBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.readBytes(lowCostBlobStore.getDefaultBucketName(), blobId).block()) .isEqualTo(BLOB_CONTENT); @@ -428,7 +427,7 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void readBytesShouldReturnFromPerformingWhenLowCostNotAvailable() { - BlobId blobId = highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(hybridBlobStore.getDefaultBucketName(), BLOB_CONTENT, LOW_COST)).block(); assertThat(hybridBlobStore.readBytes(hybridBlobStore.getDefaultBucketName(), blobId).block()) .isEqualTo(BLOB_CONTENT); @@ -436,34 +435,34 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void deleteBucketShouldDeleteBothLowCostAndPerformingBuckets() { - BlobId blobId1 = highPerformanceBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST).block(); - BlobId blobId2 = lowCostBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST).block(); + BlobId blobId1 = Mono.from(highPerformanceBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); + BlobId blobId2 = Mono.from(lowCostBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); hybridBlobStore.deleteBucket(BucketName.DEFAULT).block(); - assertThatThrownBy(() -> highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId1).block()) + assertThatThrownBy(() -> Mono.from(highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId1)).block()) .isInstanceOf(ObjectStoreException.class); - assertThatThrownBy(() -> lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId2).block()) + assertThatThrownBy(() -> Mono.from(lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId2)).block()) .isInstanceOf(ObjectStoreException.class); } @Test void deleteBucketShouldDeleteLowCostBucketEvenWhenPerformingDoesNotExist() { - BlobId blobId = lowCostBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(lowCostBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); hybridBlobStore.deleteBucket(BucketName.DEFAULT).block(); - assertThatThrownBy(() -> lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId).block()) + assertThatThrownBy(() -> Mono.from(lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId)).block()) .isInstanceOf(ObjectStoreException.class); } @Test void deleteBucketShouldDeletePerformingBucketEvenWhenLowCostDoesNotExist() { - BlobId blobId = highPerformanceBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); hybridBlobStore.deleteBucket(BucketName.DEFAULT).block(); - assertThatThrownBy(() -> highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId).block()) + assertThatThrownBy(() -> Mono.from(highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId)).block()) .isInstanceOf(ObjectStoreException.class); } @@ -475,8 +474,8 @@ class HybridBlobStoreTest implements BlobStoreContract { @Test void getDefaultBucketNameShouldThrowWhenBlobStoreDontShareTheSameDefaultBucketName() { - lowCostBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("lowCost"), new MemoryDumbBlobStore()); - highPerformanceBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("highPerformance"), new MemoryDumbBlobStore()); + lowCostBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY, BucketName.of("lowCost")); + highPerformanceBlobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY, BucketName.of("highPerformance")); hybridBlobStore = HybridBlobStore.builder() .lowCost(lowCostBlobStore) .highPerformance(highPerformanceBlobStore) @@ -494,29 +493,29 @@ class HybridBlobStoreTest implements BlobStoreContract { hybridBlobStore.delete(BucketName.DEFAULT, blobId1).block(); - assertThatThrownBy(() -> highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId1).block()) + assertThatThrownBy(() -> Mono.from(highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId1)).block()) .isInstanceOf(ObjectStoreException.class); - assertThatThrownBy(() -> lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId2).block()) + assertThatThrownBy(() -> Mono.from(lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId2)).block()) .isInstanceOf(ObjectStoreException.class); } @Test void deleteShouldDeleteLowCostBlobEvenWhenPerformingDoesNotExist() { - BlobId blobId = lowCostBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(lowCostBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); hybridBlobStore.delete(BucketName.DEFAULT, blobId).block(); - assertThatThrownBy(() -> lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId).block()) + assertThatThrownBy(() -> Mono.from(lowCostBlobStore.readBytes(BucketName.DEFAULT, blobId)).block()) .isInstanceOf(ObjectStoreException.class); } @Test void deleteShouldDeletePerformingBlobEvenWhenLowCostDoesNotExist() { - BlobId blobId = highPerformanceBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST).block(); + BlobId blobId = Mono.from(highPerformanceBlobStore.save(BucketName.DEFAULT, BLOB_CONTENT, LOW_COST)).block(); hybridBlobStore.delete(BucketName.DEFAULT, blobId).block(); - assertThatThrownBy(() -> highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId).block()) + assertThatThrownBy(() -> Mono.from(highPerformanceBlobStore.readBytes(BucketName.DEFAULT, blobId)).block()) .isInstanceOf(ObjectStoreException.class); } 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 a7c0649..e1dda9a 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 @@ -30,8 +30,7 @@ import org.apache.james.blob.api.BlobId; 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.blob.memory.MemoryBlobStoreFactory; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.util.MimeMessageUtil; import org.assertj.core.api.SoftAssertions; @@ -48,7 +47,7 @@ class MimeMessageStoreTest { @BeforeEach void setUp() { - blobStore = new MemoryBlobStore(BLOB_ID_FACTORY, new MemoryDumbBlobStore()); + blobStore = MemoryBlobStoreFactory.create(BLOB_ID_FACTORY); testee = MimeMessageStore.factory(blobStore).mimeMessageStore(); } diff --git a/server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java b/server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java index a9ab646..6e912bc 100644 --- a/server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java +++ b/server/container/guice/blob-memory-guice/src/main/java/org/apache/james/modules/BlobMemoryModule.java @@ -21,11 +21,15 @@ package org.apache.james.modules; 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.DumbBlobStore; 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.server.blob.deduplication.DeDuplicationBlobStore; import com.google.inject.AbstractModule; import com.google.inject.Scopes; +import com.google.inject.name.Names; public class BlobMemoryModule extends AbstractModule { @@ -34,7 +38,14 @@ public class BlobMemoryModule extends AbstractModule { bind(HashBlobId.Factory.class).in(Scopes.SINGLETON); bind(BlobId.Factory.class).to(HashBlobId.Factory.class); - bind(MemoryBlobStore.class).in(Scopes.SINGLETON); - bind(BlobStore.class).to(MemoryBlobStore.class); + bind(DeDuplicationBlobStore.class).in(Scopes.SINGLETON); + bind(BlobStore.class).to(DeDuplicationBlobStore.class); + + bind(MemoryDumbBlobStore.class).in(Scopes.SINGLETON); + bind(DumbBlobStore.class).to(MemoryDumbBlobStore.class); + + bind(BucketName.class) + .annotatedWith(Names.named(DeDuplicationBlobStore.DEFAULT_BUCKET())) + .toInstance(BucketName.DEFAULT); } } 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 a5ff748..43004e0 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 @@ -72,11 +72,11 @@ import java.util.Optional; import java.util.stream.Stream; 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.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.blob.memory.MemoryBlobStoreFactory; import org.apache.james.core.Domain; import org.apache.james.core.MailAddress; import org.apache.james.core.MaybeSender; @@ -166,7 +166,7 @@ class DeletedMessagesVaultRoutesTest { private InMemoryMailboxManager mailboxManager; private MemoryTaskManager taskManager; private NoopBlobExporting blobExporting; - private MemoryBlobStore blobStore; + private BlobStore blobStore; private DeletedMessageZipper zipper; private MemoryUsersRepository usersRepository; private ExportService exportService; @@ -176,7 +176,7 @@ class DeletedMessagesVaultRoutesTest { @BeforeEach void beforeEach() throws Exception { blobIdFactory = new HashBlobId.Factory(); - blobStore = spy(new MemoryBlobStore(blobIdFactory, new MemoryDumbBlobStore())); + blobStore = spy(MemoryBlobStoreFactory.create(blobIdFactory)); clock = new UpdatableTickingClock(OLD_DELETION_DATE.toInstant()); vault = spy(new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(), blobStore, new BucketNameGenerator(clock), clock, diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java index 77049c9..389ffad 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java @@ -29,8 +29,7 @@ import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.export.api.BlobExportMechanism; import org.apache.james.blob.export.file.LocalFileBlobExportMechanism; -import org.apache.james.blob.memory.MemoryBlobStore; -import org.apache.james.blob.memory.MemoryDumbBlobStore; +import org.apache.james.blob.memory.MemoryBlobStoreFactory; import org.apache.james.core.Domain; import org.apache.james.core.Username; import org.apache.james.dnsservice.api.DNSService; @@ -77,7 +76,7 @@ public class ExportServiceTestSystem { bobSession = mailboxManager.createSystemSession(BOB); - blobStore = Mockito.spy(new MemoryBlobStore(FACTORY, new MemoryDumbBlobStore())); + blobStore = Mockito.spy(MemoryBlobStoreFactory.create(FACTORY)); mailetContext = FakeMailContext.builder().postmaster(MailAddressFixture.POSTMASTER_AT_JAMES).build(); blobExport = new LocalFileBlobExportMechanism(mailetContext, blobStore, fileSystem, dnsService, LocalFileBlobExportMechanism.Configuration.DEFAULT_CONFIGURATION); 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 5f5d03f..738d4b0 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 @@ -29,11 +29,11 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.nio.charset.StandardCharsets; import org.apache.james.blob.api.BlobId; +import org.apache.james.blob.api.BlobStore; 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.blob.memory.MemoryBlobStoreFactory; import org.apache.james.core.MailAddress; import org.apache.james.linshare.client.Document; import org.junit.jupiter.api.BeforeEach; @@ -50,7 +50,7 @@ class LinshareBlobExportMechanismTest { @RegisterExtension static LinshareExtension linshareExtension = new LinshareExtension(); - private MemoryBlobStore blobStore; + private BlobStore blobStore; private LinshareBlobExportMechanism testee; private HashBlobId.Factory blobIdFactory; private LinshareAPIForUserTesting user2API; @@ -58,7 +58,7 @@ class LinshareBlobExportMechanismTest { @BeforeEach void setUp() throws Exception { blobIdFactory = new HashBlobId.Factory(); - blobStore = new MemoryBlobStore(blobIdFactory, new MemoryDumbBlobStore()); + blobStore = MemoryBlobStoreFactory.create(blobIdFactory); testee = new LinshareBlobExportMechanism( linshareExtension.getDelegationAccountAPI(), --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org