Jad Naous created FELIX-3839:
--------------------------------

             Summary: 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 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