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 a2dd14bc57eabeb8780556ca7cd24c74c198f751
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Wed Jun 24 08:51:37 2020 +0700

    JAMES-3265 CassandraMessageMapper should limit modseq allocation upon flags 
updates
---
 .../cassandra/mail/CassandraMessageMapper.java      |  6 +++---
 .../cassandra/mail/CassandraMessageMapperTest.java  | 21 +++++++++++++++++++++
 2 files changed, 24 insertions(+), 3 deletions(-)

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 82c9e6b..2934984 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
@@ -344,9 +344,9 @@ public class CassandraMessageMapper implements 
MessageMapper {
     }
 
     private Mono<FlagsUpdateStageResult> runUpdateStage(CassandraId mailboxId, 
Flux<ComposedMessageIdWithMetaData> toBeUpdated, FlagsUpdateCalculator 
flagsUpdateCalculator) {
-        Mono<ModSeq> newModSeq = computeNewModSeq(mailboxId);
-        return toBeUpdated
-            .concatMap(metadata -> newModSeq.flatMap(modSeq -> 
tryFlagsUpdate(flagsUpdateCalculator, modSeq, metadata)))
+        return computeNewModSeq(mailboxId)
+            .flatMapMany(newModSeq -> toBeUpdated
+            .concatMap(metadata -> tryFlagsUpdate(flagsUpdateCalculator, 
newModSeq, metadata)))
             .reduce(FlagsUpdateStageResult.none(), 
FlagsUpdateStageResult::merge)
             .flatMap(result -> updateIndexesForUpdatesResult(mailboxId, 
result));
     }
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 b97cf66..f115e60 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
@@ -25,13 +25,17 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Iterator;
 import java.util.Optional;
 
+import javax.mail.Flags;
+
 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.mailbox.MessageManager;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.store.FlagsUpdateCalculator;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
@@ -73,6 +77,23 @@ class CassandraMessageMapperTest extends MessageMapperTest {
             .hasSize(limit);
     }
 
+    @Test
+    void updateFlagsShouldLimitModSeqAllocation(CassandraCluster cassandra) 
throws MailboxException {
+        saveMessages();
+
+        StatementRecorder statementRecorder = new StatementRecorder();
+        cassandra.getConf().recordStatements(statementRecorder);
+
+        messageMapper.updateFlags(benwaInboxMailbox, new 
FlagsUpdateCalculator(new Flags(Flags.Flag.ANSWERED), 
MessageManager.FlagsUpdateMode.REPLACE), MessageRange.all());
+
+        assertThat(statementRecorder.listExecutedStatements())
+            .filteredOn(statement -> statement instanceof BoundStatement)
+            .extracting(BoundStatement.class::cast)
+            .extracting(statement -> 
statement.preparedStatement().getQueryString())
+            .filteredOn(statementString -> statementString.equals("UPDATE 
modseq SET nextModseq=:nextModseq WHERE mailboxId=:mailboxId IF 
nextModseq=:modSeqCondition;"))
+            .hasSize(1);
+    }
+
     private void consume(Iterator<MailboxMessage> inMailbox) {
         ImmutableList.copyOf(inMailbox);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to