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 c8e97f6306d63f07cb9afd396abc8520b5f7b61a Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Tue Apr 7 11:38:15 2020 +0700 JAMES-3136 Limit message projection inconsistency with a retry strategy --- .../mailbox/cassandra/mail/CassandraMessageIdMapper.java | 8 +++++++- .../cassandra/mail/CassandraMessageIdMapperTest.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java index 4d88c9a..3cfd722 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.james.mailbox.cassandra.mail; +import java.time.Duration; import java.util.Collection; import java.util.Comparator; import java.util.List; @@ -58,6 +59,10 @@ import reactor.core.scheduler.Schedulers; public class CassandraMessageIdMapper implements MessageIdMapper { private static final Logger LOGGER = LoggerFactory.getLogger(CassandraMessageIdMapper.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 MailboxMapper mailboxMapper; private final CassandraMailboxDAO mailboxDAO; private final CassandraMessageIdToImapUidDAO imapUidDAO; @@ -128,7 +133,8 @@ public class CassandraMessageIdMapper implements MessageIdMapper { ComposedMessageIdWithMetaData composedMessageIdWithMetaData = createMetadataFor(mailboxMessage); messageDAO.save(mailboxMessage) .thenEmpty(imapUidDAO.insert(composedMessageIdWithMetaData)) - .thenEmpty(messageIdDAO.insert(composedMessageIdWithMetaData)) + .thenEmpty(messageIdDAO.insert(composedMessageIdWithMetaData) + .retryBackoff(MAX_RETRY, MIN_RETRY_BACKOFF, MAX_RETRY_BACKOFF)) .thenEmpty(indexTableHandler.updateIndexOnAdd(mailboxMessage, mailboxId)) .block(); } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java index 582569a..891529a 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java @@ -204,5 +204,20 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest { .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)")); + + message1.setUid(mapperProvider.generateMessageUid()); + message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox)); + sut.save(message1); + + assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata)) + .hasSize(1); + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org