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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
