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 rc...@apache.org on 2020/05/08 03:40:26 UTC

[james-project] 01/04: JAMES-3140 CassandraBlobStoreCache should not propagate failure upon inserts

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit da36e40406a4a86730b126a54aa9f9fc9a5313d5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Apr 29 15:13:21 2020 +0700

    JAMES-3140 CassandraBlobStoreCache should not propagate failure upon inserts
---
 .../blob/cassandra/cache/CassandraBlobStoreCache.java  | 10 +++++++++-
 .../cassandra/cache/CassandraBlobStoreCacheTest.java   | 18 ++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java
index fe6217e..32f5d62 100644
--- a/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java
+++ b/server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java
@@ -38,6 +38,8 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.blob.api.BlobId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Row;
@@ -48,6 +50,8 @@ import reactor.core.publisher.Mono;
 
 public class CassandraBlobStoreCache implements BlobStoreCache {
 
+    public static final Logger LOGGER = LoggerFactory.getLogger(CassandraBlobStoreCache.class);
+
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement insertStatement;
     private final PreparedStatement selectStatement;
@@ -99,7 +103,11 @@ public class CassandraBlobStoreCache implements BlobStoreCache {
                 .setString(ID, blobId.asString())
                 .setBytes(DATA, data)
                 .setInt(TTL_FOR_ROW, timeToLive)
-                .setConsistencyLevel(ONE));
+                .setConsistencyLevel(ONE))
+            .onErrorResume(e -> {
+                LOGGER.warn("Failed saving {} in blob store cache", blobId, e);
+                return Mono.empty();
+            });
     }
 
     private ByteBuffer toByteBuffer(byte[] bytes) {
diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCacheTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCacheTest.java
index efdc705..10c1feb 100644
--- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCacheTest.java
+++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCacheTest.java
@@ -18,15 +18,21 @@
  ****************************************************************/
 package org.apache.james.blob.cassandra.cache;
 
+import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
 import java.time.Duration;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.HashBlobId;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import reactor.core.publisher.Mono;
+
 public class CassandraBlobStoreCacheTest implements BlobStoreCacheContract {
 
     @RegisterExtension
@@ -59,4 +65,16 @@ public class CassandraBlobStoreCacheTest implements BlobStoreCacheContract {
     public BlobId.Factory blobIdFactory() {
         return blobIdFactory;
     }
+
+    @Test
+    void cacheShouldNotPropagateFailures(CassandraCluster cassandra) {
+        cassandra.getConf().registerScenario(fail()
+            .forever()
+            .whenQueryStartsWith("INSERT INTO blob_cache (id,data) VALUES (:id,:data) USING TTL :ttl;"));
+
+        BlobId blobId = blobIdFactory().randomId();
+
+        assertThatCode(() -> Mono.from(testee.cache(blobId, EIGHT_KILOBYTES)).block())
+            .doesNotThrowAnyException();
+    }
 }


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