[ 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 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. was: 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 > 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)