You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/05/31 01:53:49 UTC

[10/14] james-project git commit: MAILBOX-338 Test CachingTextExtractor concurrency

MAILBOX-338 Test CachingTextExtractor concurrency


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f63e5d87
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f63e5d87
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f63e5d87

Branch: refs/heads/master
Commit: f63e5d87cc3928ed1d6d95807c4b3e9044ec1aeb
Parents: 6b00971
Author: benwa <bt...@linagora.com>
Authored: Tue May 29 17:36:29 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu May 31 08:53:16 2018 +0700

----------------------------------------------------------------------
 .../james/mailbox/tika/CachingTextExtractor.java  | 18 ++++++++++++------
 .../mailbox/tika/CachingTextExtractorTest.java    | 15 +++++++++++++++
 2 files changed, 27 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f63e5d87/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/CachingTextExtractor.java
----------------------------------------------------------------------
diff --git a/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/CachingTextExtractor.java b/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/CachingTextExtractor.java
index e2e122b..b0bae1f 100644
--- a/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/CachingTextExtractor.java
+++ b/mailbox/tika/src/main/java/org/apache/james/mailbox/tika/CachingTextExtractor.java
@@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.time.Duration;
 import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.codec.digest.DigestUtils;
@@ -114,14 +115,19 @@ public class CachingTextExtractor implements TextExtractor {
         byte[] bytes = IOUtils.toByteArray(inputStream);
         String key = DigestUtils.sha256Hex(bytes);
 
-        ParsedContent cachedValue = cache.getIfPresent(key);
-        if (cachedValue != null) {
-            return cachedValue;
+        try {
+            return cache.get(key,
+                () -> underlying.extractContent(new ByteArrayInputStream(bytes), contentType));
+        } catch (ExecutionException e) {
+            throw unwrap(e);
         }
+    }
 
-        ParsedContent realValue = underlying.extractContent(new ByteArrayInputStream(bytes), contentType);
-        cache.put(key, realValue);
-        return realValue;
+    private Exception unwrap(Exception e) {
+        return Optional.ofNullable(e.getCause())
+            .filter(throwable -> throwable instanceof Exception)
+            .map(throwable -> (Exception) throwable)
+            .orElse(e);
     }
 
     @VisibleForTesting

http://git-wip-us.apache.org/repos/asf/james-project/blob/f63e5d87/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/CachingTextExtractorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/CachingTextExtractorTest.java b/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/CachingTextExtractorTest.java
index 5c0ebad..637bedb 100644
--- a/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/CachingTextExtractorTest.java
+++ b/mailbox/tika/src/test/java/org/apache/james/mailbox/tika/CachingTextExtractorTest.java
@@ -34,6 +34,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.IntStream;
@@ -42,7 +43,9 @@ import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.metrics.api.NoopGaugeRegistry;
 import org.apache.james.metrics.api.NoopMetricFactory;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.RepeatedTest;
 import org.junit.jupiter.api.Test;
 
 import com.github.fge.lambdas.Throwing;
@@ -179,4 +182,16 @@ public class CachingTextExtractorTest {
         verifyZeroInteractions(wrappedTextExtractor);
     }
 
+    @RepeatedTest(10)
+    void concurrentValueComputationShouldNotLeadToDuplicatedBackendAccess() throws Exception {
+        int concurrentThreadCount = 10;
+        int operationCount = 1;
+        new ConcurrentTestRunner(concurrentThreadCount, operationCount,
+            (a, b) -> textExtractor.extractContent(INPUT_STREAM.get(), CONTENT_TYPE))
+            .run()
+            .awaitTermination(1, TimeUnit.MINUTES);
+
+        verify(wrappedTextExtractor, times(1)).extractContent(any(), any());
+    }
+
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org