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

commit 79af078a2738ab98c0ea55344c143001f022fe95
Author: Quan Tran <[email protected]>
AuthorDate: Wed Jan 14 10:15:24 2026 +0700

    [FIX] CassandraEventDeadLetters should remove the group when removed the 
last event of the group
---
 .../org/apache/james/events/EventDeadLettersContract.java    | 12 ++++++++++++
 .../org/apache/james/events/CassandraEventDeadLetters.java   | 11 ++++++++++-
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git 
a/event-bus/api/src/test/java/org/apache/james/events/EventDeadLettersContract.java
 
b/event-bus/api/src/test/java/org/apache/james/events/EventDeadLettersContract.java
index 7ef08f4a9e..42cdf38796 100644
--- 
a/event-bus/api/src/test/java/org/apache/james/events/EventDeadLettersContract.java
+++ 
b/event-bus/api/src/test/java/org/apache/james/events/EventDeadLettersContract.java
@@ -234,6 +234,18 @@ interface EventDeadLettersContract {
                 .isNull();
         }
 
+        @Test
+        default void removeLastEventShouldRemoveGroup() {
+            EventDeadLetters eventDeadLetters = eventDeadLetters();
+
+            InsertionId insertionId = eventDeadLetters.store(GROUP_A, 
EVENT_1).block();
+
+            eventDeadLetters.remove(GROUP_A, insertionId).block();
+
+            
assertThat(eventDeadLetters.groupsWithFailedEvents().collectList().block())
+                .isEmpty();
+        }
+
         @Test
         default void removeAllEventsOfAGroupShouldAllEventsOfThatGroup() {
             EventDeadLetters eventDeadLetters = eventDeadLetters();
diff --git 
a/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLetters.java
 
b/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLetters.java
index 63699ac9a6..be257ba194 100644
--- 
a/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLetters.java
+++ 
b/event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLetters.java
@@ -54,7 +54,8 @@ public class CassandraEventDeadLetters implements 
EventDeadLetters {
         Preconditions.checkArgument(registeredGroup != null, 
REGISTERED_GROUP_CANNOT_BE_NULL);
         Preconditions.checkArgument(failDeliveredInsertionId != null, 
FAIL_DELIVERED_ID_INSERTION_CANNOT_BE_NULL);
 
-        return cassandraEventDeadLettersDAO.removeEvent(registeredGroup, 
failDeliveredInsertionId);
+        return cassandraEventDeadLettersDAO.removeEvent(registeredGroup, 
failDeliveredInsertionId)
+            .then(removeGroupIfLastEvent(registeredGroup));
     }
 
     @Override
@@ -89,4 +90,12 @@ public class CassandraEventDeadLetters implements 
EventDeadLetters {
     public Mono<Boolean> containEvents() {
         return cassandraEventDeadLettersDAO.containEvents();
     }
+
+    private Mono<Void> removeGroupIfLastEvent(Group registeredGroup) {
+        return 
cassandraEventDeadLettersDAO.retrieveInsertionIdsWithGroup(registeredGroup)
+            .hasElements()
+            .flatMap(hasRemainingEvents -> hasRemainingEvents
+                ? Mono.empty()
+                : 
cassandraEventDeadLettersGroupDAO.deleteGroup(registeredGroup));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to