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]

Reply via email to