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


The following commit(s) were added to refs/heads/master by this push:
     new 73bcf5947c [FIX] Email/set destroy should fire one event per impacted 
mailbox (#2576)
73bcf5947c is described below

commit 73bcf5947c1a47dbb331fbed3c6ffc453f9be02a
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Fri Dec 20 22:29:29 2024 +0100

    [FIX] Email/set destroy should fire one event per impacted mailbox (#2576)
    
    This limits downstream chatter:
     - RabbitMQ / Redis dispatch overhead
---
 .../org/apache/james/mailbox/store/StoreMessageIdManager.java | 11 ++++++++---
 .../mailbox/store/AbstractMessageIdManagerSideEffectTest.java |  9 +++++----
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 31d7e62575..bf69257a9b 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -290,21 +290,26 @@ public class StoreMessageIdManager implements 
MessageIdManager {
     private Mono<Void> delete(MessageIdMapper messageIdMapper, 
List<MailboxMessage> messageList, MailboxSession mailboxSession, 
Map<MetadataWithMailboxId, MessageMetaData> metadataWithMailbox) {
         MailboxMapper mailboxMapper = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
 
+        ImmutableListMultimap<MailboxId, MessageMetaData> actualDeletion = 
metadataWithMailbox.entrySet().stream()
+            .collect(ImmutableListMultimap.toImmutableListMultimap(
+                e -> e.getKey().getMailboxId(),
+                Map.Entry::getValue));
+
         return messageIdMapper.deleteReactive(
             messageList.stream()
                 .collect(ImmutableListMultimap.toImmutableListMultimap(
                     Message::getMessageId,
                     MailboxMessage::getMailboxId)))
             .then(
-                Flux.fromIterable(metadataWithMailbox.entrySet())
-                    .flatMap(metadataWithMailboxId -> 
mailboxMapper.findMailboxById(metadataWithMailboxId.getKey().getMailboxId())
+                Flux.fromIterable(actualDeletion.asMap().entrySet())
+                    .flatMap(metadataWithMailboxId -> 
mailboxMapper.findMailboxById(metadataWithMailboxId.getKey())
                         .flatMap(mailbox -> 
eventBus.dispatch(EventFactory.expunged()
                                 .randomEventId()
                                 .mailboxSession(mailboxSession)
                                 .mailbox(mailbox)
                                 .addMetaData(metadataWithMailboxId.getValue())
                                 .build(),
-                            new 
MailboxIdRegistrationKey(metadataWithMailboxId.getKey().getMailboxId()))), 
DEFAULT_CONCURRENCY)
+                            new 
MailboxIdRegistrationKey(metadataWithMailboxId.getKey()))), DEFAULT_CONCURRENCY)
                     .then());
     }
 
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index 29cc21aa92..16ec78a2f2 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -181,12 +181,13 @@ public abstract class 
AbstractMessageIdManagerSideEffectTest {
         AbstractListAssert<?, List<? extends Expunged>, Expunged, 
ObjectAssert<Expunged>> events =
             assertThat(eventCollector.getEvents())
                 .filteredOn(event -> event instanceof Expunged)
-                .hasSize(2)
-                .extracting(event -> (Expunged) event);
+                .hasSize(1)
+                .extracting(event -> (Expunged) event)
+                .allMatch(event -> event.getExpunged().size() == 2);
         
events.extracting(MailboxEvent::getMailboxId).containsOnly(mailbox1.getMailboxId(),
 mailbox1.getMailboxId());
         events.extracting(Expunged::getExpunged)
-            
.containsOnly(ImmutableSortedMap.of(simpleMessageMetaData1.getUid(), 
simpleMessageMetaData1),
-                ImmutableSortedMap.of(simpleMessageMetaData2.getUid(), 
simpleMessageMetaData2));
+            
.containsOnly(ImmutableSortedMap.of(simpleMessageMetaData1.getUid(), 
simpleMessageMetaData1,
+                simpleMessageMetaData2.getUid(), simpleMessageMetaData2));
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to