This is an automated email from the ASF dual-hosted git repository.

kao pushed a commit to branch 3.7.x
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/3.7.x by this push:
     new 63991353f3 JAMES-3787 RemoteDelivery: Error upon enqueue lead to email 
loss
63991353f3 is described below

commit 63991353f3ccb87f5b9c0c3cc0a1320054b80d79
Author: Benoit Tellier <[email protected]>
AuthorDate: Thu Jun 30 16:53:58 2022 +0700

    JAMES-3787 RemoteDelivery: Error upon enqueue lead to email loss
    
    (cherry picked from commit 8335c9d858bc0535e3bced5b550823afd6326e96)
---
 .../james/transport/mailets/RemoteDelivery.java    | 19 ++++--------
 .../remote/delivery/RemoteDeliveryTest.java        | 34 +++++++++++++++++++---
 2 files changed, 36 insertions(+), 17 deletions(-)

diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
index b0f080cd78..b89eaf30ad 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
@@ -206,18 +206,14 @@ public class RemoteDelivery extends GenericMailet {
         mail.setState(Mail.GHOST);
     }
 
-    private void serviceWithGateway(Mail mail) {
+    private void serviceWithGateway(Mail mail) throws MailQueueException {
         if (configuration.isDebug()) {
             LOGGER.debug("Sending mail to {} via {}", mail.getRecipients(), 
configuration.getGatewayServer());
         }
-        try {
-            queue.enQueue(mail);
-        } catch (MailQueueException e) {
-            LOGGER.error("Unable to queue mail {} for recipients {}", 
mail.getName(), mail.getRecipients(), e);
-        }
+        queue.enQueue(mail);
     }
 
-    private void serviceNoGateway(Mail mail) {
+    private void serviceNoGateway(Mail mail) throws MailQueueException {
         String mailName = mail.getName();
         Map<Domain, Collection<MailAddress>> targets = 
groupByServer(mail.getRecipients());
         for (Map.Entry<Domain, Collection<MailAddress>> entry : 
targets.entrySet()) {
@@ -225,17 +221,14 @@ public class RemoteDelivery extends GenericMailet {
         }
     }
 
-    private void serviceSingleServer(Mail mail, String originalName, 
Map.Entry<Domain, Collection<MailAddress>> entry) {
+    private void serviceSingleServer(Mail mail, String originalName, 
Map.Entry<Domain, Collection<MailAddress>> entry) throws MailQueueException {
         if (configuration.isDebug()) {
             LOGGER.debug("Sending mail to {} on host {}", entry.getValue(), 
entry.getKey());
         }
         mail.setRecipients(entry.getValue());
         mail.setName(originalName + NAME_JUNCTION + entry.getKey().name());
-        try {
-            queue.enQueue(mail);
-        } catch (MailQueueException e) {
-            LOGGER.error("Unable to queue mail {} for recipients {}", 
mail.getName(), mail.getRecipients(), e);
-        }
+
+        queue.enQueue(mail);
     }
 
     private Map<Domain, Collection<MailAddress>> 
groupByServer(Collection<MailAddress> recipients) {
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
index 4694f6c627..a045845ada 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
@@ -23,7 +23,12 @@ import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.mailet.base.MailAddressFixture.JAMES_APACHE_ORG;
 import static 
org.apache.mailet.base.MailAddressFixture.JAMES_APACHE_ORG_DOMAIN;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
 
 import java.util.Collection;
 import java.util.List;
@@ -37,7 +42,7 @@ import 
org.apache.james.domainlist.lib.DomainListConfiguration;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.queue.api.MailPrioritySupport;
-import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.apache.james.queue.memory.MemoryMailQueueFactory;
@@ -97,12 +102,14 @@ class RemoteDeliveryTest {
     public static final String MAIL_NAME = "mail_name";
 
     private RemoteDelivery remoteDelivery;
-    private ManageableMailQueue mailQueue;
+    private MemoryMailQueueFactory.MemoryCacheableMailQueue mailQueue;
 
     @BeforeEach
     public void setUp() throws ConfigurationException {
-        MailQueueFactory<? extends ManageableMailQueue> queueFactory = new 
MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory());
-        mailQueue = 
queueFactory.createQueue(RemoteDeliveryConfiguration.DEFAULT_OUTGOING_QUEUE_NAME);
+        MemoryMailQueueFactory queueFactory = spy(new 
MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory()));
+        mailQueue = 
spy(queueFactory.createQueue(RemoteDeliveryConfiguration.DEFAULT_OUTGOING_QUEUE_NAME));
+        
when(queueFactory.createQueue(RemoteDeliveryConfiguration.DEFAULT_OUTGOING_QUEUE_NAME))
+            .thenReturn(mailQueue);
         DNSService dnsService = mock(DNSService.class);
         MemoryDomainList domainList = new MemoryDomainList(dnsService);
         
domainList.configure(DomainListConfiguration.builder().defaultDomain(JAMES_APACHE_ORG_DOMAIN));
@@ -133,6 +140,25 @@ class RemoteDeliveryTest {
                     .build()));
     }
 
+    @Test
+    void remoteDeliveryShouldPropagateFailures() throws Exception {
+        remoteDelivery.init(FakeMailetConfig.builder()
+            .build());
+
+        doThrow(new MailQueue.MailQueueException("Injected failure"))
+            .when(mailQueue)
+            .enQueue(any(), any());
+
+        Mail mail = FakeMail.builder()
+            .name(MAIL_NAME)
+            .recipients(MailAddressFixture.ANY_AT_JAMES)
+            .mimeMessage(MimeMessageUtil.mimeMessageFromBytes("h: 
v\r\n".getBytes(UTF_8)))
+            .build();
+
+        assertThatThrownBy(() -> remoteDelivery.service(mail))
+            .isInstanceOf(MailQueue.MailQueueException.class);
+    }
+
     @Test
     void remoteDeliveryShouldSplitMailsByServerWhenNoGateway() throws 
Exception {
         remoteDelivery.init(FakeMailetConfig.builder()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to