You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Carsten Ziegeler (JIRA)" <ji...@apache.org> on 2010/07/05 08:43:53 UTC

[jira] Closed: (FELIX-836) Deadlocks caused by Declarative Services

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

Carsten Ziegeler closed FELIX-836.
----------------------------------


> Deadlocks caused by Declarative Services
> ----------------------------------------
>
>                 Key: FELIX-836
>                 URL: https://issues.apache.org/jira/browse/FELIX-836
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-1.0.6
>            Reporter: Felix Meschberger
>            Assignee: Felix Meschberger
>             Fix For: scr-1.0.8
>
>         Attachments: FELIX-836.patch
>
>
> We experience deadlocks with Declarative Services every now and then related to the interaction between the framework and SCR. The situation most often happens when multiple bundles are uptated and packages are refreshed.
> One thread involved is the "SCR Component Actor" thread, which is the thread of SCR running asynchronous operations on registered components. The other thread is the framework PackageAdmin thread which stops and starts bundles during refresh:
> ---- thread dump excerpt ----
> "SCR Component Actor" daemon prio=5 tid=0x0107f9c0 nid=0xab2400 in Object.wait() [0xb18a2000..0xb18a2d90]
> 	at java.lang.Object.wait(Native Method)
> 	- waiting on <0x075e2d58> (a [Ljava.lang.Object;)
> 	at java.lang.Object.wait(Object.java:474)
> 	at org.apache.felix.framework.Felix.acquireBundleLock(Felix.java:4167)
> 	- locked <0x075e2d58> (a [Ljava.lang.Object;)
> 	at org.apache.felix.framework.Felix.registerService(Felix.java:2665)
> 	at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:254)
> 	at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:232)
> 	at org.apache.sling.scripting.core.impl.ScriptEngineConsolePlugin.activate(ScriptEngineConsolePlugin.java:171)
> 	at org.apache.sling.scripting.core.impl.ScriptEngineConsolePlugin.initPlugin(ScriptEngineConsolePlugin.java:52)
> 	at org.apache.sling.scripting.core.impl.SlingScriptAdapterFactory.activate(SlingScriptAdapterFactory.java:223)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:585)
> 	at org.apache.felix.scr.impl.ImmediateComponentManager.createImplementationObject(ImmediateComponentManager.java:226)
> 	at org.apache.felix.scr.impl.ImmediateComponentManager.createComponent(ImmediateComponentManager.java:133)
> 	at org.apache.felix.scr.impl.AbstractComponentManager.activateInternal(AbstractComponentManager.java:476)
> 	- locked <0x0976ca30> (a org.apache.felix.scr.impl.ImmediateComponentManager)
> 	at org.apache.felix.scr.impl.AbstractComponentManager.enableInternal(AbstractComponentManager.java:398)
> 	at org.apache.felix.scr.impl.AbstractComponentManager.access$000(AbstractComponentManager.java:36)
> 	at org.apache.felix.scr.impl.AbstractComponentManager$1.run(AbstractComponentManager.java:99)
> 	at org.apache.felix.scr.impl.ComponentActorThread.run(ComponentActorThread.java:85)
> "FelixPackageAdmin" daemon prio=5 tid=0x0106f330 nid=0xaad000 waiting for monitor entry [0xb171f000..0xb171fd90]
> 	at org.apache.felix.scr.impl.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:540)
> 	- waiting to lock <0x0976ca30> (a org.apache.felix.scr.impl.ImmediateComponentManager)
> 	at org.apache.felix.scr.impl.AbstractComponentManager.disableInternal(AbstractComponentManager.java:579)
> 	at org.apache.felix.scr.impl.AbstractComponentManager.disposeInternal(AbstractComponentManager.java:616)
> 	at org.apache.felix.scr.impl.AbstractComponentManager.dispose(AbstractComponentManager.java:272)
> 	at org.apache.felix.scr.impl.ImmediateComponentManager.dispose(ImmediateComponentManager.java:120)
> 	at org.apache.felix.scr.impl.BundleComponentActivator.dispose(BundleComponentActivator.java:258)
> 	at org.apache.felix.scr.impl.Activator.disposeComponents(Activator.java:264)
> 	at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:177)
> 	at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:690)
> 	at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:619)
> 	at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:532)
> 	at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:3601)
> 	at org.apache.felix.framework.Felix._stopBundle(Felix.java:1989)
> 	at org.apache.felix.framework.Felix.stopBundle(Felix.java:1954)
> 	at org.apache.felix.framework.Felix$RefreshHelper.stop(Felix.java:3972)
> 	at org.apache.felix.framework.Felix.refreshPackages(Felix.java:3257)
> 	at org.apache.felix.framework.PackageAdminImpl.run(PackageAdminImpl.java:259)
> 	at java.lang.Thread.run(Thread.java:613)
> ---- thread dump excerpt ----
> The problem is that on the one hand we need some kind of synchronization inside SCR and on the other hand SCR has a synchronous bundle listener. This is used to hear about started bundles and bundles about to stop (which is the case in the PackageAdmin thread dump above). Since synchronous listeners are called synchronously while the framework is trying to change the bundle state, the framework bundle locks are held while the listener is called.
> To prevent this kind of deadlock the bundle listener should probably dispose off the components asynchronously while the framework is stopping the bundles.
> Looking at when components are being disabled, we find four situations:
> (1) A bundle is stopped and its components must be disposed off. This may be done in the SCR thread asynchronous to the actual bundle stop processing.
> (2) A factory configuration object of a ComponentFactory instance is deleted. This may also be done asynchronously because IMHO it is not time critical to dispose off an instance of a ComponentFactory in this situation.
> (3) A ComponentInstance explicitly disposed of by calling the ComponentInstance.dispose() method. This request must also be acted upon immediately and the component disposed off synchronously.
> (4) The Declarative Services bundle is stopped. Here we have to immediately dispose off all components in the system. We cannot do this asynchronously.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.