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
The following commit(s) were added to refs/heads/master by this push:
new 4d16970 JAMES-3687 Demonstrate issues with deletes of delayed mails
(#831)
4d16970 is described below
commit 4d1697036bf494eef4962299532079a7ae3f403f
Author: Benoit TELLIER <[email protected]>
AuthorDate: Thu Jan 13 15:48:16 2022 +0700
JAMES-3687 Demonstrate issues with deletes of delayed mails (#831)
- The Pulsar mail queue currently do not delete delayed emails
Explanation: the sequenceId of the mail is reset when
moved from the scheduled topic to the out topic, thus
bypassing deletes emitted while it was sitting in the
scheduled queue.
(this mechanism exist to prevent deletions to apply on
future emails)
We would likely need the sequence to be backed by some
applicative metadata - like a timestamp?
- Second problem: filter removal based on sequence number
Goal: Prevent uncontrolled growth by removing
meaningless deletion filters
Assumptions: emails are ordered
Pitfall: delayed messages are out of order.
Please note that the JMS mailqueue is buggy regarding
delayed messages being deleted, I used the memory implementation as a
reference.
---
.../queue/activemq/ActiveMQMailQueueBlobTest.java | 14 +++++
.../queue/activemq/ActiveMQMailQueueTest.java | 14 +++++
.../api/DelayedManageableMailQueueContract.java | 59 ++++++++++++++++++++++
.../james/queue/jms/JMSCacheableMailQueueTest.java | 14 +++++
.../james/queue/pulsar/PulsarMailQueueTest.java | 14 +++++
5 files changed, 115 insertions(+)
diff --git
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
index 1a68b89..771aede 100644
---
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
+++
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
@@ -143,6 +143,20 @@ public class ActiveMQMailQueueBlobTest implements
DelayedManageableMailQueueCont
}
@Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeleted() {
+
+ }
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeletedWhenMixedWithOtherEmails() {
+
+ }
+
+ @Test
void computeNextDeliveryTimestampShouldReturnLongMaxWhenOverflow() {
long deliveryTimestamp =
mailQueue.computeNextDeliveryTimestamp(ChronoUnit.FOREVER.getDuration());
diff --git
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
index f3c68f1..fbac8b7 100644
---
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
+++
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
@@ -134,4 +134,18 @@ public class ActiveMQMailQueueTest implements
DelayedManageableMailQueueContract
public void concurrentEnqueueDequeueWithAckNackShouldNotFail() {
}
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeleted() {
+
+ }
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeletedWhenMixedWithOtherEmails() {
+
+ }
}
diff --git
a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
index bbbbf77..51c7676 100644
---
a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
+++
b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java
@@ -23,6 +23,7 @@ import static org.apache.james.queue.api.Mails.defaultMail;
import static org.assertj.core.api.Assertions.assertThat;
import java.time.Duration;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -33,6 +34,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import reactor.core.publisher.Flux;
+import reactor.core.scheduler.Schedulers;
@ExtendWith(ExecutorExtension.class)
public interface DelayedManageableMailQueueContract extends
DelayedMailQueueContract, ManageableMailQueueContract {
@@ -71,6 +73,63 @@ public interface DelayedManageableMailQueueContract extends
DelayedMailQueueCont
}
@Test
+ default void delayedEmailsShouldBeDeleted() throws Exception {
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("abc")
+ .build(),
+ 5L,
+ TimeUnit.SECONDS);
+ // The queue being FIFO a second email can serve as a wait condition
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("def")
+ .build(),
+ 5L,
+ TimeUnit.SECONDS);
+
+ getManageableMailQueue().remove(ManageableMailQueue.Type.Name, "abc");
+
+ ArrayList<String> names = new ArrayList<>();
+ Flux.from(getManageableMailQueue().deQueue())
+ .subscribeOn(Schedulers.elastic())
+ .subscribe(item -> names.add(item.getMail().getName()));
+
+ Awaitility.await()
+ .untilAsserted(() -> assertThat(names).contains("def"));
+ assertThat(names).containsExactly("def");
+ }
+
+ @Test
+ default void delayedEmailsShouldBeDeletedWhenMixedWithOtherEmails() throws
Exception {
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("abc")
+ .build(),
+ 5L,
+ TimeUnit.SECONDS);
+
+ getManageableMailQueue().remove(ManageableMailQueue.Type.Name, "abc");
+
+ // The newer email
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("def")
+ .build());
+ // The queue being FIFO a third email can serve as a wait condition
+ getManageableMailQueue().enQueue(defaultMail()
+ .name("ghi")
+ .build(),
+ 5L,
+ TimeUnit.SECONDS);
+
+ ArrayList<String> names = new ArrayList<>();
+ Flux.from(getManageableMailQueue().deQueue())
+ .subscribeOn(Schedulers.elastic())
+ .subscribe(item -> names.add(item.getMail().getName()));
+
+ Awaitility.await()
+ .untilAsserted(() -> assertThat(names).contains("ghi"));
+ assertThat(names).containsExactly("def", "ghi");
+ }
+
+ @Test
default void flushShouldRemoveDelaysWhenImmediateMessageFirst() throws
Exception {
getManageableMailQueue().enQueue(defaultMail()
.name("name1")
diff --git
a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
index fb0e189..56e72a6 100644
---
a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
+++
b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
@@ -123,4 +123,18 @@ public class JMSCacheableMailQueueTest implements
DelayedManageableMailQueueCont
public void enQueueShouldAcceptMailWithDuplicatedNames() {
}
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeleted() {
+
+ }
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeletedWhenMixedWithOtherEmails() {
+
+ }
}
diff --git
a/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java
b/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java
index a992a45..46afc54 100644
---
a/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java
+++
b/server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java
@@ -238,4 +238,18 @@ public class PulsarMailQueueTest implements
MailQueueContract, MailQueueMetricCo
@Override
public void flushShouldPreserveBrowseOrder() {
}
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeleted() {
+
+ }
+
+ @Test
+ @Override
+ @Disabled("JAMES-3687 Delayed deletes are buggy")
+ public void delayedEmailsShouldBeDeletedWhenMixedWithOtherEmails() {
+
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]