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 ed3b695b0abd28c82ea37fe7de59aaa2cd6be74a Author: Benoit Tellier <[email protected]> AuthorDate: Mon Mar 30 14:20:53 2020 +0700 [Performance] Avoid loading mailbox counters for getAllReadableMailboxes Glowroot flameGraph suggest we spend 60% of GetMessageList time loading mailbox counters while we do not need them --- .../james/mailbox/store/StoreMailboxManager.java | 28 ++++++++++++---------- .../vault/DeletedMessageVaultIntegrationTest.java | 4 ++-- .../org/apache/james/jmap/JmapCommonRequests.java | 4 ++-- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index 6cb08a8..c2da6e9 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -592,19 +592,11 @@ public class StoreMailboxManager implements MailboxManager { @Override public List<MailboxMetaData> search(MailboxQuery mailboxExpression, MailboxSession session) throws MailboxException { - return searchMailboxes(mailboxExpression, session, Right.Lookup); + return searchMailboxesMetadata(mailboxExpression, session, Right.Lookup); } - private List<MailboxMetaData> searchMailboxes(MailboxQuery mailboxQuery, MailboxSession session, Right right) throws MailboxException { - MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session); - Stream<Mailbox> baseMailboxes = mailboxMapper - .findMailboxWithPathLike(toSingleUserQuery(mailboxQuery, session)) - .stream(); - Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxQuery, right, session); - List<Mailbox> mailboxes = Stream.concat(baseMailboxes, delegatedMailboxes) - .distinct() - .filter(Throwing.predicate(mailbox -> storeRightManager.hasRight(mailbox, right, session))) - .collect(Guavate.toImmutableList()); + private List<MailboxMetaData> searchMailboxesMetadata(MailboxQuery mailboxQuery, MailboxSession session, Right right) throws MailboxException { + List<Mailbox> mailboxes = searchMailboxes(mailboxQuery, session, right); ImmutableMap<MailboxId, MailboxCounters> counters = getMailboxCounters(mailboxes, session) .stream() @@ -622,6 +614,18 @@ public class StoreMailboxManager implements MailboxManager { .collect(Guavate.toImmutableList()); } + private List<Mailbox> searchMailboxes(MailboxQuery mailboxQuery, MailboxSession session, Right right) throws MailboxException { + MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session); + Stream<Mailbox> baseMailboxes = mailboxMapper + .findMailboxWithPathLike(toSingleUserQuery(mailboxQuery, session)) + .stream(); + Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxQuery, right, session); + return Stream.concat(baseMailboxes, delegatedMailboxes) + .distinct() + .filter(Throwing.predicate(mailbox -> storeRightManager.hasRight(mailbox, right, session))) + .collect(Guavate.toImmutableList()); + } + static MailboxQuery.UserBound toSingleUserQuery(MailboxQuery mailboxQuery, MailboxSession mailboxSession) { return MailboxQuery.builder() .namespace(mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE)) @@ -693,7 +697,7 @@ public class StoreMailboxManager implements MailboxManager { private Stream<MailboxId> getAllReadableMailbox(MailboxSession session) throws MailboxException { return searchMailboxes(MailboxQuery.builder().matchesAllMailboxNames().build(), session, Right.Read) .stream() - .map(MailboxMetaData::getId); + .map(Mailbox::getMailboxId); } @Override diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java index f166582..ae04e91 100644 --- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java +++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java @@ -30,7 +30,7 @@ import static org.apache.james.jmap.JMAPTestingConstants.calmlyAwait; import static org.apache.james.jmap.JMAPTestingConstants.jmapRequestSpecBuilder; import static org.apache.james.jmap.JmapCommonRequests.deleteMessages; import static org.apache.james.jmap.JmapCommonRequests.getAllMailboxesIds; -import static org.apache.james.jmap.JmapCommonRequests.getLastMessageId; +import static org.apache.james.jmap.JmapCommonRequests.getLatestMessageId; import static org.apache.james.jmap.JmapCommonRequests.getOutboxId; import static org.apache.james.jmap.JmapCommonRequests.listMessageIdsForAccount; import static org.apache.james.jmap.LocalHostURIBuilder.baseUri; @@ -823,7 +823,7 @@ public abstract class DeletedMessageVaultIntegrationTest { exportVaultContent(webAdminApi, exportRequest); WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(shareeAccessToken).size() == currentNumberOfMessages + 1); - String exportingMessageId = getLastMessageId(shareeAccessToken); + String exportingMessageId = getLatestMessageId(shareeAccessToken, Role.INBOX); return exportedFileLocationFromMailHeader(exportingMessageId, shareeAccessToken); } diff --git a/server/testing/src/main/java/org/apache/james/jmap/JmapCommonRequests.java b/server/testing/src/main/java/org/apache/james/jmap/JmapCommonRequests.java index 72138fe..981e549 100644 --- a/server/testing/src/main/java/org/apache/james/jmap/JmapCommonRequests.java +++ b/server/testing/src/main/java/org/apache/james/jmap/JmapCommonRequests.java @@ -141,10 +141,10 @@ public class JmapCommonRequests { } public static String getLatestMessageId(AccessToken accessToken, Role mailbox) { - String inboxId = getMailboxId(accessToken, mailbox); + String mailboxId = getMailboxId(accessToken, mailbox); return with() .header("Authorization", accessToken.asString()) - .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + inboxId + "\"]}, \"sort\":[\"date desc\"]}, \"#0\"]]") + .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + mailboxId + "\"]}, \"sort\":[\"date desc\"]}, \"#0\"]]") .post("/jmap") .then() .extract() --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
