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