You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Karl Pauls (JIRA)" <ji...@apache.org> on 2018/09/24 18:39:00 UTC

[jira] [Resolved] (FELIX-5942) Felix Framework freezes when resolving classes in parallel with Java 10

     [ https://issues.apache.org/jira/browse/FELIX-5942?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Karl Pauls resolved FELIX-5942.
-------------------------------
       Resolution: Fixed
    Fix Version/s: framework-6.0.2

[~antoine.dessaigne], it looks like newer jdk versions have a changed behaviour when it comes to fairness and synchronized. Good catch - I applied a modified version of your patch that uses only one condition but sets the the lock to be fair. It seems to work with your test. 

Feel free to reopen this issue if it doesn't work for you. Many thanks for reporting and providing the patch!

> Felix Framework freezes when resolving classes in parallel with Java 10
> -----------------------------------------------------------------------
>
>                 Key: FELIX-5942
>                 URL: https://issues.apache.org/jira/browse/FELIX-5942
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-6.0.1
>            Reporter: Antoine DESSAIGNE
>            Assignee: Karl Pauls
>            Priority: Major
>             Fix For: framework-6.0.2
>
>         Attachments: ConcurrentClassLoaderTest.java
>
>
> Hello.
> When resolving a class in parallel in Java 10, you end up with a freeze.
> You end up with threads beeing blocked
> {noformat}
> "Thread-99" #121 prio=5 os_prio=0 tid=0x000001bdaf679000 nid=0x69d4 in Object.wait()  [0x000000296d0fe000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
> 	at java.lang.Object.wait(java.base@10.0.2/Native Method)
> 	- waiting on <0x00000006c931dd20> (a [Ljava.lang.Object;)
> 	at java.lang.Object.wait(java.base@10.0.2/Object.java:328)
> 	at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:4301)
> 	- waiting to re-lock in wait() <0x00000006c931dd20> (a [Ljava.lang.Object;)
> 	at org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:413)
> 	at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3318)
> 	at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1618)
> 	at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978)
> 	at org.apache.felix.framework.ConcurrentClassLoaderTest$1.run(ConcurrentClassLoaderTest.java:69){noformat}
> You'll find attached a test reproducing the issue : [^ConcurrentClassLoaderTest.java]
> Here's what you need to freeze felix :
>  * Lots of threads trying to acquire the global lock
>  ** here we're resolving a class from a bundle with dynamic import packages
>  * An Oracle JDK 10 or OpenJDK 11
>  ** it's working fine with Oracle JDK 8
>  
> Replacing the {{m_bundleLock}} by a fair {{ReentrantLock}} with a {{Condition}} makes it work with 10 parallel threads but still fails with 100 threads.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)