Benjamin Rogge created FELIX-4523: ------------------------------------- Summary: Deadlock in URLHandlers when Felix.init and Felix.stop are called concurrently Key: FELIX-4523 URL: https://issues.apache.org/jira/browse/FELIX-4523 Project: Felix Issue Type: Bug Components: Framework Affects Versions: framework-4.2.1 Environment: linux, junittests Reporter: Benjamin Rogge
>From time to time we are experiencing a deadlock in the URLHandlers Class in >Apache Felix. We are using Felix as an embedded OSGi Container and instantiate >the Felix Framework via ServiceLoader and Framework Factory ourselves. The >situation is as follows: When Felix.stop and Felix.init are called by >different threads, eventually >URLHandlers.unregisterFrameworkListsForContextSearch and >URLHandlers.registerFrameworkInstance are called by the threads. There are two >locks: m_frameworks and the Class Object of URL (URL.class). >registerFrameworkInstance tries to aquire m_frameworks first and via the >constructor of URLHanders URL.class after that. >unregisterFrameworkListsForContextSearch tries to aquire URL.class first and >m_frameworks after that. This is a classic deadlock situation. The situation >arises in unittests where we frequently start and stop the felix framework. Stacktracke log: {code} Found one Java-level deadlock: ============================= "FelixShutdown": waiting to lock monitor 0x0000000000ff7710 (object 0x00000007ff33e7f0, a java.util.ArrayList), which is held by "main" "main": waiting to lock monitor 0x00000000022c4a08 (object 0x0000000783b06b18, a java.lang.Class), which is held by "FelixShutdown" Java stack information for the threads listed above: =================================================== "FelixShutdown": at org.apache.felix.framework.URLHandlers.unregisterFrameworkListsForContextSearch(URLHandlers.java:315) - waiting to lock <0x00000007ff33e7f0> (a java.util.ArrayList) - locked <0x00000007ff33e840> (a java.util.HashMap) - locked <0x0000000783b06b18> (a java.lang.Class for java.net.URL) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.felix.framework.util.SecureAction.invoke(SecureAction.java:840) at org.apache.felix.framework.URLHandlers.unregisterFrameworkInstance(URLHandlers.java:635) at org.apache.felix.framework.URLHandlersActivator.stop(URLHandlersActivator.java:76) at org.apache.felix.framework.util.SecureAction.stopActivator(SecureAction.java:667) at org.apache.felix.framework.Felix$SystemBundleActivator.stop(Felix.java:4715) at org.apache.felix.framework.util.SecureAction.stopActivator(SecureAction.java:667) at org.apache.felix.framework.Felix.stopBundle(Felix.java:2530) at org.apache.felix.framework.Felix$2.run(Felix.java:959) at java.lang.Thread.run(Thread.java:724) "main": at org.apache.felix.framework.URLHandlers.<init>(URLHandlers.java:150) - waiting to lock <0x0000000783b06b18> (a java.lang.Class for java.net.URL) at org.apache.felix.framework.URLHandlers.registerFrameworkInstance(URLHandlers.java:600) - locked <0x00000007ff33e7f0> (a java.util.ArrayList) at org.apache.felix.framework.URLHandlersActivator.start(URLHandlersActivator.java:71) at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645) at org.apache.felix.framework.Felix$SystemBundleActivator.start(Felix.java:4634) at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645) at org.apache.felix.framework.Felix.init(Felix.java:783) {code} -- This message was sent by Atlassian JIRA (v6.2#6252)