From ede7834cb8910403a61b42b8d850978cfbb4d8a1 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 17 Aug 2024 23:26:42 +0200 Subject: [PATCH] configurable filtering expression evaluation timeout --- .../main/java/com/commafeed/CommaFeedConfiguration.java | 6 ++++++ .../backend/service/FeedEntryFilteringService.java | 5 ++++- .../backend/service/FeedEntryFilteringServiceTest.java | 9 ++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java b/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java index 033c4c8a..cc016038 100644 --- a/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java +++ b/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java @@ -167,6 +167,12 @@ public interface CommaFeedConfiguration { */ @WithDefault("0") Duration userInactivityPeriod(); + + /** + * Duration after which the evaluation of a filtering expresion to mark an entry as read is considered to have timed out. + */ + @WithDefault("500ms") + Duration filteringExpressionEvaluationTimeout(); } interface Database { diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryFilteringService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryFilteringService.java index 6832c58a..dd8857d6 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryFilteringService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedEntryFilteringService.java @@ -23,6 +23,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.LogFactory; import org.jsoup.Jsoup; +import com.commafeed.CommaFeedConfiguration; import com.commafeed.backend.model.FeedEntry; import jakarta.inject.Singleton; @@ -35,6 +36,7 @@ public class FeedEntryFilteringService { private static final JexlEngine ENGINE = initEngine(); private final ExecutorService executor = Executors.newCachedThreadPool(); + private final CommaFeedConfiguration config; private static JexlEngine initEngine() { // classloader that prevents object creation @@ -96,8 +98,9 @@ public class FeedEntryFilteringService { Future future = executor.submit(callable); Object result; try { - result = future.get(500, TimeUnit.MILLISECONDS); + result = future.get(config.feedRefresh().filteringExpressionEvaluationTimeout().toMillis(), TimeUnit.MILLISECONDS); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new FeedEntryFilterException("interrupted while evaluating expression " + filter, e); } catch (ExecutionException e) { throw new FeedEntryFilterException("Exception while evaluating expression " + filter, e); diff --git a/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryFilteringServiceTest.java b/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryFilteringServiceTest.java index 5987dd07..34b1dd11 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryFilteringServiceTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/service/FeedEntryFilteringServiceTest.java @@ -1,9 +1,13 @@ package com.commafeed.backend.service; +import java.time.Duration; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import com.commafeed.CommaFeedConfiguration; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryContent; import com.commafeed.backend.service.FeedEntryFilteringService.FeedEntryFilterException; @@ -16,7 +20,10 @@ class FeedEntryFilteringServiceTest { @BeforeEach public void init() { - service = new FeedEntryFilteringService(); + CommaFeedConfiguration config = Mockito.mock(CommaFeedConfiguration.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(config.feedRefresh().filteringExpressionEvaluationTimeout()).thenReturn(Duration.ofSeconds(2)); + + service = new FeedEntryFilteringService(config); entry = new FeedEntry(); entry.setUrl("https://github.com/Athou/commafeed");