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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
