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