This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 29111de9430062f6313f48618e3cc5504958de25 Author: Benoit TELLIER <btell...@linagora.com> AuthorDate: Wed Mar 13 15:20:59 2024 +0100 [FIX] OpenSearchListeningMessageSearchIndex should not fail on missing mailbox --- .../events/OpenSearchListeningMessageSearchIndex.java | 7 ++++++- .../events/OpenSearchListeningMessageSearchIndexTest.java | 14 ++++++++++++++ .../mailbox/store/search/ListeningMessageSearchIndex.java | 11 ++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndex.java b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndex.java index 056b533ad2..c321de6424 100644 --- a/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndex.java +++ b/mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndex.java @@ -53,6 +53,7 @@ import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.SessionProvider; import org.apache.james.mailbox.events.MailboxEvents; +import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.model.Mailbox; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; @@ -300,7 +301,11 @@ public class OpenSearchListeningMessageSearchIndex extends ListeningMessageSearc private Mono<Void> processAddedEvent(MailboxSession session, MailboxEvents.Added addedEvent, MailboxId mailboxId) { return factory.getMailboxMapper(session) .findMailboxById(mailboxId) - .flatMap(mailbox -> handleAdded(session, mailbox, addedEvent, chooseFetchType())); + .flatMap(mailbox -> handleAdded(session, mailbox, addedEvent, chooseFetchType())) + .onErrorResume(MailboxNotFoundException.class, e -> { + LOGGER.info("Added event skipped for deleted mailbox {}", mailboxId.serialize()); + return Mono.empty(); + }); } private FetchType chooseFetchType() { diff --git a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java index 2ac5fa71e9..0bdd95383b 100644 --- a/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java +++ b/mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java @@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.awaitility.Durations.ONE_HUNDRED_MILLISECONDS; +import static org.mockito.Mockito.mock; import java.io.IOException; import java.io.InputStream; @@ -33,6 +34,7 @@ import java.time.Instant; import java.time.ZoneId; import java.util.Date; import java.util.Optional; +import java.util.UUID; import jakarta.mail.Flags; @@ -395,6 +397,18 @@ class OpenSearchListeningMessageSearchIndexTest { .isEmpty(); } + @Test + void addShouldNotFailWhenMailboxHadBeenDeleted() { + mapperFactory.getMailboxMapper(session) + .delete(mailbox) + .block(); + + assertThatCode(() -> testee.event(new MailboxEvents.Added(MailboxSession.SessionId.of(36), BOB, mailbox.generateAssociatedPath(), + mailbox.getMailboxId(), ImmutableSortedMap.of(MESSAGE_UID_1, mock(MessageMetaData.class)), Event.EventId.of(UUID.randomUUID()), + !IS_DELIVERY, IS_APPENDED, Optional.empty()))) + .doesNotThrowAnyException(); + } + @Test void deleteShouldBeIdempotent() throws Exception { testee.add(session, mailbox, MESSAGE_1).block(); diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java index 8b38c21893..b2f1e3a174 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java @@ -35,6 +35,7 @@ import org.apache.james.mailbox.events.MailboxEvents.FlagsUpdated; import org.apache.james.mailbox.events.MailboxEvents.MailboxDeletion; import org.apache.james.mailbox.events.MailboxEvents.MailboxEvent; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.model.Mailbox; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageRange; @@ -43,6 +44,8 @@ import org.apache.james.mailbox.model.UpdatedFlags; import org.apache.james.mailbox.store.MailboxSessionMapperFactory; import org.apache.james.mailbox.store.mail.MessageMapper.FetchType; import org.apache.james.mailbox.store.mail.model.MailboxMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.github.fge.lambdas.Throwing; import com.google.common.collect.ImmutableList; @@ -56,6 +59,8 @@ import reactor.core.scheduler.Schedulers; * notified about message changes. This will then allow to update the underlying index. */ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, EventListener.ReactiveGroupEventListener { + private static final Logger LOGGER = LoggerFactory.getLogger(ListeningMessageSearchIndex.class); + public interface SearchOverride { boolean applicable(SearchQuery searchQuery, MailboxSession session); @@ -106,7 +111,11 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, if (event instanceof Added) { return factory.getMailboxMapper(session) .findMailboxById(mailboxId) - .flatMap(mailbox -> handleAdded(session, mailbox, (Added) event)); + .flatMap(mailbox -> handleAdded(session, mailbox, (Added) event)) + .onErrorResume(MailboxNotFoundException.class, e -> { + LOGGER.info("Added event skipped for deleted mailbox {}", mailboxId.serialize()); + return Mono.empty(); + }); } else if (event instanceof Expunged) { Expunged expunged = (Expunged) event; --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org