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