You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2024/02/02 03:09:02 UTC
(james-project) branch master updated: [JAMES-2086] FIX: Handle OverQuotaException instead of more generic MailboxException (#1948)
This is an automated email from the ASF dual-hosted git repository.
rcordier 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 15a8fb7688 [JAMES-2086] FIX: Handle OverQuotaException instead of more generic MailboxException (#1948)
15a8fb7688 is described below
commit 15a8fb7688e1901e222be88e1a108640d82097aa
Author: FilipRazek <65...@users.noreply.github.com>
AuthorDate: Fri Feb 2 04:08:57 2024 +0100
[JAMES-2086] FIX: Handle OverQuotaException instead of more generic MailboxException (#1948)
---
.../mail/task/MailboxMergingTaskRunner.java | 5 +++++
.../imap/processor/AbstractMailboxProcessor.java | 5 +++++
.../processor/AbstractMessageRangeProcessor.java | 5 +++++
.../adapter/mailbox/MailboxCopierManagement.java | 4 ++++
.../adapter/mailbox/MailboxManagerManagement.java | 3 +++
.../mailets/delivery/MailboxAppenderImpl.java | 2 ++
.../draft/methods/SetMessagesUpdateProcessor.java | 21 ++++++++++++++++-----
7 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
index 0956ac196a..cab4b7cbde 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageMetadata;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.OverQuotaException;
import org.apache.james.mailbox.model.ComposedMessageId;
import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
import org.apache.james.mailbox.model.MailboxACL;
@@ -85,6 +86,10 @@ public class MailboxMergingTaskRunner {
messageIdManager.setInMailboxesNoCheck(composedMessageId.getMessageId(), newMailboxId, session);
context.incrementMovedCount();
return Task.Result.COMPLETED;
+ } catch (OverQuotaException e) {
+ LOGGER.warn("Failed moving message {} due to quota error", composedMessageId.getMessageId(), e);
+ context.incrementFailedCount();
+ return Task.Result.PARTIAL;
} catch (MailboxException e) {
LOGGER.warn("Failed moving message {}", composedMessageId.getMessageId(), e);
context.incrementFailedCount();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 9275241485..c2cb8af101 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -59,6 +59,7 @@ import org.apache.james.mailbox.ModSeq;
import org.apache.james.mailbox.NullableMessageSequenceNumber;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MessageRangeException;
+import org.apache.james.mailbox.exception.OverQuotaException;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageRange;
import org.apache.james.mailbox.model.MessageRange.Type;
@@ -100,6 +101,10 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
no(acceptableMessage, responder, HumanReadableText.DENIED_SHARED_MAILBOX);
return Mono.empty();
})
+ .onErrorResume(OverQuotaException.class, e -> {
+ no(acceptableMessage, responder, HumanReadableText.FAILURE_OVERQUOTA, StatusResponse.ResponseCode.overQuota());
+ return ReactorUtils.logAsMono(() -> LOGGER.info("Processing failed due to quota restriction", e));
+ })
.onErrorResume(e -> {
no(acceptableMessage, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
return ReactorUtils.logAsMono(() -> LOGGER.error("Unexpected error during IMAP processing", e));
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 59c6f6aad7..5a36239ba1 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -85,6 +85,11 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
return ReactorUtils.logAsMono(() -> LOGGER.debug("{} failed from mailbox {} to {} for invalid sequence-set {}",
getOperationName(), session.getSelected().getMailboxId(), targetMailbox, request.getIdSet(), e));
})
+ .onErrorResume(OverQuotaException.class, e -> {
+ no(request, responder, HumanReadableText.FAILURE_OVERQUOTA, StatusResponse.ResponseCode.overQuota());
+ return ReactorUtils.logAsMono(() -> LOGGER.info("{} failed from mailbox {} to {} due to quota restriction",
+ getOperationName(), session.getSelected().getMailboxId(), targetMailbox, e));
+ })
.onErrorResume(OverQuotaException.class, e -> {
no(request, responder, HumanReadableText.FAILURE_OVERQUOTA, StatusResponse.ResponseCode.overQuota());
return ReactorUtils.logAsMono(() -> LOGGER.info("{} failed: quota exceeded from mailbox {} to {} for sequence-set {}",
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxCopierManagement.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxCopierManagement.java
index 7769bc33a4..a2fe640e35 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxCopierManagement.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxCopierManagement.java
@@ -28,6 +28,7 @@ import javax.inject.Named;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.copier.MailboxCopier;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.OverQuotaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -74,6 +75,9 @@ public class MailboxCopierManagement implements MailboxCopierManagementMBean {
}
try {
copier.copyMailboxes(resolver.resolveMailboxManager(srcBean), resolver.resolveMailboxManager(dstBean));
+ } catch (OverQuotaException e) {
+ log.error("An over quota occured during the copy process", e);
+ throw new Exception(e.getMessage());
} catch (MailboxManagerResolverException | MailboxException | IOException e) {
log.error("An exception occured during the copy process", e);
throw new Exception(e.getMessage());
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
index 1c41e4a25d..0ed61db8c0 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.OverQuotaException;
import org.apache.james.mailbox.model.Content;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxMetaData;
@@ -200,6 +201,8 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
return file.length();
}
}), session);
+ } catch (OverQuotaException e) {
+ LOGGER.error("Unable to import due to quota error", e);
} catch (Exception e) {
LOGGER.error("Unable to create mailbox", e);
} finally {
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
index e1fd413b65..1be5d74b2c 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.MessageManager.AppendResult;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxExistsException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.exception.OverQuotaException;
import org.apache.james.mailbox.model.ComposedMessageId;
import org.apache.james.mailbox.model.Content;
import org.apache.james.mailbox.model.MailboxPath;
@@ -123,6 +124,7 @@ public class MailboxAppenderImpl implements MailboxAppender {
},
session -> appendMessageToMailbox(mail, session, mailboxPath, flags),
this::closeProcessing)
+ .onErrorMap(OverQuotaException.class, e -> new MessagingException("Could not append due to quota error", e))
.onErrorMap(MailboxException.class, e -> new MessagingException("Unable to access mailbox.", e));
}
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
index 2b9819ee4c..2d62b07d07 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
@@ -260,6 +260,11 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
MailboxId targetId = mailboxIdFactory.fromString(patch.getMailboxIds().get().iterator().next());
mailboxManager.moveMessages(range, mailboxId, targetId, mailboxSession);
return SetMessagesResponse.builder().updated(messageIds);
+ } catch (OverQuotaException e) {
+ return messageIds.stream()
+ .map(messageId -> handleMessageUpdateQuotaException(messageId, e))
+ .reduce(SetMessagesResponse.Builder::mergeWith)
+ .orElse(SetMessagesResponse.builder());
} catch (MailboxException e) {
return messageIds.stream()
.map(messageId -> handleMessageUpdateException(messageId, e))
@@ -303,11 +308,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
.then(Mono.just(SetMessagesResponse.builder().updated(ImmutableList.of(messageId))))
.flatMap(builder -> sendMessageWhenOutboxInTargetMailboxIds(outboxes, messageId, updateMessagePatch, mailboxSession)
.map(builder::mergeWith))
- .onErrorResume(OverQuotaException.class, e -> Mono.just(SetMessagesResponse.builder().notUpdated(messageId,
- SetError.builder()
- .type(SetError.Type.MAX_QUOTA_REACHED)
- .description(e.getMessage())
- .build())))
+ .onErrorResume(OverQuotaException.class, e -> Mono.just(handleMessageUpdateQuotaException(messageId, e)))
.onErrorResume(MailboxException.class, e -> Mono.just(handleMessageUpdateException(messageId, e)))
.onErrorResume(IOException.class, e -> Mono.just(handleMessageUpdateException(messageId, e)))
.onErrorResume(MessagingException.class, e -> Mono.just(handleMessageUpdateException(messageId, e)))
@@ -465,6 +466,16 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
.build()));
}
+ private SetMessagesResponse.Builder handleMessageUpdateQuotaException(MessageId messageId,
+ Throwable e) {
+ LOGGER.error("A quota restriction error occurred when updating a message", e);
+ return SetMessagesResponse.builder().notUpdated(messageId,
+ SetError.builder()
+ .type(SetError.Type.MAX_QUOTA_REACHED)
+ .description(e.getMessage())
+ .build());
+ }
+
private SetMessagesResponse.Builder handleInvalidRequest(MessageId messageId,
ImmutableList<ValidationResult> validationErrors, UpdateMessagePatch patch) {
LOGGER.warn("Invalid update request with patch {} for message #{}: {}", patch, messageId, validationErrors);
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org