[ 
https://issues.apache.org/jira/browse/IGNITE-25385?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17951783#comment-17951783
 ] 

Aleksandr commented on IGNITE-25385:
------------------------------------

LGTM

> TransactionExpirationRegistry is not thread-safe
> ------------------------------------------------
>
>                 Key: IGNITE-25385
>                 URL: https://issues.apache.org/jira/browse/IGNITE-25385
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Roman Puchkovskiy
>            Assignee: Roman Puchkovskiy
>            Priority: Major
>              Labels: ignite-3
>         Attachments: 
> _Run_Unit_Tests_auto-generated_Run_Unit_Tests_3_41493.log.zip
>
>
> TransactionExpirationRegistryConcurrentTest.registerExpireUnregister failed:
>  
> java.lang.RuntimeException: Thread did not finish in time.
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistryConcurrentTest$Worker.waitFinished(TransactionExpirationRegistryConcurrentTest.java:146)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistryConcurrentTest.lambda$registerExpireUnregister$0(TransactionExpirationRegistryConcurrentTest.java:65)
>   at java.base/java.lang.Iterable.forEach(Iterable.java:75)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistryConcurrentTest.registerExpireUnregister(TransactionExpirationRegistryConcurrentTest.java:65)
>   at java.base/java.lang.reflect.Method.invoke(Method.java:568)
>   at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
>   at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
> ------- Stderr: -------
> Exception in thread "Thread-7" java.util.NoSuchElementException
>   at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1599)
>   at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1620)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistry.lambda$unregister$2(TransactionExpirationRegistry.java:163)
>   at 
> java.base/java.util.concurrent.ConcurrentSkipListMap.computeIfPresent(ConcurrentSkipListMap.java:1487)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistry.unregister(TransactionExpirationRegistry.java:157)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistryConcurrentTest$Worker.lambda$run$0(TransactionExpirationRegistryConcurrentTest.java:120)
>   at java.base/java.lang.Thread.run(Thread.java:833)
> Exception in thread "Thread-8" java.util.NoSuchElementException
>   at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1599)
>   at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1620)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistry.lambda$unregister$2(TransactionExpirationRegistry.java:163)
>   at 
> java.base/java.util.concurrent.ConcurrentSkipListMap.computeIfPresent(ConcurrentSkipListMap.java:1487)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistry.unregister(TransactionExpirationRegistry.java:157)
>   at 
> org.apache.ignite.internal.tx.impl.TransactionExpirationRegistryConcurrentTest$Worker.lambda$run$0(TransactionExpirationRegistryConcurrentTest.java:120)
>   at java.base/java.lang.Thread.run(Thread.java:833)
>  
> It seems that this is caused by the fact that updates of txsByExpirationTime 
> are not thread-safe. This map is ConcurrentSkipListMap, its values are 
> HashSet instances. The outer map does not guarantee atomical application of 
> functions at compute() and computeIfPresent() (which we use), so they modify 
> the values (which might be HashSets) concurrently.
> One way to solve the problem is to make the value maps concurrent.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to