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

Reply via email to