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