You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/07/23 07:53:26 UTC
[james-project] 15/18: JAMES-3313 MemoryBlobStore should use
DeduplicatingBlobStore
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 <bt...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org