You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/06/30 01:07:17 UTC

[james-project] 06/06: JAMES-3171 Mailbox/get by ids was doing some nested .block() calls

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 223c9159487d6a0a8d12172d28de5496ddd042ef
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jun 29 09:32:25 2021 +0700

    JAMES-3171 Mailbox/get by ids was doing some nested .block() calls
---
 .../java/org/apache/james/mailbox/MessageManager.java     |  2 ++
 .../apache/james/mailbox/store/StoreMessageManager.java   | 13 +++++++++++++
 .../org/apache/james/jmap/draft/model/MailboxFactory.java |  7 +++----
 .../scala/org/apache/james/jmap/mail/MailboxFactory.scala | 15 +++++++++++----
 4 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index e214865..70cc309 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -85,6 +85,8 @@ public interface MessageManager {
      */
     MailboxCounters getMailboxCounters(MailboxSession mailboxSession) throws MailboxException;
 
+    Publisher<MailboxCounters> getMailboxCountersReactive(MailboxSession mailboxSession);
+
     /**
      * Return if the Mailbox is writable
      * @deprecated use
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 4487e8d..f22323d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -227,6 +227,19 @@ public class StoreMessageManager implements MessageManager {
             .build();
     }
 
+
+    @Override
+    public Publisher<MailboxCounters> getMailboxCountersReactive(MailboxSession mailboxSession) {
+        if (storeRightManager.hasRight(mailbox, MailboxACL.Right.Read, mailboxSession)) {
+            return mapperFactory.createMessageMapper(mailboxSession).getMailboxCountersReactive(mailbox);
+        }
+        return Mono.just(MailboxCounters.builder()
+            .mailboxId(mailbox.getMailboxId())
+            .count(0)
+            .unseen(0)
+            .build());
+    }
+
     /**
      * Returns the flags which are shared for the current mailbox, i.e. the
      * flags set up so that changes to those flags are visible to another user.
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 7f3f723..8b0ba9c 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
@@ -50,7 +50,6 @@ import com.google.common.base.Splitter;
 import com.google.common.primitives.Booleans;
 
 import reactor.core.publisher.Mono;
-import reactor.core.scheduler.Schedulers;
 
 public class MailboxFactory {
     private static class MailboxTuple {
@@ -59,9 +58,9 @@ public class MailboxFactory {
         }
 
         public static Mono<MailboxTuple> from(MessageManager messageManager, MailboxSession session) {
-            return Mono.fromCallable(() ->
-                new MailboxTuple(messageManager.getMailboxPath(), messageManager.getMailboxCounters(session).sanitize(), messageManager.getResolvedAcl(session)))
-                .subscribeOn(Schedulers.elastic());
+            return Mono.from(messageManager.getMailboxCountersReactive(session))
+                .map(MailboxCounters::sanitize)
+                .map(Throwing.function(counters -> new MailboxTuple(messageManager.getMailboxPath(), counters, messageManager.getResolvedAcl(session))));
         }
 
         private final MailboxPath mailboxPath;
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
index d4271cd..b235082 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala
@@ -160,11 +160,18 @@ class MailboxFactory @Inject() (mailboxManager: MailboxManager) {
     }
   }
 
-  def create(id: MailboxId, mailboxSession: MailboxSession, quotaLoader: QuotaLoader, subscriptions: Subscriptions): SMono[Mailbox] = {
-    try {
-      val messageManager: MessageManager = mailboxManager.getMailbox(id, mailboxSession)
-      val sanitizedCounters: MailboxCounters = messageManager.getMailboxCounters(mailboxSession).sanitize()
+  def create(id: MailboxId, mailboxSession: MailboxSession, quotaLoader: QuotaLoader, subscriptions: Subscriptions): SMono[Mailbox] =
+    for {
+      messageManager <- SMono(mailboxManager.getMailboxReactive(id, mailboxSession))
+      counters <- SMono(messageManager.getMailboxCountersReactive(mailboxSession))
+      sanitizedCounters = counters.sanitize()
+      mailbox <- instanciateMailbox(id, mailboxSession, quotaLoader, messageManager, sanitizedCounters, subscriptions)
+    } yield {
+      mailbox
+    }
 
+  private def instanciateMailbox(id: MailboxId, mailboxSession: MailboxSession, quotaLoader: QuotaLoader, messageManager: MessageManager, sanitizedCounters: MailboxCounters, subscriptions: Subscriptions): SMono[Mailbox] = {
+    try {
       MailboxValidation.validate(messageManager.getMailboxPath, mailboxSession.getPathDelimiter, sanitizedCounters.getUnseen, sanitizedCounters.getUnseen, sanitizedCounters.getCount, sanitizedCounters.getCount) match {
         case Left(error) => SMono.error(error)
         case scala.Right(mailboxValidation) =>

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