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