You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/07/09 01:51:33 UTC

[james-project] 04/06: JAMES-3265 IMAP FETCH reading lastUid and lastModseq should be optional

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 b5f6d6d3807af60df9dc0e0cceb4ef4ad4e90d33
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jul 8 14:08:29 2020 +0700

    JAMES-3265 IMAP FETCH reading lastUid and lastModseq should be optional
    
    When FETCH is not used with `vanished` or CONDSTORE arguments then the response
    returned to the IMAP clients does not need to include mailbox lastUid & lastModSeq
    metadata.
    
    Upon load, reading these metadata accounts for 5% of the total amount of Cassandra
    query time triggered by the IMAP FETCH workload on top of the Distributed James server,
    leading to a nice but limited performance improvement.
---
 .../org/apache/james/imap/processor/fetch/FetchProcessor.java | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index 53cdff2..901b472 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -49,9 +49,12 @@ import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
+import org.apache.james.util.MemoizedSupplier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
+
 import reactor.core.publisher.Flux;
 
 public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
@@ -86,10 +89,12 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             }
             final MailboxSession mailboxSession = session.getMailboxSession();
 
-            MailboxMetaData metaData = mailbox.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT);
+            MemoizedSupplier<MailboxMetaData> metaData = MemoizedSupplier.of(Throwing.supplier(
+                    () -> mailbox.getMetaData(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT))
+                .sneakyThrow());
             if (fetch.getChangedSince() != -1 || fetch.contains(Item.MODSEQ)) {
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
-                condstoreEnablingCommand(session, responder,  metaData, true);
+                condstoreEnablingCommand(session, responder,  metaData.get(), true);
             }
             
             List<MessageRange> ranges = new ArrayList<>();
@@ -106,7 +111,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             if (vanished) {
                 // TODO: From the QRESYNC RFC it seems ok to send the VANISHED responses after the FETCH Responses. 
                 //       If we do so we could prolly save one mailbox access which should give use some more speed up
-                respondVanished(mailboxSession, mailbox, ranges, changedSince, metaData, responder);
+                respondVanished(mailboxSession, mailbox, ranges, changedSince, metaData.get(), responder);
             }
             processMessageRanges(session, mailbox, ranges, fetch, useUids, mailboxSession, responder);
 


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