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 2022/05/04 01:11:03 UTC

[james-project] 08/12: [PERF] MessageManager::getMetaData should allow not to read recent

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 bd65144de8a5e03c54d561f6bf019565724d9762
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Thu Apr 28 10:59:37 2022 +0700

    [PERF] MessageManager::getMetaData should allow not to read recent
    
    IMAP STATUS command is very common and most of the time do not need to
    fetch recent items. Always doing so result in unneeded Cassandra queries.
---
 .../org/apache/james/mailbox/MessageManager.java   | 24 ++++++---
 .../apache/james/mailbox/MailboxManagerTest.java   |  4 +-
 .../manager/QuotaMessageManagerContract.java       |  5 +-
 .../mailbox/cassandra/CassandraMessageManager.java |  2 +-
 .../mailbox/jpa/openjpa/OpenJPAMessageManager.java |  2 +-
 .../mailbox/inmemory/InMemoryMessageManager.java   |  2 +-
 .../james/mailbox/store/StoreMessageManager.java   | 43 +++++++++-------
 .../store/AbstractCombinationManagerTest.java      | 21 ++++----
 .../mailbox/store/AbstractMessageManagerTest.java  |  7 ++-
 .../mailbox/tools/copier/MailboxCopierTest.java    |  2 +-
 .../imap/processor/AbstractMailboxProcessor.java   | 57 ++++++++--------------
 .../imap/processor/AbstractSelectionProcessor.java | 16 ++++--
 .../james/imap/processor/ExpungeProcessor.java     |  3 +-
 .../james/imap/processor/GetACLProcessor.java      |  3 +-
 .../james/imap/processor/SearchProcessor.java      |  3 +-
 .../james/imap/processor/StatusProcessor.java      | 13 ++++-
 .../james/imap/processor/StoreProcessor.java       | 20 +++-----
 .../james/imap/processor/fetch/FetchProcessor.java |  3 +-
 .../imap/processor/DeleteACLProcessorTest.java     |  3 +-
 .../james/imap/processor/GetACLProcessorTest.java  |  3 +-
 .../imap/processor/ListRightsProcessorTest.java    |  3 +-
 .../james/imap/processor/SetACLProcessorTest.java  |  3 +-
 .../org/apache/james/modules/ACLProbeImpl.java     |  4 +-
 .../event/PropagateLookupRightListenerTest.java    | 30 ++++++------
 .../james/imapserver/netty/IMAPServerTest.java     | 41 ++++++++--------
 25 files changed, 170 insertions(+), 147 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 a7d1f1924c..d9c3d722ff 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
