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/03/22 02:03:32 UTC

[james-project] 03/25: JAMES-3722 Don't mix highest modseq and highest modseq for which deletion occurs

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 677c0035b78b6eefe8fa460cf561f89a07543a2e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Mar 7 22:33:12 2022 +0700

    JAMES-3722 Don't mix highest modseq and highest modseq for which deletion occurs
    
    We did take the latests modseq as the 'latest modseq for which a deletion occured'
    which is not stored, thus we never return deletions unless there are new messages
    / flags changes  causing the modseq to change
---
 .../imap/processor/AbstractMailboxProcessor.java   | 65 ++++++++--------------
 .../imap/processor/AbstractSelectionProcessor.java |  2 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  2 +-
 .../james/imapserver/netty/IMAPServerTest.java     |  5 +-
 4 files changed, 27 insertions(+), 47 deletions(-)

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 786a7e7..ae3b12c 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
@@ -534,49 +534,32 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
     /**
      * Send VANISHED responses if needed. 
      */
-    protected void respondVanished(SelectedMailbox selectedMailbox, List<MessageRange> ranges, long changedSince, MailboxMetaData metaData, Responder responder) throws MailboxException {
-        // RFC5162 4.2. Server Implementations Storing Minimal State
-        //  
-        //      A server that stores the HIGHESTMODSEQ value at the time of the last
-        //      EXPUNGE can omit the VANISHED response when a client provides a
-        //      MODSEQ value that is equal to, or higher than, the current value of
-        //      this datum, that is, when there have been no EXPUNGEs.
-        //
-        //      A client providing message sequence match data can reduce the scope
-        //      as above.  In the case where there have been no expunges, the server
-        //      can ignore this data.
-        if (metaData.getHighestModSeq().asLong() > changedSince) {
-            SearchQuery.Builder searchQuery = SearchQuery.builder();
-            SearchQuery.UidRange[] nRanges = new SearchQuery.UidRange[ranges.size()];
-            Set<MessageUid> vanishedUids = new HashSet<>();
-            for (int i = 0; i < ranges.size(); i++) {
-                MessageRange r = ranges.get(i);
-                SearchQuery.UidRange nr;
-                if (r.getType() == Type.ONE) {
-                    nr = new SearchQuery.UidRange(r.getUidFrom());
-                } else {
-                    nr = new SearchQuery.UidRange(r.getUidFrom(), r.getUidTo());
-                }
-                MessageUid from = nr.getLowValue();
-                MessageUid to = nr.getHighValue();
-                while (from.compareTo(to) <= 0) {
-                    MessageUid copy = from;
-                    selectedMailbox.msn(from).fold(
-                        () -> vanishedUids.add(copy),
-                        msn -> {
-                            // ignore still there
-                            return true;
-                        });
-                    from = from.next();
-                }
-                nRanges[i] = nr;
-
+    protected void respondVanished(SelectedMailbox selectedMailbox, List<MessageRange> ranges, Responder responder) throws MailboxException {
+        Set<MessageUid> vanishedUids = new HashSet<>();
+        for (int i = 0; i < ranges.size(); i++) {
+            MessageRange r = ranges.get(i);
+            SearchQuery.UidRange nr;
+            if (r.getType() == Type.ONE) {
+                nr = new SearchQuery.UidRange(r.getUidFrom());
+            } else {
+                nr = new SearchQuery.UidRange(r.getUidFrom(), r.getUidTo());
             }
-            UidRange[] vanishedIdRanges = uidRanges(MessageRange.toRanges(vanishedUids));
-            responder.respond(new VanishedResponse(vanishedIdRanges, true));
+            MessageUid from = nr.getLowValue();
+            MessageUid to = nr.getHighValue();
+            while (from.compareTo(to) <= 0) {
+                MessageUid copy = from;
+                selectedMailbox.msn(from).fold(
+                    () -> vanishedUids.add(copy),
+                    msn -> {
+                        // ignore still there
+                        return true;
+                    });
+                from = from.next();
+            }
+
         }
-        
-        
+        UidRange[] vanishedIdRanges = uidRanges(MessageRange.toRanges(vanishedUids));
+        responder.respond(new VanishedResponse(vanishedIdRanges, true));
     }
     
     
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 2fa0ddd..051755c 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
@@ -261,7 +261,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
         //          expunges have not happened, or happen only toward the end of the
         //          mailbox.
         //
-        respondVanished(selected, ranges, modSeq, metaData, responder);
+        respondVanished(selected, ranges, responder);
     }
 
     @VisibleForTesting
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 74b02cc..8255b65 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
@@ -112,7 +112,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             if (vanished) {
                 // TODO: From the QRESYNC RFC it seems ok to send the VANISHED responses after the FETCH Responses. 
                 //       If we do so we could prolly save one mailbox access which should give use some more speed up
-                respondVanished(session.getSelected(), ranges, changedSince, metaData.get(), responder);
+                respondVanished(session.getSelected(), ranges, responder);
             }
             processMessageRanges(session, mailbox, ranges, fetch, useUids, mailboxSession, responder);
 
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 df20e64..4799857 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
@@ -1497,11 +1497,8 @@ class IMAPServerTest {
                 .isEmpty();
         }
 
-        @Disabled("JAMES-3722 We currently take the latests modseq as the 'latest modseq for which a deletion occured'" +
-            " which is not currently stored, thus we never return deletions unless there are new messages / flags changes" +
-            " causing the modseq to change")
         @Test
-        void selectShouldReturnDeletedMessagesWhenNoSubsequentModifucation() throws Exception {
+        void selectShouldReturnDeletedMessagesWhenNoSubsequentModification() throws Exception {
             MailboxSession mailboxSession = memoryIntegrationResources.getMailboxManager().createSystemSession(USER);
             memoryIntegrationResources.getMailboxManager()
                 .createMailbox(MailboxPath.inbox(USER), mailboxSession);

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