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 2019/07/05 07:00:52 UTC
[james-project] 04/12: JAMES-2806 Temporary use BucketName.DEFAULT
for BlobStore impls
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 6c098b636aa4f4a486fb000f5c44efae6c9cb560
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Wed Jun 26 15:37:43 2019 +0700
JAMES-2806 Temporary use BucketName.DEFAULT for BlobStore impls
Except the ObjectStorage BlobStore because it is the subject of this task,
other implementation will be rework later
---
.../apache/james/blob/api/MetricableBlobStore.java | 5 +++++
.../james/blob/cassandra/CassandraBlobsDAO.java | 5 +++++
.../apache/james/blob/memory/MemoryBlobStore.java | 14 +++++++++++++
.../apache/james/blob/union/UnionBlobStore.java | 12 +++++++++++
.../james/blob/union/UnionBlobStoreTest.java | 23 ++++++++++++++++++++++
5 files changed, 59 insertions(+)
diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java
index 11fd997..73ccb4d 100644
--- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java
+++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java
@@ -77,4 +77,9 @@ public class MetricableBlobStore implements BlobStore {
return metricFactory
.runPublishingTimerMetric(DELETE_TIMER_NAME, () -> blobStoreImpl.deleteBucket(bucketName));
}
+
+ @Override
+ public BucketName getDefaultBucketName() {
+ return blobStoreImpl.getDefaultBucketName();
+ }
}
diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java
index 38edc21..923af0d 100644
--- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java
+++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobsDAO.java
@@ -202,6 +202,11 @@ public class CassandraBlobsDAO implements BlobStore {
return pipedInputStream;
}
+ @Override
+ public BucketName getDefaultBucketName() {
+ return BucketName.DEFAULT;
+ }
+
private Flux<byte[]> readBlobParts(BlobId blobId) {
Integer rowCount = selectRowCount(blobId)
.publishOn(Schedulers.elastic())
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 812ea3d..d6b3a25 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
@@ -32,6 +32,7 @@ import org.apache.james.blob.api.BlobStore;
import org.apache.james.blob.api.BucketName;
import org.apache.james.blob.api.ObjectStoreException;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
@@ -40,11 +41,18 @@ 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;
@Inject
public MemoryBlobStore(BlobId.Factory factory) {
+ this(factory, BucketName.DEFAULT);
+ }
+
+ @VisibleForTesting
+ public MemoryBlobStore(BlobId.Factory factory, BucketName defaultBucketName) {
this.factory = factory;
+ this.defaultBucketName = defaultBucketName;
blobs = HashBasedTable.create();
}
@@ -104,4 +112,10 @@ public class MemoryBlobStore implements BlobStore {
.orElseThrow(() -> new ObjectStoreException("Unable to find blob with id " + blobId + " in bucket " + bucketName.asString()));
}
}
+
+ @Override
+ public BucketName getDefaultBucketName() {
+ return defaultBucketName;
+ }
+
}
diff --git a/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java b/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
index 444c185..74481de 100644
--- a/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
+++ b/server/blob/blob-union/src/main/java/org/apache/james/blob/union/UnionBlobStore.java
@@ -35,6 +35,7 @@ import org.slf4j.LoggerFactory;
import com.github.fge.lambdas.Throwing;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
import reactor.core.publisher.Mono;
@@ -106,6 +107,17 @@ public class UnionBlobStore implements BlobStore {
}
@Override
+ public BucketName getDefaultBucketName() {
+ Preconditions.checkState(
+ currentBlobStore.getDefaultBucketName()
+ .equals(legacyBlobStore.getDefaultBucketName()),
+ "currentBlobStore and legacyBlobStore doen't have same defaultBucketName which could lead to " +
+ "unexpected result when interact with other APIs");
+
+ return currentBlobStore.getDefaultBucketName();
+ }
+
+ @Override
public Mono<BlobId> save(BucketName bucketName, InputStream data) {
try {
return saveToCurrentFallbackIfFails(
diff --git a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
index 1789129..abda30a 100644
--- a/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
+++ b/server/blob/blob-union/src/test/java/org/apache/james/blob/union/UnionBlobStoreTest.java
@@ -67,6 +67,11 @@ class UnionBlobStoreTest implements BlobStoreContract {
}
@Override
+ public BucketName getDefaultBucketName() {
+ throw new RuntimeException("broken everywhere");
+ }
+
+ @Override
public Mono<BlobId> save(BucketName bucketName, InputStream data) {
return Mono.error(new RuntimeException("broken everywhere"));
}
@@ -106,6 +111,11 @@ class UnionBlobStoreTest implements BlobStoreContract {
}
@Override
+ public BucketName getDefaultBucketName() {
+ throw new RuntimeException("broken everywhere");
+ }
+
+ @Override
public Mono<BlobId> save(BucketName bucketName, InputStream data) {
throw new RuntimeException("broken everywhere");
}
@@ -528,4 +538,17 @@ class UnionBlobStoreTest implements BlobStoreContract {
assertThatCode(() -> unionBlobStore.deleteBucket(BucketName.DEFAULT).block())
.doesNotThrowAnyException();
}
+
+ @Test
+ void getDefaultBucketNameShouldThrowWhenBlobStoreDontShareTheSameDefaultBucketName() {
+ currentBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("current"));
+ legacyBlobStore = new MemoryBlobStore(BLOB_ID_FACTORY, BucketName.of("legacy"));
+ unionBlobStore = UnionBlobStore.builder()
+ .current(currentBlobStore)
+ .legacy(legacyBlobStore)
+ .build();
+
+ assertThatThrownBy(() -> unionBlobStore.getDefaultBucketName())
+ .isInstanceOf(IllegalStateException.class);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org