You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2020/11/04 02:16:59 UTC

[james-project] 07/09: JAMES-3433 CachedBlobStore should only delete data when underlying backend did delete it too

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 f813e60d10d90b417656eafac4ef98783ac4dc72
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 3 11:02:25 2020 +0700

    JAMES-3433 CachedBlobStore should only delete data when underlying backend did delete it too
---
 .../src/main/java/org/apache/james/blob/api/BlobStore.java  |  2 +-
 .../java/org/apache/james/blob/api/MetricableBlobStore.java |  2 +-
 .../apache/james/blob/cassandra/cache/CachedBlobStore.java  | 13 ++++++++-----
 .../src/main/java/org/apache/james/blob/api/Store.java      |  3 ++-
 .../server/blob/deduplication/DeDuplicationBlobStore.scala  |  4 ++--
 .../server/blob/deduplication/PassThroughBlobStore.scala    |  5 +++--
 .../org/apache/james/webadmin/service/ExportService.java    |  3 ++-
 7 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java
index dc4abef..faf45ad 100644
--- a/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java
+++ b/server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java
@@ -55,5 +55,5 @@ public interface BlobStore {
 
     Publisher<Void> deleteBucket(BucketName bucketName);
 
-    Publisher<Void> delete(BucketName bucketName, BlobId blobId);
+    Publisher<Boolean> delete(BucketName bucketName, BlobId blobId);
 }
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 faea69d..bc13d6e 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
@@ -91,7 +91,7 @@ public class MetricableBlobStore implements BlobStore {
     }
 
     @Override
-    public Publisher<Void> delete(BucketName bucketName, BlobId blobId) {
+    public Publisher<Boolean> delete(BucketName bucketName, BlobId blobId) {
         return metricFactory.decoratePublisherWithTimerMetric(DELETE_TIMER_NAME, blobStoreImpl.delete(bucketName, blobId));
     }
 
diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java
index 87fdfa5..a5611d5 100644
--- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java
+++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java
@@ -216,12 +216,15 @@ public class CachedBlobStore implements BlobStore {
     }
 
     @Override
-    public Mono<Void> delete(BucketName bucketName, BlobId blobId) {
+    public Mono<Boolean> delete(BucketName bucketName, BlobId blobId) {
         return Mono.from(backend.delete(bucketName, blobId))
-            .then(Mono.just(bucketName)
-                .filter(backend.getDefaultBucketName()::equals)
-                .flatMap(ignored -> Mono.from(cache.remove(blobId)))
-                .then());
+            .flatMap(deleted -> {
+                if (backend.getDefaultBucketName().equals(bucketName)
+                      && deleted) {
+                    return Mono.from(cache.remove(blobId)).thenReturn(deleted);
+                }
+                return Mono.just(deleted);
+            });
     }
 
     @Override
diff --git a/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java b/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java
index 9c20cba..89295d9 100644
--- a/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java
+++ b/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java
@@ -108,7 +108,8 @@ public interface Store<T, I> {
         @Override
         public Publisher<Void> delete(I blobIds) {
             return Flux.fromIterable(blobIds.asMap().values())
-                .flatMap(id -> blobStore.delete(blobStore.getDefaultBucketName(), id));
+                .flatMap(id -> blobStore.delete(blobStore.getDefaultBucketName(), id))
+                .then();
         }
     }
 }
diff --git a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala
index 15c8c90..6cab727 100644
--- a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala
+++ b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala
@@ -91,10 +91,10 @@ class DeDuplicationBlobStore @Inject()(blobStoreDAO: BlobStoreDAO,
     blobStoreDAO.deleteBucket(bucketName)
   }
 
-  override def delete(bucketName: BucketName, blobId: BlobId): Publisher[Void] = {
+  override def delete(bucketName: BucketName, blobId: BlobId): Publisher[java.lang.Boolean] = {
     Preconditions.checkNotNull(bucketName)
     Preconditions.checkNotNull(blobId)
 
-    SMono.empty
+    SMono.just(Boolean.box(false))
   }
 }
diff --git a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala
index 406df50..e7e5020 100644
--- a/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala
+++ b/server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala
@@ -69,10 +69,11 @@ class PassThroughBlobStore @Inject()(blobStoreDAO: BlobStoreDAO,
     blobStoreDAO.deleteBucket(bucketName)
   }
 
-  override def delete(bucketName: BucketName, blobId: BlobId): Publisher[Void] = {
+  override def delete(bucketName: BucketName, blobId: BlobId): Publisher[java.lang.Boolean] = {
     Preconditions.checkNotNull(bucketName)
     Preconditions.checkNotNull(blobId)
 
-    blobStoreDAO.delete(bucketName, blobId)
+    SMono.fromPublisher(blobStoreDAO.delete(bucketName, blobId))
+      .`then`(SMono.just(Boolean.box(true)))
   }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java
index a982fd9..2e8e2ed 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java
@@ -139,7 +139,8 @@ public class ExportService {
             .onErrorResume(e -> {
                 LOGGER.error("Error deleting Blob with blobId: {}", blobId.asString(), e);
                 return Mono.empty();
-            });
+            })
+            .then();
     }
 
     private Mono<Void> writeUserMailboxesContent(Username username, PipedOutputStream out) {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org