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