[
https://issues.apache.org/jira/browse/FELIX-3839?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jad Naous updated FELIX-3839:
-----------------------------
Description:
iPOJO grabs a number of locks during synchronous callbacks from the framework,
some in InstanceCreator and some in IPojoFactory. This can cause a repeatable
deadlock situation during service registration (which attempts to grab the
global felix framework lock, fixed in FELIX-3761) or during class resolution
(still a problem). iPOJO should not be grabbing any locks during callbacks from
the framework because those callbacks may be holding framework locks, and if
another thread invokes the framework while holding the same lock, a deadlock
will result. Below are stack traces two deadlock situations.
Here's the stack trace that causes the deadlock in the first situation, which
happens before FELIX-3761, but really shouldn't happen with or without that fix:
Daemon Thread [Thread-1] (Suspended)
Object.wait(long) line: not available [native method]
Object[](Object).wait() line: 485
Felix.acquireBundleLock(BundleImpl, int) line: 4871
Felix.registerService(BundleImpl, String[], Object, Dictionary) line:
3205
BundleContextImpl.registerService(String[], Object, Dictionary) line:
346
IPojoContext.registerService(String[], Object, Dictionary) line: 385
ProvidedService.registerService() line: 362
ProvidedServiceHandler.__M_stateChanged(int) line: 509
ProvidedServiceHandler.stateChanged(int) line: not available
InstanceManager.setState(int) line: 536
InstanceManager.start() line: 418
ComponentFactory.createInstance(Dictionary, IPojoContext,
HandlerManager[]) line: 179
ComponentFactory(IPojoFactory).createComponentInstance(Dictionary,
ServiceContext) line: 310
ComponentFactory(IPojoFactory).createComponentInstance(Dictionary)
line: 239
InstanceCreator$ManagedInstance.create(IPojoFactory) line: 355
InstanceCreator.addInstance(Dictionary, long) line: 89
Extender.parse(Bundle, String) line: 306
Extender.startManagementFor(Bundle) line: 237
Extender.access$600(Extender, Bundle) line: 52
Extender$CreatorThread.run() line: 769
Thread.run() line: 662
Daemon Thread [FelixFrameworkWiring] (Suspended)
InstanceCreator.removeInstancesFromBundle(long) line: 116
Extender.closeManagementFor(Bundle) line: 171
Extender.bundleChanged(BundleEvent) line: 153
EventDispatcher.invokeBundleListenerCallback(Bundle, EventListener,
EventObject) line: 868
EventDispatcher.fireEventImmediately(EventDispatcher, int, Map,
EventObject, Dictionary) line: 789
EventDispatcher.fireBundleEvent(BundleEvent, Framework) line: 514
Felix.fireBundleEvent(int, Bundle) line: 4244
Felix.stopBundle(BundleImpl, boolean) line: 2351
Felix$RefreshHelper.stop() line: 4629
Felix.refreshPackages(Collection, FrameworkListener[]) line: 3951
FrameworkWiringImpl.run() line: 172
Thread.run() line: 662
Here's the stack trace for the other situation caused by class resolution in
the framework:
Name: Thread-2
State: WAITING on [Ljava.lang.Object;@4a018e1b
Total blocked: 38,871,649 Total waited: 38,871,650
Stack trace:
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:485)
org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5033)
org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:451)
org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1578)
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1478)
org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1882)
java.lang.ClassLoader.loadClass(ClassLoader.java:247)
org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1356)
org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl.isAssignableTo(ServiceRegistrationImpl.java:548)
org.apache.felix.framework.util.Util.isServiceAssignable(Util.java:280)
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:916)
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4346)
org.apache.felix.framework.Felix.registerService(Felix.java:3356)
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
org.apache.felix.ipojo.IPojoFactory.start(IPojoFactory.java:613)
- locked org.apache.felix.ipojo.ComponentFactory@468034b6
org.apache.felix.ipojo.Extender.createAbstractFactory(Extender.java:520)
org.apache.felix.ipojo.Extender.parse(Extender.java:301)
org.apache.felix.ipojo.Extender.startManagementFor(Extender.java:237)
org.apache.felix.ipojo.Extender.access$600(Extender.java:52)
org.apache.felix.ipojo.Extender$CreatorThread.run(Extender.java:769)
java.lang.Thread.run(Thread.java:662)
Name: FelixFrameworkWiring
State: BLOCKED on org.apache.felix.ipojo.ComponentFactory@468034b6 owned by:
Thread-2
Total blocked: 7 Total waited: 1
Stack trace:
org.apache.felix.ipojo.IPojoFactory.removeFactoryStateListener(IPojoFactory.java:511)
org.apache.felix.ipojo.InstanceCreator.removeFactory(InstanceCreator.java:199)
org.apache.felix.ipojo.Extender.closeManagementFor(Extender.java:180)
org.apache.felix.ipojo.Extender.bundleChanged(Extender.java:153)
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:868)
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:789)
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:514)
org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4330)
org.apache.felix.framework.Felix.stopBundle(Felix.java:2451)
org.apache.felix.framework.Felix$RefreshHelper.stop(Felix.java:4715)
org.apache.felix.framework.Felix.refreshPackages(Felix.java:4037)
org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:178)
java.lang.Thread.run(Thread.java:662)
was:
iPOJO grabs a number of locks during synchronous callbacks from the framework,
some in InstanceCreator and some in IPojoFactory. This can cause a repeatable
deadlock situation during service registration (which attempts to grab the
global felix framework lock, fixed in FELIX-3761) or during class resolution
(still a problem). iPOJO should not be grabbing any locks during callbacks from
the framework because those callbacks may be holding framework locks, and if
another thread invokes the framework while holding the same lock, a deadlock
will result. Below are two deadlock situations.
Here's the stack trace that causes the deadlock in the first situation, which
happens before FELIX-3761, but really shouldn't happen with or without that fix:
Daemon Thread [Thread-1] (Suspended)
Object.wait(long) line: not available [native method]
Object[](Object).wait() line: 485
Felix.acquireBundleLock(BundleImpl, int) line: 4871
Felix.registerService(BundleImpl, String[], Object, Dictionary) line:
3205
BundleContextImpl.registerService(String[], Object, Dictionary) line:
346
IPojoContext.registerService(String[], Object, Dictionary) line: 385
ProvidedService.registerService() line: 362
ProvidedServiceHandler.__M_stateChanged(int) line: 509
ProvidedServiceHandler.stateChanged(int) line: not available
InstanceManager.setState(int) line: 536
InstanceManager.start() line: 418
ComponentFactory.createInstance(Dictionary, IPojoContext,
HandlerManager[]) line: 179
ComponentFactory(IPojoFactory).createComponentInstance(Dictionary,
ServiceContext) line: 310
ComponentFactory(IPojoFactory).createComponentInstance(Dictionary)
line: 239
InstanceCreator$ManagedInstance.create(IPojoFactory) line: 355
InstanceCreator.addInstance(Dictionary, long) line: 89
Extender.parse(Bundle, String) line: 306
Extender.startManagementFor(Bundle) line: 237
Extender.access$600(Extender, Bundle) line: 52
Extender$CreatorThread.run() line: 769
Thread.run() line: 662
Daemon Thread [FelixFrameworkWiring] (Suspended)
InstanceCreator.removeInstancesFromBundle(long) line: 116
Extender.closeManagementFor(Bundle) line: 171
Extender.bundleChanged(BundleEvent) line: 153
EventDispatcher.invokeBundleListenerCallback(Bundle, EventListener,
EventObject) line: 868
EventDispatcher.fireEventImmediately(EventDispatcher, int, Map,
EventObject, Dictionary) line: 789
EventDispatcher.fireBundleEvent(BundleEvent, Framework) line: 514
Felix.fireBundleEvent(int, Bundle) line: 4244
Felix.stopBundle(BundleImpl, boolean) line: 2351
Felix$RefreshHelper.stop() line: 4629
Felix.refreshPackages(Collection, FrameworkListener[]) line: 3951
FrameworkWiringImpl.run() line: 172
Thread.run() line: 662
Here's the stack trace for the other situation caused by class resolution in
the framework:
Name: Thread-2
State: WAITING on [Ljava.lang.Object;@4a018e1b
Total blocked: 38,871,649 Total waited: 38,871,650
Stack trace:
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:485)
org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5033)
org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:451)
org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1578)
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1478)
org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1882)
java.lang.ClassLoader.loadClass(ClassLoader.java:247)
org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1356)
org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl.isAssignableTo(ServiceRegistrationImpl.java:548)
org.apache.felix.framework.util.Util.isServiceAssignable(Util.java:280)
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:916)
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4346)
org.apache.felix.framework.Felix.registerService(Felix.java:3356)
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
org.apache.felix.ipojo.IPojoFactory.start(IPojoFactory.java:613)
- locked org.apache.felix.ipojo.ComponentFactory@468034b6
org.apache.felix.ipojo.Extender.createAbstractFactory(Extender.java:520)
org.apache.felix.ipojo.Extender.parse(Extender.java:301)
org.apache.felix.ipojo.Extender.startManagementFor(Extender.java:237)
org.apache.felix.ipojo.Extender.access$600(Extender.java:52)
org.apache.felix.ipojo.Extender$CreatorThread.run(Extender.java:769)
java.lang.Thread.run(Thread.java:662)
Name: FelixFrameworkWiring
State: BLOCKED on org.apache.felix.ipojo.ComponentFactory@468034b6 owned by:
Thread-2
Total blocked: 7 Total waited: 1
Stack trace:
org.apache.felix.ipojo.IPojoFactory.removeFactoryStateListener(IPojoFactory.java:511)
org.apache.felix.ipojo.InstanceCreator.removeFactory(InstanceCreator.java:199)
org.apache.felix.ipojo.Extender.closeManagementFor(Extender.java:180)
org.apache.felix.ipojo.Extender.bundleChanged(Extender.java:153)
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:868)
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:789)
org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:514)
org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4330)
org.apache.felix.framework.Felix.stopBundle(Felix.java:2451)
org.apache.felix.framework.Felix$RefreshHelper.stop(Felix.java:4715)
org.apache.felix.framework.Felix.refreshPackages(Felix.java:4037)
org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:178)
java.lang.Thread.run(Thread.java:662)
> iPOJO deadlocks on a bundle refresh
> -----------------------------------
>
> Key: FELIX-3839
> URL: https://issues.apache.org/jira/browse/FELIX-3839
> Project: Felix
> Issue Type: Bug
> Components: iPOJO
> Affects Versions: ipojo-core-1.8.4, ipojo-runtime-1.8.6
> Reporter: Jad Naous
>
> iPOJO grabs a number of locks during synchronous callbacks from the
> framework, some in InstanceCreator and some in IPojoFactory. This can cause a
> repeatable deadlock situation during service registration (which attempts to
> grab the global felix framework lock, fixed in FELIX-3761) or during class
> resolution (still a problem). iPOJO should not be grabbing any locks during
> callbacks from the framework because those callbacks may be holding framework
> locks, and if another thread invokes the framework while holding the same
> lock, a deadlock will result. Below are stack traces two deadlock situations.
> Here's the stack trace that causes the deadlock in the first situation, which
> happens before FELIX-3761, but really shouldn't happen with or without that
> fix:
> Daemon Thread [Thread-1] (Suspended)
> Object.wait(long) line: not available [native method]
> Object[](Object).wait() line: 485
> Felix.acquireBundleLock(BundleImpl, int) line: 4871
> Felix.registerService(BundleImpl, String[], Object, Dictionary) line:
> 3205
> BundleContextImpl.registerService(String[], Object, Dictionary) line:
> 346
> IPojoContext.registerService(String[], Object, Dictionary) line: 385
> ProvidedService.registerService() line: 362
> ProvidedServiceHandler.__M_stateChanged(int) line: 509
> ProvidedServiceHandler.stateChanged(int) line: not available
> InstanceManager.setState(int) line: 536
> InstanceManager.start() line: 418
> ComponentFactory.createInstance(Dictionary, IPojoContext,
> HandlerManager[]) line: 179
> ComponentFactory(IPojoFactory).createComponentInstance(Dictionary,
> ServiceContext) line: 310
> ComponentFactory(IPojoFactory).createComponentInstance(Dictionary)
> line: 239
> InstanceCreator$ManagedInstance.create(IPojoFactory) line: 355
> InstanceCreator.addInstance(Dictionary, long) line: 89
> Extender.parse(Bundle, String) line: 306
> Extender.startManagementFor(Bundle) line: 237
> Extender.access$600(Extender, Bundle) line: 52
> Extender$CreatorThread.run() line: 769
> Thread.run() line: 662
> Daemon Thread [FelixFrameworkWiring] (Suspended)
> InstanceCreator.removeInstancesFromBundle(long) line: 116
> Extender.closeManagementFor(Bundle) line: 171
> Extender.bundleChanged(BundleEvent) line: 153
> EventDispatcher.invokeBundleListenerCallback(Bundle, EventListener,
> EventObject) line: 868
> EventDispatcher.fireEventImmediately(EventDispatcher, int, Map,
> EventObject, Dictionary) line: 789
> EventDispatcher.fireBundleEvent(BundleEvent, Framework) line: 514
> Felix.fireBundleEvent(int, Bundle) line: 4244
> Felix.stopBundle(BundleImpl, boolean) line: 2351
> Felix$RefreshHelper.stop() line: 4629
> Felix.refreshPackages(Collection, FrameworkListener[]) line: 3951
> FrameworkWiringImpl.run() line: 172
> Thread.run() line: 662
> Here's the stack trace for the other situation caused by class resolution in
> the framework:
> Name: Thread-2
> State: WAITING on [Ljava.lang.Object;@4a018e1b
> Total blocked: 38,871,649 Total waited: 38,871,650
> Stack trace:
> java.lang.Object.wait(Native Method)
> java.lang.Object.wait(Object.java:485)
> org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5033)
> org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:451)
> org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1578)
> org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1478)
> org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
> org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1882)
> java.lang.ClassLoader.loadClass(ClassLoader.java:247)
> org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1356)
> org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl.isAssignableTo(ServiceRegistrationImpl.java:548)
> org.apache.felix.framework.util.Util.isServiceAssignable(Util.java:280)
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:916)
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
> org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4346)
> org.apache.felix.framework.Felix.registerService(Felix.java:3356)
> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
> org.apache.felix.ipojo.IPojoFactory.start(IPojoFactory.java:613)
> - locked org.apache.felix.ipojo.ComponentFactory@468034b6
> org.apache.felix.ipojo.Extender.createAbstractFactory(Extender.java:520)
> org.apache.felix.ipojo.Extender.parse(Extender.java:301)
> org.apache.felix.ipojo.Extender.startManagementFor(Extender.java:237)
> org.apache.felix.ipojo.Extender.access$600(Extender.java:52)
> org.apache.felix.ipojo.Extender$CreatorThread.run(Extender.java:769)
> java.lang.Thread.run(Thread.java:662)
> Name: FelixFrameworkWiring
> State: BLOCKED on org.apache.felix.ipojo.ComponentFactory@468034b6 owned by:
> Thread-2
> Total blocked: 7 Total waited: 1
> Stack trace:
> org.apache.felix.ipojo.IPojoFactory.removeFactoryStateListener(IPojoFactory.java:511)
> org.apache.felix.ipojo.InstanceCreator.removeFactory(InstanceCreator.java:199)
> org.apache.felix.ipojo.Extender.closeManagementFor(Extender.java:180)
> org.apache.felix.ipojo.Extender.bundleChanged(Extender.java:153)
> org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:868)
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:789)
> org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:514)
> org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4330)
> org.apache.felix.framework.Felix.stopBundle(Felix.java:2451)
> org.apache.felix.framework.Felix$RefreshHelper.stop(Felix.java:4715)
> org.apache.felix.framework.Felix.refreshPackages(Felix.java:4037)
> org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:178)
> java.lang.Thread.run(Thread.java:662)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira