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