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