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 <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org