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]
