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/04/02 04:32:10 UTC

[james-project] 03/15: JAMES-2632 Lazy loading for backend parentId computation

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 5e670d124058ae917d31fc1960292e88abc53165
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Mar 30 11:46:01 2020 +0700

    JAMES-2632 Lazy loading for backend parentId computation
    
    The value was aggressively read for each mailbox read by GetMailboxes
    resulting in the following extra reads per mailbox:
     - mailboxPathV2
     - then mailbox
     - then acl
    
    This accounts according to glowroot to roughly 60% of GetMailboxes time
---
 .../james/jmap/draft/model/MailboxFactory.java     |  2 +-
 .../james/jmap/draft/model/MailboxFactoryTest.java | 30 ++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java
index 3d520bb..c0ea2b8 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java
@@ -223,7 +223,7 @@ public class MailboxFactory {
         }
         MailboxPath parent = levels.get(levels.size() - 2);
         return userMailboxesMetadata.map(list -> retrieveParentFromMetadata(parent, list))
-            .orElse(retrieveParentFromBackend(mailboxSession, parent));
+            .orElseGet(Throwing.supplier(() -> retrieveParentFromBackend(mailboxSession, parent)).sneakyThrow());
     }
 
     private Optional<MailboxId> retrieveParentFromBackend(MailboxSession mailboxSession, MailboxPath parent) throws MailboxException {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java
index 24d8cb4..14d9d42 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.manager.ManagerTestProvisionner;
 import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -198,6 +199,35 @@ public class MailboxFactoryTest {
     }
 
     @Test
+    public void buildShouldRelyOnPreloadedMailboxes() throws Exception {
+        MailboxPath inbox = MailboxPath.inbox(user);
+        Optional<MailboxId> inboxId = mailboxManager.createMailbox(inbox, mailboxSession);
+        Optional<MailboxId> otherId = mailboxManager.createMailbox(MailboxPath.forUser(user, "INBOX.child"), mailboxSession);
+
+        InMemoryId preLoadedId = InMemoryId.of(45);
+        Mailbox retrievedMailbox = sut.builder()
+            .id(otherId.get())
+            .session(mailboxSession)
+            .usingPreloadedMailboxesMetadata(Optional.of(ImmutableList.of(new MailboxMetaData(
+                inbox,
+                preLoadedId,
+                DELIMITER,
+                MailboxMetaData.Children.NO_INFERIORS,
+                MailboxMetaData.Selectability.NONE,
+                MailboxACL.EMPTY,
+                MailboxCounters.builder()
+                    .mailboxId(preLoadedId)
+                    .count(0)
+                    .unseen(0)
+                    .build()))))
+            .build()
+            .get();
+
+        assertThat(retrievedMailbox.getParentId())
+            .contains(preLoadedId);
+    }
+
+    @Test
     public void getNamespaceShouldReturnDelegatedNamespaceWhenUserMailboxPathAndUserMailboxSessionAreNotTheSame() throws Exception {
         MailboxPath inbox = MailboxPath.inbox(user);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession);


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