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