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]