@@ -39,6 +39,7 @@ import javax.mail.internet.SharedInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MailboxManager.MessageCapabilities;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedCriteriaException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
@@ -98,7 +99,7 @@ public interface MessageManager {
     /**
      * Return if the Mailbox is writable
      * @deprecated use
-     *             {@link #getMetaData(boolean, MailboxSession, MailboxMetaData.FetchGroup)}
+     *             {@link #getMetaData(RecentMode, MailboxSession, MailboxMetaData.FetchGroup)}
      */
     @Deprecated
     boolean isWriteable(MailboxSession session) throws MailboxException;
@@ -438,18 +439,18 @@ public interface MessageManager {
      * The meta-data returned should be immutable and represent the current
      * state of the mailbox.
      * 
-     * @param resetRecent
-     *            true when recent flags should be reset, false otherwise
+     * @param recentMode
+     *            How to manage recent emails: ignore them, return their UIDs, reset then to non-recent.
      * @param mailboxSession
      *            context, not null
      * @param fetchGroup
      *            describes which optional data should be returned
      * @return metadata view filtered for the session's user, not null
      */
-    MailboxMetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException;
+    MailboxMetaData getMetaData(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException;
 
-    default Mono<MailboxMetaData> getMetaDataReactive(boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
-        return Mono.fromCallable(() -> getMetaData(resetRecent, mailboxSession, fetchGroup));
+    default Mono<MailboxMetaData> getMetaDataReactive(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
+        return Mono.fromCallable(() -> getMetaData(recentMode, mailboxSession, fetchGroup));
     }
 
     /**
@@ -457,6 +458,12 @@ public interface MessageManager {
      */
     class MailboxMetaData {
 
+        public enum RecentMode {
+            RESET,
+            RETRIEVE,
+            IGNORE
+        }
+
         /**
          * Describes the optional data types which will get set in the
          * {@link MailboxMetaData}.
@@ -656,6 +663,11 @@ public interface MessageManager {
 
     }
 
+    /**
+     * Return {@link Flags} which are permanent stored by the mailbox.
+     */
+    Flags getPermanentFlags(MailboxSession session);
+
     /**
      * Get resolved ACL on this Mailbox for the given Session
      *
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 799188df24..cd8c3a346f 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox;
 
 import static org.apache.james.mailbox.MailboxManager.RenameOption.RENAME_SUBSCRIPTIONS;
 import static org.apache.james.mailbox.MessageManager.FlagsUpdateMode.REPLACE;
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -1592,9 +1593,8 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                     .recent()
                     .build(message), session1);
 
-            boolean resetRecent = false;
             MessageManager.MailboxMetaData metaData = mailboxManager.getMailbox(inbox1, session2)
-                .getMetaData(resetRecent, session2, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT);
+                .getMetaData(IGNORE, session2, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT);
 
             assertSoftly(
                 softly -> {
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
index 94d6662f70..284b53ce8a 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.manager;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RESET;
 import static org.apache.james.mailbox.manager.ManagerTestProvisionner.INBOX;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -168,7 +169,7 @@ public interface QuotaMessageManagerContract<T extends MailboxManager> {
         }
 
         List<MessageUid> uids = provisionner.getMessageManager()
-            .getMetaData(true, provisionner.getSession(), MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT)
+            .getMetaData(RESET, provisionner.getSession(), MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT)
             .getRecent();
         provisionner.getMessageManager().delete(uids, provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
@@ -191,7 +192,7 @@ public interface QuotaMessageManagerContract<T extends MailboxManager> {
         }
 
         List<MessageUid> uids = provisionner.getMessageManager()
-            .getMetaData(true, provisionner.getSession(), MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT)
+            .getMetaData(RESET, provisionner.getSession(), MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT)
             .getRecent();
         provisionner.getMessageManager().delete(uids, provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
index 47498c1f84..cbbe0f4b36 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
@@ -59,7 +59,7 @@ public class CassandraMessageManager extends StoreMessageManager {
      * Support user flags
      */
     @Override
-    protected Flags getPermanentFlags(MailboxSession session) {
+    public Flags getPermanentFlags(MailboxSession session) {
         Flags flags = super.getPermanentFlags(session);
         flags.add(Flags.Flag.USER);
         return flags;
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
index bd7a0a6628..21dfb88926 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
@@ -58,7 +58,7 @@ public class OpenJPAMessageManager extends StoreMessageManager {
      * Support user flags
      */
     @Override
-    protected Flags getPermanentFlags(MailboxSession session) {
+    public Flags getPermanentFlags(MailboxSession session) {
         Flags flags =  super.getPermanentFlags(session);
         flags.add(Flags.Flag.USER);
         return flags;
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
index 3e4298cfc5..9f95cf7f71 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
@@ -42,7 +42,7 @@ public class InMemoryMessageManager extends StoreMessageManager {
     }
 
     @Override
-    protected Flags getPermanentFlags(MailboxSession session) {
+    public Flags getPermanentFlags(MailboxSession session) {
         Flags permanentFlags = new Flags(super.getPermanentFlags(session));
         permanentFlags.add(Flags.Flag.USER);
         return permanentFlags;
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 18f665552d..58f3064cf2 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
@@ -54,6 +54,7 @@ import org.apache.james.mailbox.MailboxManager.MessageCapabilities;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.MetadataWithMailboxId;
 import org.apache.james.mailbox.ModSeq;
@@ -211,7 +212,7 @@ public class StoreMessageManager implements MessageManager {
      * {@link Flags}. If only a special set of user flags / keywords should be
      * allowed just add them directly.
      */
-    protected Flags getPermanentFlags(MailboxSession session) {
+    public Flags getPermanentFlags(MailboxSession session) {
 
         // Return a new flags instance to make sure the static declared flags
         // instance will not get modified later.
@@ -561,7 +562,7 @@ public class StoreMessageManager implements MessageManager {
     }
 
     @Override
-    public Mono<MailboxMetaData> getMetaDataReactive(boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
+    public Mono<MailboxMetaData> getMetaDataReactive(RecentMode recentMode, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
         MailboxACL resolvedAcl = getResolvedAcl(mailboxSession);
         boolean hasReadRight = storeRightManager.hasRight(mailbox, MailboxACL.Right.Read, mailboxSession);
         if (!hasReadRight) {
@@ -576,15 +577,15 @@ public class StoreMessageManager implements MessageManager {
                     .map(MessageUid::next)
                     .orElse(MessageUid.MIN_VALUE)),
             messageMapper.getHighestModSeqReactive(mailbox))
-            .flatMap(t2 -> toMetadata(messageMapper, resetRecent, mailboxSession, fetchGroup, resolvedAcl, permanentFlags, uidValidity, t2.getT1(), t2.getT2())));
+            .flatMap(t2 -> toMetadata(messageMapper, recentMode, mailboxSession, fetchGroup, resolvedAcl, permanentFlags, uidValidity, t2.getT1(), t2.getT2())));
     }
 
     @Override
-    public MailboxMetaData getMetaData(boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
+    public MailboxMetaData getMetaData(RecentMode resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup) throws MailboxException {
         return MailboxReactorUtils.block(getMetaDataReactive(resetRecent, mailboxSession, fetchGroup));
     }
 
-    private Mono<MailboxMetaData> toMetadata(MessageMapper messageMapper, boolean resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) {
+    private Mono<MailboxMetaData> toMetadata(MessageMapper messageMapper, RecentMode resetRecent, MailboxSession mailboxSession, MailboxMetaData.FetchGroup fetchGroup, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) {
         try {
             switch (fetchGroup) {
                 case UNSEEN_COUNT:
@@ -601,7 +602,7 @@ public class StoreMessageManager implements MessageManager {
         }
     }
 
-    private Mono<MailboxMetaData> metadataDefault(boolean resetRecent, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
+    private Mono<MailboxMetaData> metadataDefault(RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
         MessageUid firstUnseen = null;
         long unseenCount = 0;
         long messageCount = -1;
@@ -609,36 +610,36 @@ public class StoreMessageManager implements MessageManager {
         final MailboxMetaData metaData = new MailboxMetaData(recent, permanentFlags, uidValidity, uidNext, highestModSeq, messageCount, unseenCount, firstUnseen, isWriteable(mailboxSession), resolvedAcl);
 
         // just reset the recent but not include them in the metadata
-        if (resetRecent) {
-            return recent(resetRecent, mailboxSession)
+        if (recentMode == RecentMode.RESET) {
+            return recent(recentMode, mailboxSession)
                 .thenReturn(metaData);
         }
         return Mono.just(metaData);
     }
 
-    private Mono<MailboxMetaData> metadataNoUnseen(MessageMapper messageMapper, boolean resetRecent, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
+    private Mono<MailboxMetaData> metadataNoUnseen(MessageMapper messageMapper, RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
         MessageUid firstUnseen = null;
         long unseenCount = 0;
         return Mono.zip(
             messageMapper.getMailboxCountersReactive(mailbox).map(MailboxCounters::getUnseen),
-            recent(resetRecent, mailboxSession))
+            recent(recentMode, mailboxSession))
             .map(Throwing.function(t2 -> new MailboxMetaData(t2.getT2(), permanentFlags, uidValidity, uidNext, highestModSeq, t2.getT1(), unseenCount, firstUnseen, isWriteable(mailboxSession), resolvedAcl)));
     }
 
-    private Mono<MailboxMetaData> metadataFirstUnseen(MessageMapper messageMapper, boolean resetRecent, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
+    private Mono<MailboxMetaData> metadataFirstUnseen(MessageMapper messageMapper, RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
         long unseenCount = 0;
         return Mono.zip(
             messageMapper.getMailboxCountersReactive(mailbox).map(MailboxCounters::getCount),
-            recent(resetRecent, mailboxSession),
+            recent(recentMode, mailboxSession),
             messageMapper.findFirstUnseenMessageUidReactive(getMailboxEntity()))
             .map(Throwing.function(t3 -> new MailboxMetaData(t3.getT2(), permanentFlags, uidValidity, uidNext, highestModSeq, t3.getT1(), unseenCount, t3.getT3().orElse(null), isWriteable(mailboxSession), resolvedAcl)));
     }
 
-    private Mono<MailboxMetaData> metadataUnseenCount(MessageMapper messageMapper, boolean resetRecent, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
+    private Mono<MailboxMetaData> metadataUnseenCount(MessageMapper messageMapper, RecentMode recentMode, MailboxSession mailboxSession, MailboxACL resolvedAcl, Flags permanentFlags, UidValidity uidValidity, MessageUid uidNext, ModSeq highestModSeq) throws MailboxException {
         MessageUid firstUnseen = null;
         return Mono.zip(
             messageMapper.getMailboxCountersReactive(mailbox),
-            recent(resetRecent, mailboxSession))
+            recent(recentMode, mailboxSession))
             .map(Throwing.function(t2 -> new MailboxMetaData(t2.getT2(), permanentFlags, uidValidity, uidNext, highestModSeq, t2.getT1().getCount(), t2.getT1().getUnseen(), firstUnseen, isWriteable(mailboxSession), resolvedAcl)));
     }
 
@@ -795,13 +796,19 @@ public class StoreMessageManager implements MessageManager {
      * Return a List which holds all uids of recent messages and optional reset
      * the recent flag on the messages for the uids
      */
-    private Mono<List<MessageUid>> recent(final boolean reset, MailboxSession mailboxSession) throws MailboxException {
+    private Mono<List<MessageUid>> recent(RecentMode recentMode, MailboxSession mailboxSession) throws MailboxException {
         MessageMapper messageMapper = mapperFactory.getMessageMapper(mailboxSession);
 
-        if (reset) {
-            return resetRecents(messageMapper, mailboxSession);
+        switch (recentMode) {
+            case IGNORE:
+                return Mono.just(ImmutableList.of());
+            case RETRIEVE:
+                return messageMapper.findRecentMessageUidsInMailboxReactive(getMailboxEntity());
+            case RESET:
+                return resetRecents(messageMapper, mailboxSession);
+            default:
+                throw new RuntimeException("Unsupported recent mode " + recentMode);
         }
-        return messageMapper.findRecentMessageUidsInMailboxReactive(getMailboxEntity());
     }
 
     private Mono<List<MessageUid>> resetRecents(MessageMapper messageMapper, MailboxSession mailboxSession) throws MailboxException {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index 56c1ba329d..11ce09a09f 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RESET;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.nio.charset.StandardCharsets;
@@ -276,10 +277,10 @@ public abstract class AbstractCombinationManagerTest {
                 .withFlags(recent)
                 .build(mailContent), session).getId();
 
-        long mailbox2NextUid = messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUidNext().asLong();
+        long mailbox2NextUid = messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUidNext().asLong();
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageUid> messageUids = messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getRecent();
+        List<MessageUid> messageUids = messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getRecent();
 
         assertThat(messageUids).hasSize(1);
         assertThat(messageUids.get(0).asLong()).isGreaterThanOrEqualTo(mailbox2NextUid);
@@ -296,7 +297,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).countRecent()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).countRecent()).isEqualTo(1);
     }
 
     @Test
@@ -318,7 +319,7 @@ public abstract class AbstractCombinationManagerTest {
             .getUid()
             .asLong();
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getUidNext().asLong())
+        assertThat(messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getUidNext().asLong())
             .isGreaterThan(uid2);
     }
 
@@ -329,7 +330,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
+        assertThat(messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
     }
 
     @Test
@@ -339,7 +340,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getMessageCount()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getMessageCount()).isEqualTo(1);
     }
 
     @Test
@@ -349,7 +350,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
     }
 
     @Test
@@ -358,7 +359,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
+        assertThat(messageManager2.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
     }
 
     @Test
@@ -369,7 +370,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(newFlag, FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
+        assertThat(messageManager1.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
     }
 
     @Test
@@ -379,7 +380,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(newFlag, FlagsUpdateMode.ADD, messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMetaData(true, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
+        assertThat(messageManager1.getMetaData(RESET, session, MessageManager.MailboxMetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
     }
 
     @Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java
index c952ac7186..ad27fccb6a 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RETRIEVE;
 import static org.apache.james.mailbox.fixture.MailboxFixture.ALICE;
 import static org.apache.james.mailbox.fixture.MailboxFixture.BOB;
 import static org.apache.james.mailbox.fixture.MailboxFixture.CEDRIC;
@@ -35,8 +36,6 @@ import org.junit.jupiter.api.Test;
 
 public abstract class AbstractMessageManagerTest {
 
-    static final boolean NO_RESET_RECENT = false;
-
     MailboxManager mailboxManager;
     MailboxSession aliceSession;
     MailboxSession bobSession;
@@ -58,7 +57,7 @@ public abstract class AbstractMessageManagerTest {
         mailboxManager.applyRightsCommand(INBOX_ALICE, MailboxACL.command().forUser(CEDRIC).rights(MailboxACL.Right.Read).asAddition(), aliceSession);
         MessageManager messageManager = mailboxManager.getMailbox(INBOX_ALICE, aliceSession);
 
-        MessageManager.MailboxMetaData actual = messageManager.getMetaData(NO_RESET_RECENT, aliceSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT);
+        MessageManager.MailboxMetaData actual = messageManager.getMetaData(RETRIEVE, aliceSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT);
         assertThat(actual.getACL().getEntries()).containsKeys(MailboxACL.EntryKey.createUserEntryKey(BOB), MailboxACL.EntryKey.createUserEntryKey(CEDRIC));
     }
 
@@ -68,7 +67,7 @@ public abstract class AbstractMessageManagerTest {
         mailboxManager.applyRightsCommand(INBOX_ALICE, MailboxACL.command().forUser(CEDRIC).rights(MailboxACL.Right.Read).asAddition(), aliceSession);
         MessageManager messageManager = mailboxManager.getMailbox(INBOX_ALICE, aliceSession);
 
-        MessageManager.MailboxMetaData actual = messageManager.getMetaData(NO_RESET_RECENT, bobSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT);
+        MessageManager.MailboxMetaData actual = messageManager.getMetaData(RETRIEVE, bobSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT);
         assertThat(actual.getACL().getEntries()).containsOnlyKeys(MailboxACL.EntryKey.createUserEntryKey(BOB));
     }
 
diff --git a/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java b/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
index 57b0937107..09bfc498e0 100644
--- a/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
+++ b/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
@@ -119,7 +119,7 @@ class MailboxCopierTest {
             MailboxSession userSession = mailboxManager.createSystemSession(mailboxPath.getUser());
             mailboxManager.startProcessingRequest(mailboxSession);
             MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, userSession);
-            assertThat(messageManager.getMetaData(false, userSession, FetchGroup.NO_UNSEEN).getMessageCount()).isEqualTo(DataProvisioner.MESSAGE_PER_MAILBOX_COUNT * multiplicationFactor);
+            assertThat(messageManager.getMetaData(MessageManager.MailboxMetaData.RecentMode.IGNORE, userSession, FetchGroup.NO_UNSEEN).getMessageCount()).isEqualTo(DataProvisioner.MESSAGE_PER_MAILBOX_COUNT * multiplicationFactor);
         }
 
         mailboxManager.endProcessingRequest(mailboxSession);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index e19159c57a..31db867e2a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -116,8 +116,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         responder.respond(new FlagsResponse(selected.getApplicableFlags()));
     }
 
-    protected void permanentFlags(Responder responder, MailboxMetaData metaData, SelectedMailbox selected) {
-        final Flags permanentFlags = metaData.getPermanentFlags();
+    protected void permanentFlags(Responder responder, Flags permanentFlags, SelectedMailbox selected) {
         if (permanentFlags.contains(Flags.Flag.USER)) {
             permanentFlags.add(selected.getApplicableFlags());
         }
@@ -145,7 +144,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
 
     private Mono<Void> unsolicitedResponses(ImapSession session, ImapProcessor.Responder responder, SelectedMailbox selected, boolean omitExpunged, boolean useUid) {
         return Mono.fromRunnable(() -> {
-            final boolean sizeChanged = selected.isSizeChanged();
+            boolean sizeChanged = selected.isSizeChanged();
             // New message response
             if (sizeChanged) {
                 addExistsResponses(selected, responder);
@@ -198,49 +197,35 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         MessageManager messageManager = selected.getMessageManager();
         MailboxSession mailboxSession = session.getMailboxSession();
 
-        final Collection<MessageUid> flagUpdateUids = selected.flagUpdateUids();
+        Collection<MessageUid> flagUpdateUids = selected.flagUpdateUids();
         if (!flagUpdateUids.isEmpty()) {
-            return addApplicableFlagResponse(session, selected, responder, useUid)
-                .then(Flux.fromIterable(MessageRange.toRanges(flagUpdateUids))
-                    .concatMap(range ->
-                        addFlagsResponses(session, selected, responder, useUid, range, messageManager, mailboxSession))
-                    .then())
+            addApplicableFlagResponse(session, selected, responder, useUid);
+            return Flux.fromIterable(MessageRange.toRanges(flagUpdateUids))
+                .concatMap(range ->
+                    addFlagsResponses(session, selected, responder, useUid, range, messageManager, mailboxSession))
+                .then()
                 .onErrorResume(MailboxException.class, e -> {
                     handleResponseException(responder, e, HumanReadableText.FAILURE_TO_LOAD_FLAGS, session);
                     return Mono.empty();
                 });
         } else {
-            return addApplicableFlagResponse(session, selected, responder, useUid)
-                .onErrorResume(MailboxException.class, e -> {
-                    handleResponseException(responder, e, HumanReadableText.FAILURE_TO_LOAD_FLAGS, session);
-                    return Mono.empty();
-                });
+            addApplicableFlagResponse(session, selected, responder, useUid);
+            return Mono.empty();
         }
     }
 
-    private Mono<Void> addApplicableFlagResponse(ImapSession session, SelectedMailbox selected, ImapProcessor.Responder responder, boolean useUid) {
-        try {
-            // To be lazily initialized only if needed, which is in minority of cases.
-            MessageManager messageManager = selected.getMessageManager();
-            MailboxSession mailboxSession = session.getMailboxSession();
+    private void addApplicableFlagResponse(ImapSession session, SelectedMailbox selected, ImapProcessor.Responder responder, boolean useUid) {
+        // To be lazily initialized only if needed, which is in minority of cases.
+        MessageManager messageManager = selected.getMessageManager();
+        MailboxSession mailboxSession = session.getMailboxSession();
 
-            // Check if we need to send a FLAGS and PERMANENTFLAGS response before the FETCH response
-            // This is the case if some new flag/keyword was used
-            // See IMAP-303
-            if (selected.hasNewApplicableFlags()) {
-                flags(responder, selected);
-                return messageManager.getMetaDataReactive(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
-                    .doOnNext(metaData -> permanentFlags(responder, metaData, selected))
-                    .doOnNext(any -> selected.resetNewApplicableFlags())
-                .onErrorResume(MailboxException.class, e -> {
-                    handleResponseException(responder, e, HumanReadableText.FAILURE_TO_LOAD_FLAGS, session);
-                    return Mono.empty();
-                }).then();
-            }
-            return Mono.empty();
-        } catch (MailboxException e) {
-            handleResponseException(responder, e, HumanReadableText.FAILURE_TO_LOAD_FLAGS, session);
-            return Mono.empty();
+        // Check if we need to send a FLAGS and PERMANENTFLAGS response before the FETCH response
+        // This is the case if some new flag/keyword was used
+        // See IMAP-303
+        if (selected.hasNewApplicableFlags()) {
+            flags(responder, selected);
+            permanentFlags(responder, messageManager.getPermanentFlags(mailboxSession), selected);
+            selected.resetNewApplicableFlags();
         }
     }
     
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
index 9c4bf2430b..e87a97c7c2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
@@ -19,6 +19,9 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RESET;
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RETRIEVE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.ArrayList;
@@ -153,7 +156,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
 
                 }
 
-                permanentFlags(responder, metaData, selected);
+                permanentFlags(responder, metaData.getPermanentFlags(), selected);
                 highestModSeq(responder, metaData);
                 uidNext(responder, metaData);
 
@@ -377,10 +380,17 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
         return Mono.from(mailboxManager.getMailboxReactive(mailboxPath, mailboxSession))
             .flatMap(Throwing.function(mailbox -> selectMailbox(session, responder, mailbox, currentMailbox)
                 .flatMap(Throwing.function(sessionMailbox ->
-                    mailbox.getMetaDataReactive(!openReadOnly, mailboxSession, FetchGroup.FIRST_UNSEEN)
+                    mailbox.getMetaDataReactive(recentMode(!openReadOnly), mailboxSession, FetchGroup.FIRST_UNSEEN)
                         .doOnNext(next -> addRecent(next, sessionMailbox))))));
     }
 
+    private MailboxMetaData.RecentMode recentMode(boolean reset) {
+        if (reset) {
+            return RESET;
+        }
+        return RETRIEVE;
+    }
+
     private Mono<SelectedMailbox> selectMailbox(ImapSession session, Responder responder, MessageManager mailbox, SelectedMailbox currentMailbox) throws MailboxException {
         if (currentMailbox == null || !currentMailbox.getMailboxId().equals(mailbox.getId())) {
             // QRESYNC EXTENSION
@@ -431,7 +441,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
                     boolean send = true;
                     return getSelectedMailboxReactive(session,
                             Mono.error(() -> new EnableException("Unable to enable " + capability.asString(), new MailboxException("Session not in SELECTED state"))))
-                        .flatMap(Throwing.function(mailbox -> mailbox.getMetaDataReactive(false, session.getMailboxSession(), FetchGroup.NO_COUNT)))
+                        .flatMap(Throwing.function(mailbox -> mailbox.getMetaDataReactive(IGNORE, session.getMailboxSession(), FetchGroup.NO_COUNT)))
                         .doOnNext(metaData -> condstoreEnablingCommand(session, responder, metaData, send))
                         .then();
                 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
index d376a34e1f..2fe3736687 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.processor;
 
 import static org.apache.james.imap.api.ImapConstants.SUPPORTS_UIDPLUS;
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.List;
@@ -107,7 +108,7 @@ public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> i
         //
         // See RFC5162 3.3 EXPUNGE Command 3.5. UID EXPUNGE Command
         if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)  && expunged > 0) {
-            return mailbox.getMetaDataReactive(false, mailboxSession, FetchGroup.NO_COUNT)
+            return mailbox.getMetaDataReactive(IGNORE, mailboxSession, FetchGroup.NO_COUNT)
                 .doOnNext(metaData -> okComplete(request, ResponseCode.highestModSeq(metaData.getHighestModSeq()), responder))
                 .then();
         } else {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
index 260be5eeec..b8c592251e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.List;
@@ -96,7 +97,7 @@ public class GetACLProcessor extends AbstractMailboxProcessor<GetACLRequest> imp
                     no(request, responder, text);
                     return Mono.empty();
                 } else {
-                    return mailbox.getMetaDataReactive(false, mailboxSession, FetchGroup.NO_COUNT)
+                    return mailbox.getMetaDataReactive(IGNORE, mailboxSession, FetchGroup.NO_COUNT)
                         .doOnNext(metaData -> {
                             ACLResponse aclResponse = new ACLResponse(mailboxName, metaData.getACL());
                             responder.respond(aclResponse);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index a7821017b1..5e930b04bc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.ArrayList;
@@ -131,7 +132,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
         // See RFC4551: 3.4. MODSEQ Search Criterion in SEARCH
         if (session.getAttribute(SEARCH_MODSEQ) != null) {
             try {
-                return mailbox.getMetaDataReactive(false, msession, MailboxMetaData.FetchGroup.NO_COUNT)
+                return mailbox.getMetaDataReactive(IGNORE, msession, MailboxMetaData.FetchGroup.NO_COUNT)
                     .flatMap(metaData -> {
                         // Enable CONDSTORE as this is a CONDSTORE enabling command
                         condstoreEnablingCommand(session, responder,  metaData, true);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 17ae9af7e0..40732f3ea9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.RETRIEVE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -31,6 +33,7 @@ import org.apache.james.imap.message.response.MailboxStatusResponse;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -91,9 +94,17 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
 
     private Mono<MessageManager.MailboxMetaData> retrieveMetadata(MailboxPath mailboxPath, StatusDataItems statusDataItems, MailboxSession mailboxSession) {
         MessageManager.MailboxMetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
+        RecentMode recentMode = computeRecentMode(statusDataItems);
 
         return Mono.from(getMailboxManager().getMailboxReactive(mailboxPath, mailboxSession))
-            .flatMap(Throwing.function(mailbox -> mailbox.getMetaDataReactive(false, mailboxSession, fetchGroup)));
+            .flatMap(Throwing.function(mailbox -> mailbox.getMetaDataReactive(recentMode, mailboxSession, fetchGroup)));
+    }
+
+    private RecentMode computeRecentMode(StatusDataItems statusDataItems) {
+        if (statusDataItems.isRecent()) {
+            return RETRIEVE;
+        }
+        return IGNORE;
     }
 
     private MailboxStatusResponse computeStatusResponse(StatusRequest request, StatusDataItems statusDataItems, MessageManager.MailboxMetaData metaData) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
index 68a916f930..a691a03c47 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.ArrayList;
@@ -218,8 +219,8 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
         
         SelectedMailbox selected = session.getSelected();
         return Mono.from(mailbox.setFlagsReactive(request.getFlags(), request.getFlagsUpdateMode(), messageSet, mailboxSession))
-            .flatMap(flagsByUid -> handlePermanentFlagChanges(mailboxSession, mailbox, responder, selected)
-                .then(handleCondstore(request, mailboxSession, mailbox, messageSet, session, responder, silent, unchangedSince, selected, flagsByUid)));
+            .doOnNext(flagsByUid -> handlePermanentFlagChanges(mailboxSession, mailbox, responder, selected))
+            .flatMap(flagsByUid -> handleCondstore(request, mailboxSession, mailbox, messageSet, session, responder, silent, unchangedSince, selected, flagsByUid));
     }
 
     private Mono<Void> handleCondstore(StoreRequest request, MailboxSession mailboxSession, MessageManager mailbox, MessageRange messageSet, ImapSession session, Responder responder, boolean silent, long unchangedSince, SelectedMailbox selected, Map<MessageUid, Flags> flagsByUid) {
@@ -234,7 +235,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
 
                     if (unchangedSince != -1) {
                         // Enable CONDSTORE as this is a CONDSTORE enabling command
-                        return mailbox.getMetaDataReactive(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
+                        return mailbox.getMetaDataReactive(IGNORE, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
                             .doOnNext(metaData -> condstoreEnablingCommand(session, responder,  metaData, true));
                     }
                     return Mono.empty();
@@ -243,22 +244,15 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
         return Mono.empty();
     }
 
-    private Mono<Void> handlePermanentFlagChanges(MailboxSession mailboxSession, MessageManager mailbox, Responder responder, SelectedMailbox selected) {
+    private void handlePermanentFlagChanges(MailboxSession mailboxSession, MessageManager mailbox, Responder responder, SelectedMailbox selected) {
         // As the STORE command is allowed to create a new "flag/keyword", we need to send a FLAGS and PERMANENTFLAGS response before the FETCH response
         // if some new flag/keyword was used
         // See IMAP-303
         if (selected.hasNewApplicableFlags()) {
             flags(responder, selected);
-            try {
-                return Mono.from(mailbox.getMetaDataReactive(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT))
-                    .doOnNext(metaData -> permanentFlags(responder, metaData, selected))
-                    .doOnNext(any -> selected.resetNewApplicableFlags())
-                    .then();
-            } catch (MailboxException e) {
-                throw new RuntimeException(e);
-            }
+            permanentFlags(responder, mailbox.getPermanentFlags(mailboxSession), selected);
+            selected.resetNewApplicableFlags();
         }
-        return Mono.empty();
     }
 
     private void sendFetchResponses(Responder responder, boolean useUids, boolean silent, long unchangedSince, SelectedMailbox selected, Map<MessageUid, Flags> flagsByUid, boolean qresyncEnabled, boolean condstoreEnabled, Map<MessageUid, ModSeq> modSeqs) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index 34560f0396..8dfdcc1110 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor.fetch;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.apache.james.util.ReactorUtils.logOnError;
 
 import java.util.ArrayList;
@@ -91,7 +92,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 Set<Capability> enabled = EnableProcessor.getEnabledCapabilities(session);
                 if (constoreCommand && !enabled.contains(ImapConstants.SUPPORTS_CONDSTORE)) {
                     // Enable CONDSTORE as this is a CONDSTORE enabling command
-                    return mailbox.getMetaDataReactive(false, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
+                    return mailbox.getMetaDataReactive(IGNORE, mailboxSession, MailboxMetaData.FetchGroup.NO_COUNT)
                         .doOnNext(metaData -> condstoreEnablingCommand(session, responder, metaData, true))
                         .flatMap(Throwing.<MailboxMetaData, Mono<Void>>function(
                             any -> doFetch(request, responder, useUids, idSet, fetch, mailboxSession, mailbox, vanished, session))
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
index 996fd50d12..f709722568 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor;
 import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -92,7 +91,7 @@ class DeleteACLProcessorTest {
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaData(anyBoolean(), any(MailboxSession.class), any(FetchGroup.class)))
+        when(messageManager.getMetaData(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(FetchGroup.class)))
             .thenReturn(metaData);
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
index 0b1bcfc44a..616042b1e3 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor;
 import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -92,7 +91,7 @@ class GetACLProcessorTest {
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaDataReactive(anyBoolean(), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
+        when(messageManager.getMetaDataReactive(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
             .thenReturn(Mono.just(metaData));
         when(mailboxManager.getMailboxReactive(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(Mono.just(messageManager));
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
index 524f886292..07f9b69d83 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor;
 import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -100,7 +99,7 @@ class ListRightsProcessorTest {
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaDataReactive(anyBoolean(), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
+        when(messageManager.getMetaDataReactive(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(MailboxMetaData.FetchGroup.class)))
             .thenReturn(Mono.just(metaData));
         when(mailboxManager.getMailboxReactive(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(Mono.just(messageManager));
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
index 49c2524692..791fb347d0 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.processor;
 import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -98,7 +97,7 @@ class SetACLProcessorTest {
 
         imapSession.authenticated();
         imapSession.setMailboxSession(mailboxSession);
-        when(messageManager.getMetaData(anyBoolean(), any(MailboxSession.class), any(FetchGroup.class)))
+        when(messageManager.getMetaData(any(MailboxMetaData.RecentMode.class), any(MailboxSession.class), any(FetchGroup.class)))
             .thenReturn(metaData);
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
index b46c41efd0..01b8f70a2a 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.modules;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
+
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
@@ -63,7 +65,7 @@ public class ACLProbeImpl implements GuiceProbe, ACLProbe {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(mailboxPath.getUser());
 
         return mailboxManager.getMailbox(mailboxPath, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
     }
 }
\ No newline at end of file
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
index 761ddf1b99..c11490a49e 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.jmap.event;
 
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.core.Username;
@@ -43,7 +44,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 public class PropagateLookupRightListenerTest {
-    private static final boolean RESET_RECENT = false;
     private static final Username OWNER_USER = Username.of("user");
     private static final Username SHARED_USER = Username.of("sharee");
     private static final EntryKey SHARED_USER_KEY = EntryKey.createUserEntryKey(SHARED_USER);
@@ -112,7 +112,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -134,7 +134,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -152,7 +152,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -173,7 +173,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -194,11 +194,11 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualParentACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         MailboxACL actualChildACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualParentACL.getEntries())
@@ -222,7 +222,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -240,7 +240,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -258,7 +258,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -274,7 +274,7 @@ public class PropagateLookupRightListenerTest {
         storeMailboxManager.renameMailbox(CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1New"), mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -290,7 +290,7 @@ public class PropagateLookupRightListenerTest {
         storeMailboxManager.renameMailbox(CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1New"), mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
@@ -306,10 +306,10 @@ public class PropagateLookupRightListenerTest {
         storeMailboxManager.renameMailbox(GRAND_CHILD_MAILBOX, MailboxPath.forUser(OWNER_USER, "shared1.sub1.sub2"), mailboxSession);
 
         MailboxACL parentActualACL = storeMailboxManager.getMailbox(parentMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
         MailboxACL childActualACL = storeMailboxManager.getMailbox(childMailboxId1, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(parentActualACL.getEntries())
@@ -330,7 +330,7 @@ public class PropagateLookupRightListenerTest {
             mailboxSession);
 
         MailboxACL actualACL = storeMailboxManager.getMailbox(parentMailboxId, mailboxSession)
-            .getMetaData(RESET_RECENT, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
+            .getMetaData(IGNORE, mailboxSession, MessageManager.MailboxMetaData.FetchGroup.NO_COUNT)
             .getACL();
 
         assertThat(actualACL.getEntries())
diff --git a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
index 83ad754d25..5d2204a812 100644
--- a/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
+++ b/server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java
@@ -24,6 +24,7 @@ import static javax.mail.Folder.READ_WRITE;
 import static org.apache.james.jmap.JMAPTestingConstants.LOCALHOST_IP;
 import static org.apache.james.mailbox.MessageManager.FlagsUpdateMode.REPLACE;
 import static org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup.NO_COUNT;
+import static org.apache.james.mailbox.MessageManager.MailboxMetaData.RecentMode.IGNORE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -1533,7 +1534,7 @@ class IMAPServerTest {
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(14)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(31)), mailboxSession);
 
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(2)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(25)), mailboxSession);
@@ -1577,7 +1578,7 @@ class IMAPServerTest {
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(14)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(31)), mailboxSession);
 
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(2)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(25)), mailboxSession);
@@ -1605,7 +1606,7 @@ class IMAPServerTest {
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(14)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(31)), mailboxSession);
 
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(2)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(25)), mailboxSession);
@@ -1630,7 +1631,7 @@ class IMAPServerTest {
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(2)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(25)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(35)), mailboxSession);
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             clientConnection.write(ByteBuffer.wrap(("A042 STATUS INBOX (HIGHESTMODSEQ)\r\n").getBytes(StandardCharsets.UTF_8)));
 
@@ -1677,7 +1678,7 @@ class IMAPServerTest {
             readStringUntil(clientConnection, s -> s.contains("A142 OK [READ-WRITE] SELECT completed."));
 
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(35)), mailboxSession);
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             clientConnection.write(ByteBuffer.wrap(("a2 NOOP\r\n").getBytes(StandardCharsets.UTF_8)));
             readStringUntil(clientConnection, s -> s.contains("a2 OK NOOP completed."));
@@ -1698,7 +1699,7 @@ class IMAPServerTest {
             readStringUntil(clientConnection, s -> s.contains("A142 OK [READ-WRITE] SELECT completed."));
 
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(35)), mailboxSession);
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             clientConnection.write(ByteBuffer.wrap(("a2 NOOP\r\n").getBytes(StandardCharsets.UTF_8)));
             readStringUntil(clientConnection, s -> s.contains("a2 OK NOOP completed."));
@@ -1717,7 +1718,7 @@ class IMAPServerTest {
 
             readStringUntil(clientConnection, s -> s.contains("A142 OK [READ-WRITE] SELECT completed."));
 
-            ModSeq highestModSeq = inbox.getMetaData(false, mailboxSession, NO_COUNT).getHighestModSeq();
+            ModSeq highestModSeq = inbox.getMetaData(IGNORE, mailboxSession, NO_COUNT).getHighestModSeq();
 
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(7)), mailboxSession);
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(9)), mailboxSession);
@@ -1808,7 +1809,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -1834,7 +1835,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -1860,7 +1861,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -1887,7 +1888,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -1918,7 +1919,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -1949,7 +1950,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -1975,7 +1976,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -2001,7 +2002,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -2028,7 +2029,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.MIN_VALUE), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
 
             UidValidity uidValidity = memoryIntegrationResources.getMailboxManager()
@@ -2076,7 +2077,7 @@ class IMAPServerTest {
                 .setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(10)), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
             clientConnection.write(ByteBuffer.wrap(String.format("I00104 UID FETCH 1:37 (FLAGS) (CHANGEDSINCE %d)\r\n", highestModSeq.asLong()).getBytes(StandardCharsets.UTF_8)));
 
@@ -2097,7 +2098,7 @@ class IMAPServerTest {
             inbox.setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(10)), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
             clientConnection.write(ByteBuffer.wrap(String.format("I00104 UID FETCH 12:37 (FLAGS) (CHANGEDSINCE %d)\r\n", highestModSeq.asLong()).getBytes(StandardCharsets.UTF_8)));
 
@@ -2123,7 +2124,7 @@ class IMAPServerTest {
                 .setFlags(new Flags(ANSWERED), REPLACE, MessageRange.one(MessageUid.of(25)), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
             clientConnection.write(ByteBuffer.wrap(String.format("I00104 UID FETCH 12:37 (FLAGS) (CHANGEDSINCE %d VANISHED)\r\n", highestModSeq.asLong()).getBytes(StandardCharsets.UTF_8)));
 
@@ -2149,7 +2150,7 @@ class IMAPServerTest {
             inbox.delete(ImmutableList.of(MessageUid.of(14)), mailboxSession);
 
             ModSeq highestModSeq = memoryIntegrationResources.getMailboxManager().getMailbox(MailboxPath.inbox(USER), mailboxSession)
-                .getMetaData(false, mailboxSession, NO_COUNT)
+                .getMetaData(IGNORE, mailboxSession, NO_COUNT)
                 .getHighestModSeq();
             clientConnection.write(ByteBuffer.wrap("I00104 NOOP\r\n".getBytes(StandardCharsets.UTF_8)));
 


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