You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/04/08 03:56:53 UTC

[james-project] 03/12: JAMES-3435 CassandraMessageIdToImapUidDAO should rely on LWT only if strong write consistency is requested.

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

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

commit eb44d318e3081dcfeb8d109d440429facd221ab5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Mar 28 14:38:31 2021 +0700

    JAMES-3435 CassandraMessageIdToImapUidDAO should rely on LWT only if strong write consistency is requested.
---
 .../mail/CassandraMessageIdToImapUidDAO.java       | 70 +++++++++++++---------
 .../cassandra/CassandraMailboxManagerTest.java     |  3 +-
 .../mail/CassandraMessageIdMapperTest.java         |  3 +-
 .../mail/CassandraMessageIdToImapUidDAOTest.java   |  4 +-
 .../cassandra/mail/CassandraMessageMapperTest.java |  4 +-
 .../SolveMessageInconsistenciesServiceTest.java    |  4 +-
 6 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
index e4bce1f..48f29d3 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
@@ -47,6 +47,7 @@ import javax.inject.Inject;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
+import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConsistenciesConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.MessageUid;
@@ -63,7 +64,9 @@ import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.querybuilder.Insert;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.datastax.driver.core.querybuilder.Update;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 
@@ -97,11 +100,12 @@ public class CassandraMessageIdToImapUidDAO {
     private final PreparedStatement selectAll;
     private final PreparedStatement select;
     private final PreparedStatement listStatement;
+    private final CassandraConfiguration cassandraConfiguration;
     private final CassandraConsistenciesConfiguration consistenciesConfiguration;
 
     @Inject
     public CassandraMessageIdToImapUidDAO(Session session, CassandraConsistenciesConfiguration consistenciesConfiguration,
-                                          CassandraMessageId.Factory messageIdFactory) {
+                                          CassandraMessageId.Factory messageIdFactory, CassandraConfiguration cassandraConfiguration) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
         this.consistenciesConfiguration = consistenciesConfiguration;
         this.cassandraConfiguration = cassandraConfiguration;
@@ -122,37 +126,47 @@ public class CassandraMessageIdToImapUidDAO {
     }
 
     private PreparedStatement prepareInsert(Session session) {
-        return session.prepare(insertInto(TABLE_NAME)
-                .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
-                .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
-                .value(IMAP_UID, bindMarker(IMAP_UID))
-                .value(MOD_SEQ, bindMarker(MOD_SEQ))
-                .value(ANSWERED, bindMarker(ANSWERED))
-                .value(DELETED, bindMarker(DELETED))
-                .value(DRAFT, bindMarker(DRAFT))
-                .value(FLAGGED, bindMarker(FLAGGED))
-                .value(RECENT, bindMarker(RECENT))
-                .value(SEEN, bindMarker(SEEN))
-                .value(USER, bindMarker(USER))
-                .value(USER_FLAGS, bindMarker(USER_FLAGS))
-                .ifNotExists());
+        Insert insert = insertInto(TABLE_NAME)
+            .value(MESSAGE_ID, bindMarker(MESSAGE_ID))
+            .value(MAILBOX_ID, bindMarker(MAILBOX_ID))
+            .value(IMAP_UID, bindMarker(IMAP_UID))
+            .value(MOD_SEQ, bindMarker(MOD_SEQ))
+            .value(ANSWERED, bindMarker(ANSWERED))
+            .value(DELETED, bindMarker(DELETED))
+            .value(DRAFT, bindMarker(DRAFT))
+            .value(FLAGGED, bindMarker(FLAGGED))
+            .value(RECENT, bindMarker(RECENT))
+            .value(SEEN, bindMarker(SEEN))
+            .value(USER, bindMarker(USER))
+            .value(USER_FLAGS, bindMarker(USER_FLAGS));
+        if (cassandraConfiguration.isMessageWriteStrongConsistency()) {
+            return session.prepare(insert.ifNotExists());
+        } else {
+            return session.prepare(insert);
+        }
     }
 
     private PreparedStatement prepareUpdate(Session session) {
-        return session.prepare(update(TABLE_NAME)
-                .with(set(MOD_SEQ, bindMarker(MOD_SEQ)))
-                .and(set(ANSWERED, bindMarker(ANSWERED)))
-                .and(set(DELETED, bindMarker(DELETED)))
-                .and(set(DRAFT, bindMarker(DRAFT)))
-                .and(set(FLAGGED, bindMarker(FLAGGED)))
-                .and(set(RECENT, bindMarker(RECENT)))
-                .and(set(SEEN, bindMarker(SEEN)))
-                .and(set(USER, bindMarker(USER)))
-                .and(set(USER_FLAGS, bindMarker(USER_FLAGS)))
-                .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID)))
-                .and(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
-                .and(eq(IMAP_UID, bindMarker(IMAP_UID)))
+        Update.Where update = update(TABLE_NAME)
+            .with(set(MOD_SEQ, bindMarker(MOD_SEQ)))
+            .and(set(ANSWERED, bindMarker(ANSWERED)))
+            .and(set(DELETED, bindMarker(DELETED)))
+            .and(set(DRAFT, bindMarker(DRAFT)))
+            .and(set(FLAGGED, bindMarker(FLAGGED)))
+            .and(set(RECENT, bindMarker(RECENT)))
+            .and(set(SEEN, bindMarker(SEEN)))
+            .and(set(USER, bindMarker(USER)))
+            .and(set(USER_FLAGS, bindMarker(USER_FLAGS)))
+            .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID)))
+            .and(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
+            .and(eq(IMAP_UID, bindMarker(IMAP_UID)));
+
+        if (cassandraConfiguration.isMessageWriteStrongConsistency()) {
+            return session.prepare(update
                 .onlyIf(eq(MOD_SEQ, bindMarker(MOD_SEQ_CONDITION))));
+        } else {
+            return session.prepare(update);
+        }
     }
 
     private PreparedStatement prepareSelectAll(Session session) {
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 7012984..0acbb0c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -836,7 +836,8 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
             return new CassandraMessageIdToImapUidDAO(
                 cassandraCluster.getConf(),
                 cassandra.getCassandraConsistenciesConfiguration(),
-                new CassandraMessageId.Factory());
+                new CassandraMessageId.Factory(),
+                CassandraConfiguration.DEFAULT_CONFIGURATION);
         }
 
         private CassandraMessageDAOV3 messageDAO(CassandraCluster cassandraCluster) {
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 48d2a66..fc5885f 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
@@ -241,7 +241,8 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest {
             CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(
                 cassandra.getConf(),
                 cassandraCluster.getCassandraConsistenciesConfiguration(),
-                new CassandraMessageId.Factory());
+                new CassandraMessageId.Factory(),
+                CassandraConfiguration.DEFAULT_CONFIGURATION);
 
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                 softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
index 9ce6eb9..6abb4b6 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
@@ -29,6 +29,7 @@ import javax.mail.Flags.Flag;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
@@ -63,7 +64,8 @@ class CassandraMessageIdToImapUidDAOTest {
         testee = new CassandraMessageIdToImapUidDAO(
             cassandra.getConf(),
             cassandraCluster.getCassandraConsistenciesConfiguration(),
-            messageIdFactory);
+            messageIdFactory,
+            CassandraConfiguration.DEFAULT_CONFIGURATION);
     }
 
     @Test
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 6965440..e113cb9 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
@@ -33,6 +33,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.StatementRecorder;
 import org.apache.james.backends.cassandra.StatementRecorder.Selector;
+import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -324,7 +325,8 @@ class CassandraMessageMapperTest extends MessageMapperTest {
             CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(
                 cassandra.getConf(),
                 cassandraCluster.getCassandraConsistenciesConfiguration(),
-                new CassandraMessageId.Factory());
+                new CassandraMessageId.Factory(),
+                CassandraConfiguration.DEFAULT_CONFIGURATION);
 
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                 softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java
index 881822f..8273988 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java
@@ -31,6 +31,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.Scenario;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.junit.categories.Unstable;
 import org.apache.james.mailbox.MessageUid;
@@ -104,7 +105,8 @@ public class SolveMessageInconsistenciesServiceTest {
         imapUidDAO = new CassandraMessageIdToImapUidDAO(
             cassandra.getConf(),
             cassandraCluster.getCassandraConsistenciesConfiguration(),
-            new CassandraMessageId.Factory());
+            new CassandraMessageId.Factory(),
+            CassandraConfiguration.DEFAULT_CONFIGURATION);
         messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
         testee = new SolveMessageInconsistenciesService(imapUidDAO, messageIdDAO);
     }

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