[ https://issues.apache.org/jira/browse/IGNITE-25385?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Roman Puchkovskiy updated IGNITE-25385: --------------------------------------- Description: 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 updates are not thread-safe. This map is ConcurrentSkipListMap, its values are HashMap 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 HashMaps) concurrently. One way to solve the problem is to make the value maps concurrent. > 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 > updates are not thread-safe. This map is ConcurrentSkipListMap, its values > are HashMap 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 HashMaps) 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)