[
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)