[ 
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

Reply via email to