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 0269543e57183bf53e0f4cf75faa6c2494ee6f1d
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Tue Apr 7 10:35:50 2020 +0700

    JAMES-3136 Limit message projection inconsistency with a retry strategy
---
 .../mailbox/cassandra/mail/CassandraMessageMapper.java    |  8 +++++++-
 .../cassandra/mail/CassandraMessageMapperTest.java        | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 807b891..64eaf35 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import java.time.Duration;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.Iterator;
@@ -66,6 +67,10 @@ import reactor.core.scheduler.Schedulers;
 public class CassandraMessageMapper implements MessageMapper {
     public static final Logger LOGGER = 
LoggerFactory.getLogger(CassandraMessageMapper.class);
 
+    private static final int MAX_RETRY = 5;
+    private static final Duration MIN_RETRY_BACKOFF = Duration.ofMillis(10);
+    private static final Duration MAX_RETRY_BACKOFF = Duration.ofMillis(1000);
+
     private final CassandraModSeqProvider modSeqProvider;
     private final CassandraUidProvider uidProvider;
     private final CassandraMessageDAO messageDAO;
@@ -406,7 +411,8 @@ public class CassandraMessageMapper implements 
MessageMapper {
                 .modSeq(message.getModSeq())
                 .build();
         return imapUidDAO.insert(composedMessageIdWithMetaData)
-            .then(messageIdDAO.insert(composedMessageIdWithMetaData));
+            .then(messageIdDAO.insert(composedMessageIdWithMetaData)
+                .retryBackoff(MAX_RETRY, MIN_RETRY_BACKOFF, 
MAX_RETRY_BACKOFF));
     }
 
 
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index fb647c0..7898cb4 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Optional;
 
@@ -164,5 +165,19 @@ class CassandraMessageMapperTest extends MessageMapperTest 
{
                     .hasSize(1);
             }));
         }
+
+        @Test
+        void addShouldRetryMessageDenormalization(CassandraCluster cassandra) 
throws Exception {
+            cassandra.getConf()
+                .registerScenario(fail()
+                    .times(5)
+                    .whenQueryStartsWith("INSERT INTO messageIdTable 
(mailboxId,uid,modSeq,messageId,flagAnswered,flagDeleted,flagDraft,flagFlagged,flagRecent,flagSeen,flagUser,userFlags)"));
+
+            messageMapper.add(benwaInboxMailbox, message1);
+
+            assertThat(messageMapper.findInMailbox(benwaInboxMailbox, 
MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+                .toIterable()
+                .hasSize(1);
+        }
     }
 }


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

Reply via email to