JAMES-2544 Add tests for concurrent ack/nack in MailQueueContract
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/50822df4 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/50822df4 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/50822df4 Branch: refs/heads/master Commit: 50822df49ee37d4b2c9b5f547054158abb10b942 Parents: d5a7cbf Author: Benoit Tellier <[email protected]> Authored: Thu Sep 27 18:16:49 2018 +0700 Committer: Benoit Tellier <[email protected]> Committed: Thu Oct 4 15:12:08 2018 +0700 ---------------------------------------------------------------------- .../activemq/ActiveMQMailQueueBlobTest.java | 7 ++++ .../queue/activemq/ActiveMQMailQueueTest.java | 7 ++++ .../james/queue/api/MailQueueContract.java | 37 ++++++++++++++++++++ .../james/queue/file/FileMailQueueTest.java | 7 ++++ .../james/queue/jms/JMSMailQueueTest.java | 14 ++++++++ 5 files changed, 72 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java ---------------------------------------------------------------------- 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 0c18d71..078db43 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 @@ -124,6 +124,13 @@ public class ActiveMQMailQueueBlobTest implements DelayedManageableMailQueueCont } @Test + @Override + @Disabled("JAMES-2544 Mixing concurrent ack/nack might lead to a deadlock") + public void concurrentEnqueueDequeueWithAckNackShouldNotFail() { + + } + + @Test void computeNextDeliveryTimestampShouldReturnLongMaxWhenOverflow() { long deliveryTimestamp = mailQueue.computeNextDeliveryTimestamp(Long.MAX_VALUE, TimeUnit.DAYS); http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java ---------------------------------------------------------------------- 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 650eca2..d502177 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 @@ -126,4 +126,11 @@ public class ActiveMQMailQueueTest implements DelayedManageableMailQueueContract public void clearShouldRemoveAllElements() { } + + @Test + @Override + @Disabled("JAMES-2544 Mixing concurrent ack/nack might lead to a deadlock") + public void concurrentEnqueueDequeueWithAckNackShouldNotFail() { + + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java index a2b6405..8c6418b 100644 --- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java +++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java @@ -378,6 +378,43 @@ public interface MailQueueContract { .hasSize(totalDequeuedMessages); } + @Test + default void concurrentEnqueueDequeueWithAckNackShouldNotFail() throws Exception { + MailQueue testee = getMailQueue(); + + ConcurrentLinkedDeque<Mail> dequeuedMails = new ConcurrentLinkedDeque<>(); + + int threadCount = 10; + int operationCount = 150; + int totalDequeuedMessages = 500; + ConcurrentTestRunner.builder() + .operation((threadNumber, step) -> { + if (step % 3 == 0) { + testee.enQueue(defaultMail() + .name("name" + threadNumber + "-" + step) + .build()); + } + if (step % 3 == 1) { + MailQueue.MailQueueItem mailQueueItem = testee.deQueue(); + mailQueueItem.done(false); + } + if (step % 3 == 2) { + MailQueue.MailQueueItem mailQueueItem = testee.deQueue(); + dequeuedMails.add(mailQueueItem.getMail()); + mailQueueItem.done(true); + } + }) + .threadCount(threadCount) + .operationCount(operationCount) + .runSuccessfullyWithin(Duration.ofMinutes(1)); + + assertThat( + dequeuedMails.stream() + .map(Mail::getName) + .distinct()) + .hasSize(totalDequeuedMessages); + } + class SerializableAttribute implements Serializable { private final String value; http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java index 4ad3753..217c85f 100644 --- a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java +++ b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java @@ -104,4 +104,11 @@ public class FileMailQueueTest implements DelayedManageableMailQueueContract { public void browseShouldReturnMailsWithMimeMessage() { } + + @Test + @Override + @Disabled("JAMES-2544 Mixing concurent operation might lead to a deadlock and missing fiels") + public void concurrentEnqueueDequeueWithAckNackShouldNotFail() { + + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java index f483085..a39de8a 100644 --- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java +++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java @@ -99,4 +99,18 @@ public class JMSMailQueueTest implements DelayedManageableMailQueueContract, Pri public void clearShouldRemoveAllElements() { } + + @Test + @Override + @Disabled("JAMES-2544 Mixing concurrent operations might lead to a missing file and errors upon dequeue") + public void concurrentEnqueueDequeueShouldNotFail() { + + } + + @Test + @Override + @Disabled("JAMES-2544 Mixing concurrent operations might lead to a missing file and errors upon dequeue") + public void concurrentEnqueueDequeueWithAckNackShouldNotFail() { + + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
