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