This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 1d07e3170074d50cc5f2665b7d376075513abc1f Author: Rémi Kowalski <[email protected]> AuthorDate: Tue Mar 19 11:47:07 2019 +0100 JAMES-2691 record metrics only for event not ignored by listener --- .../james/mailbox/events/MailboxListener.java | 5 ++++ .../james/mailbox/MailboxManagerStressTest.java | 1 - .../mailbox/events/ErrorHandlingContract.java | 5 ++++ .../james/mailbox/events/EventBusTestFixture.java | 10 +++++++ .../apache/james/mailbox/events/GroupContract.java | 5 ++++ .../apache/james/mailbox/util/EventCollector.java | 5 ++++ .../caching/CacheInvalidatingMailboxListener.java | 6 +++- .../cassandra/MailboxOperationLoggingListener.java | 5 ++++ .../mailbox/events/delivery/InVmEventDelivery.java | 32 ++++++++++++---------- .../mailbox/events/MailboxListenerExecutor.java | 26 +++++++++++------- .../events/ElasticSearchQuotaMailboxListener.java | 18 +++++++----- .../mailbox/spamassassin/SpamAssassinListener.java | 8 +++++- .../store/quota/ListeningCurrentQuotaUpdater.java | 29 ++++++++++++-------- .../store/search/ListeningMessageSearchIndex.java | 27 +++++++++--------- .../apache/james/imap/processor/IdleProcessor.java | 7 +++-- .../james/modules/mailbox/NoopMailboxListener.java | 6 ++++ 16 files changed, 134 insertions(+), 61 deletions(-) diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java index dbd44cf..364968b 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java @@ -63,6 +63,11 @@ public interface MailboxListener { return ExecutionMode.SYNCHRONOUS; } + + default boolean isHandling(Event event) { + return true; + } + /** * Informs this listener about the given event. * diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java index 544e1fe..608fa24 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java @@ -89,7 +89,6 @@ public abstract class MailboxManagerStressTest<T extends MailboxManager> { return; } - try { MailboxSession mailboxSession = mailboxManager.createSystemSession(username); diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/ErrorHandlingContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/ErrorHandlingContract.java index b246c82..c6f4494 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/ErrorHandlingContract.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/ErrorHandlingContract.java @@ -52,6 +52,11 @@ interface ErrorHandlingContract extends EventBusContract { } @Override + public boolean isHandling(Event event) { + return true; + } + + @Override public void event(Event event) { timeElapsed.add(Instant.now()); throw new RuntimeException("throw to trigger reactor retry"); diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java index c655cbd..3156d00 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java @@ -44,6 +44,11 @@ public interface EventBusTestFixture { private final AtomicInteger calls = new AtomicInteger(0); @Override + public boolean isHandling(Event event) { + return true; + } + + @Override public void event(Event event) { calls.incrementAndGet(); } @@ -61,6 +66,11 @@ public interface EventBusTestFixture { } @Override + public boolean isHandling(Event event) { + return true; + } + + @Override public void event(Event event) { if (eventsCauseThrowing.contains(event)) { throw new RuntimeException("event triggers throwing"); diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java index 87c5a2d..2ba6686 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java @@ -72,6 +72,11 @@ public interface GroupContract { } @Override + public boolean isHandling(Event event) { + return true; + } + + @Override public void event(Event event) throws Exception { if (nbCalls.get() - finishedExecutions.get() > EventBus.EXECUTION_RATE) { rateExceeded.set(true); diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java b/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java index 80d0d97..a195beb 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java @@ -43,6 +43,11 @@ public class EventCollector implements MailboxListener.GroupMailboxListener { } @Override + public boolean isHandling(Event event) { + return true; + } + + @Override public void event(Event event) { events.add(event); } diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java index d911604..6612d6c 100644 --- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java +++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CacheInvalidatingMailboxListener.java @@ -41,10 +41,14 @@ public class CacheInvalidatingMailboxListener implements MailboxListener.GroupMa eventBus.register(this); } + @Override + public boolean isHandling(Event event) { + return event instanceof MailboxEvent; + } @Override public void event(Event event) { - if (event instanceof MailboxEvent) { + if (isHandling(event)) { mailboxEvent((MailboxEvent) event); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java index 7e98f07..bcd44f0 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java @@ -45,6 +45,11 @@ public class MailboxOperationLoggingListener implements MailboxListener.GroupMai } @Override + public boolean isHandling(Event event) { + return event instanceof MailboxRenamed || event instanceof MailboxDeletion || event instanceof MailboxAdded; + } + + @Override public void event(Event event) { if (event instanceof MailboxRenamed) { MailboxRenamed mailboxRenamed = (MailboxRenamed) event; diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java index 6cdbe28..a45f36c 100644 --- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java +++ b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java @@ -37,7 +37,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; - import reactor.core.publisher.Mono; import reactor.core.publisher.MonoProcessor; import reactor.core.scheduler.Schedulers; @@ -83,22 +82,27 @@ public class InVmEventDelivery implements EventDelivery { } private void doDeliverToListener(MailboxListener mailboxListener, Event event) { - TimeMetric timer = metricFactory.timer(timerName(mailboxListener)); - try (Closeable mdc = MDCBuilder.create() - .addContext(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId()) - .addContext(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass()) - .addContext(EventBus.StructuredLoggingFields.USER, event.getUser()) - .addContext(EventBus.StructuredLoggingFields.LISTENER_CLASS, mailboxListener.getClass()) - .build()) { - - mailboxListener.event(event); - } catch (Exception e) { - throw new RuntimeException(e); - } finally { - timer.stopAndPublish(); + if (mailboxListener.isHandling(event)) { + TimeMetric timer = metricFactory.timer(timerName(mailboxListener)); + try (Closeable mdc = buildMDC(mailboxListener, event)) { + mailboxListener.event(event); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + timer.stopAndPublish(); + } } } + private Closeable buildMDC(MailboxListener mailboxListener, Event event) { + return MDCBuilder.create() + .addContext(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId()) + .addContext(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass()) + .addContext(EventBus.StructuredLoggingFields.USER, event.getUser()) + .addContext(EventBus.StructuredLoggingFields.LISTENER_CLASS, mailboxListener.getClass()) + .build(); + } + private StructuredLogger structuredLogger(Event event, MailboxListener mailboxListener) { return MDCStructuredLogger.forLogger(LOGGER) .addField(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId()) diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java index 9a7fd33..70783e7 100644 --- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java +++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java @@ -35,16 +35,22 @@ public class MailboxListenerExecutor { } void execute(MailboxListener listener, MDCBuilder mdcBuilder, Event event) throws Exception { - TimeMetric timer = metricFactory.timer(timerName(listener)); - try (Closeable mdc = mdcBuilder - .addContext(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId()) - .addContext(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass()) - .addContext(EventBus.StructuredLoggingFields.USER, event.getUser()) - .addContext(EventBus.StructuredLoggingFields.LISTENER_CLASS, listener.getClass()) - .build()) { - listener.event(event); - } finally { - timer.stopAndPublish(); + if (listener.isHandling(event)) { + TimeMetric timer = metricFactory.timer(timerName(listener)); + try (Closeable mdc = buildMDC(listener, mdcBuilder, event)) { + listener.event(event); + } finally { + timer.stopAndPublish(); + } } } + + private Closeable buildMDC(MailboxListener listener, MDCBuilder mdcBuilder, Event event) { + return mdcBuilder + .addContext(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId()) + .addContext(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass()) + .addContext(EventBus.StructuredLoggingFields.USER, event.getUser()) + .addContext(EventBus.StructuredLoggingFields.LISTENER_CLASS, listener.getClass()) + .build(); + } } diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java index d58ca2e..2b828f2 100644 --- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java +++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java @@ -32,7 +32,8 @@ import org.apache.james.quota.search.elasticsearch.json.QuotaRatioToElasticSearc import com.fasterxml.jackson.core.JsonProcessingException; public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupMailboxListener { - public static class ElasticSearchQuotaMailboxListenerGroup extends Group {} + public static class ElasticSearchQuotaMailboxListenerGroup extends Group { + } private static final Group GROUP = new ElasticSearchQuotaMailboxListenerGroup(); @@ -41,8 +42,8 @@ public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupM @Inject public ElasticSearchQuotaMailboxListener( - @Named(QuotaRatioElasticSearchConstants.InjectionNames.QUOTA_RATIO) ElasticSearchIndexer indexer, - QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson) { + @Named(QuotaRatioElasticSearchConstants.InjectionNames.QUOTA_RATIO) ElasticSearchIndexer indexer, + QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson) { this.indexer = indexer; this.quotaRatioToElasticSearchJson = quotaRatioToElasticSearchJson; } @@ -53,14 +54,17 @@ public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupM } @Override + public boolean isHandling(Event event) { + return event instanceof QuotaUsageUpdatedEvent; + } + + @Override public void event(Event event) throws JsonProcessingException { - if (event instanceof QuotaUsageUpdatedEvent) { - handleEvent(event.getUser(), (QuotaUsageUpdatedEvent) event); - } + handleEvent(event.getUser(), (QuotaUsageUpdatedEvent) event); } private void handleEvent(User user, QuotaUsageUpdatedEvent event) throws JsonProcessingException { indexer.index(user.asString(), - quotaRatioToElasticSearchJson.convertToJson(user.asString(), event)); + quotaRatioToElasticSearchJson.convertToJson(user.asString(), event)); } } diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java index 78bddc9..c4d35fa 100644 --- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java +++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java @@ -82,12 +82,18 @@ public class SpamAssassinListener implements SpamEventListener { } @Override + public boolean isHandling(Event event) { + return event instanceof MessageMoveEvent || event instanceof Added; + } + + @Override public void event(Event event) throws MailboxException { - MailboxSession session = mailboxManager.createSystemSession(getClass().getCanonicalName()); if (event instanceof MessageMoveEvent) { + MailboxSession session = mailboxManager.createSystemSession(getClass().getCanonicalName()); handleMessageMove(event, session, (MessageMoveEvent) event); } if (event instanceof Added) { + MailboxSession session = mailboxManager.createSystemSession(getClass().getCanonicalName()); handleAdded(event, session, (Added) event); } } diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java index 8196958..e10d571 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java @@ -60,19 +60,24 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo } @Override + public boolean isHandling(Event event) { + return event instanceof Added || event instanceof Expunged || event instanceof MailboxDeletion; + } + + @Override public void event(Event event) throws MailboxException { - if (event instanceof Added) { - Added addedEvent = (Added) event; - QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(addedEvent.getMailboxId()); - handleAddedEvent(addedEvent, quotaRoot); - } else if (event instanceof Expunged) { - Expunged expungedEvent = (Expunged) event; - QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(expungedEvent.getMailboxId()); - handleExpungedEvent(expungedEvent, quotaRoot); - } else if (event instanceof MailboxDeletion) { - MailboxDeletion mailboxDeletionEvent = (MailboxDeletion) event; - handleMailboxDeletionEvent(mailboxDeletionEvent); - } + if (event instanceof Added) { + Added addedEvent = (Added) event; + QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(addedEvent.getMailboxId()); + handleAddedEvent(addedEvent, quotaRoot); + } else if (event instanceof Expunged) { + Expunged expungedEvent = (Expunged) event; + QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(expungedEvent.getMailboxId()); + handleExpungedEvent(expungedEvent, quotaRoot); + } else if (event instanceof MailboxDeletion) { + MailboxDeletion mailboxDeletionEvent = (MailboxDeletion) event; + handleMailboxDeletionEvent(mailboxDeletionEvent); + } } private void handleExpungedEvent(Expunged expunged, QuotaRoot quotaRoot) throws MailboxException { 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 510c4cf..6cea2d4 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 @@ -43,8 +43,6 @@ import com.google.common.collect.ImmutableList; /** * {@link MessageSearchIndex} which needs to get registered as global {@link MailboxListener} and so get * notified about message changes. This will then allow to update the underlying index. - * - * */ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, MailboxListener.GroupMailboxListener { private static final Logger LOGGER = LoggerFactory.getLogger(ListeningMessageSearchIndex.class); @@ -59,17 +57,20 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, this.sessionProvider = sessionProvider; } + @Override + public boolean isHandling(Event event) { + return INTERESTING_EVENTS.contains(event.getClass()); + } + /** * Process the {@link Event} and update the index if * something relevant is received */ @Override public void event(Event event) throws Exception { - if (INTERESTING_EVENTS.contains(event.getClass())) { - handleMailboxEvent(event, - sessionProvider.createSystemSession(event.getUser().asString()), - (MailboxEvent) event); - } + handleMailboxEvent(event, + sessionProvider.createSystemSession(event.getUser().asString()), + (MailboxEvent) event); } private void handleMailboxEvent(Event event, MailboxSession session, MailboxEvent mailboxEvent) throws Exception { @@ -98,7 +99,7 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, private Stream<MailboxMessage> retrieveMailboxMessages(MailboxSession session, Mailbox mailbox, MessageRange range) { try { return Iterators.toStream(factory.getMessageMapper(session) - .findInMailbox(mailbox, range, FetchType.Full, UNLIMITED)); + .findInMailbox(mailbox, range, FetchType.Full, UNLIMITED)); } catch (Exception e) { LOGGER.error("Could not retrieve message {} in mailbox {}", range.toString(), mailbox.getMailboxId().serialize(), e); return Stream.empty(); @@ -117,8 +118,8 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, /** * Delete the concerned UIDs for the given {@link Mailbox} from the index * - * @param session The mailbox session performing the expunge - * @param mailbox mailbox on which the expunge was performed + * @param session The mailbox session performing the expunge + * @param mailbox mailbox on which the expunge was performed * @param expungedUids UIDS to be deleted */ public abstract void delete(MailboxSession session, Mailbox mailbox, Collection<MessageUid> expungedUids) throws Exception; @@ -130,12 +131,12 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, * @param mailbox mailbox on which the expunge was performed */ public abstract void deleteAll(MailboxSession session, Mailbox mailbox) throws Exception; - + /** * Update the messages concerned by the updated flags list for the given {@link Mailbox} * - * @param session session that performed the update - * @param mailbox mailbox containing the updated messages + * @param session session that performed the update + * @param mailbox mailbox containing the updated messages * @param updatedFlagsList list of flags that were updated */ public abstract void update(MailboxSession session, Mailbox mailbox, List<UpdatedFlags> updatedFlagsList) throws Exception; diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java index 3ef9ab3..6569fa1 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java @@ -170,10 +170,13 @@ public class IdleProcessor extends AbstractMailboxProcessor<IdleRequest> impleme } @Override + public boolean isHandling(Event event) { + return event instanceof Added || event instanceof Expunged || event instanceof FlagsUpdated; + } + + @Override public void event(Event event) { - if (event instanceof Added || event instanceof Expunged || event instanceof FlagsUpdated) { unsolicitedResponses(session, responder, false); - } } @Override diff --git a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java index 7c97c37..2ef25e4 100644 --- a/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java +++ b/server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java @@ -32,6 +32,12 @@ public class NoopMailboxListener implements MailboxListener.GroupMailboxListener return GROUP; } + + @Override + public boolean isHandling(Event event) { + return true; + } + @Override public void event(Event event) { } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
