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

Clement Escoffier closed FELIX-3839.
------------------------------------

    
> 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
>            Assignee: Clement Escoffier
>             Fix For: ipojo-runtime-1.8.6
>
>
> 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