[
https://issues.apache.org/jira/browse/TIKA-4393?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17935331#comment-17935331
]
Hudson commented on TIKA-4393:
------------------------------
SUCCESS: Integrated in Jenkins build Tika » tika-main-jdk17 #659 (See
[https://ci-builds.apache.org/job/Tika/job/tika-main-jdk17/659/])
TIKA-4393 (#2163) (github:
[https://github.com/apache/tika/commit/933fae954da025f62d147b367c1a16494e883925])
* (edit) tika-xmp/src/main/java/org/apache/tika/xmp/convert/TikaToXMP.java
* (edit) tika-xmp/src/test/java/org/apache/tika/xmp/TikaToXMPTest.java
* (edit) CHANGES.txt
> Thread-safety issue in TikaToXMP.getConverterMap()
> --------------------------------------------------
>
> Key: TIKA-4393
> URL: https://issues.apache.org/jira/browse/TIKA-4393
> Project: Tika
> Issue Type: Bug
> Components: tika-app
> Affects Versions: 2.9.3, 3.1.0
> Environment: java 8, fedora 3.9, tika 2.9.3
> Reporter: Ghiles OUAREZKI
> Priority: Minor
> Fix For: 4.0.0, 3.1.1, 2.9.4
>
>
> h2. Description:
> We execute TikaToXmp conversion in a multithreaded environment where we call
> multiple conversion at the same time. According to new parser contribution
> guide, there is nothing about thread-safety. During our test, a thread-safety
> issue has been found in the getConverterMap() method of the TikaToXMP class
> in the tika-xmp module.
>
> We are currently using the 2.9.3 version. We checked in the latest version
> and we think the behavior is the same.
> h2. Problem:
> The method manipulates the static class variable converterMap, but it is not
> thread-safe. Since there is no synchronization mechanism, multiple threads
> can enter getConverterMap() at the same time and create different instances
> of converterMap, leading to potential race conditions.
> Current code:
> {code:java}
> private static Map<MediaType, Class<? extends ITikaToXMPConverter>>
> converterMap;
> private static Map<MediaType, Class<? extends ITikaToXMPConverter>>
> getConverterMap() {
> if (converterMap == null) {
> converterMap = new HashMap<>();
> initialize();
> }
> return converterMap;
> }
> {code}
> If multiple threads call getConverterMap() simultaneously when converterMap
> is still null, they might create multiple instances of converterMap, which
> can lead to unexpected behavior.
> h2.
> Potential solution:
> To ensure thread safety, we offer a simple patch : to synchronize
> getConverterMap() so that only one thread can initialize converterMap at a
> time. The fix consists of adding the *synchronized* keyword to the method:
> {code:java}
> private static synchronized Map<MediaType, Class<? extends
> ITikaToXMPConverter>> getConverterMap() {
> if (converterMap == null) {
> converterMap = new HashMap<>();
> initialize();
> }
> return converterMap;
> }{code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)