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

Clement Escoffier closed FELIX-3789.
------------------------------------

    
> Deadlock due to synchronization on INSTANCE_NAME
> ------------------------------------------------
>
>                 Key: FELIX-3789
>                 URL: https://issues.apache.org/jira/browse/FELIX-3789
>             Project: Felix
>          Issue Type: Bug
>          Components: iPOJO
>    Affects Versions: ipojo-core-1.8.4
>            Reporter: Sebastien GRIMARD
>            Assignee: Clement Escoffier
>             Fix For: ipojo-runtime-1.8.6
>
>
> iPojo sometimes locks up during component instanciation in our application.
> After analysis, the lockup occurs since the fix in FELIX-3548 was applied.
> The problem is that createComponentInstance in the class IPojoFactory is 
> pseudo-recursive (through a call to getHandler), that is it can call 
> recursively itself on a different factory instance.
> Since createComponentInstance synchronizes itself on the factory first (local 
> lock) and on INSTANCE_NAME second (global lock), sometimes it will try to 
> call createComponentInstance on a different factory while holding the global 
> lock and while another threads holds that factory's local lock and is trying 
> to acquire the global lock (I hope what I wrote makes sense).
> Stack trace of the problem :
> Daemon Thread [Thread-1] (Suspended)
>       owns: ComponentFactory  (id=5717)
>       owns: ArrayList<E>  (id=5708)   <==============
>       owns: HandlerManagerFactory  (id=5718)
>       waiting for: HandlerManagerFactory  (id=5709)   <==============
>       HandlerManagerFactory(IPojoFactory).createComponentInstance(Dictionary,
>  ServiceContext) line: 258
>       ComponentFactory(IPojoFactory).getHandler(IPojoFactory$RequiredHandler,
>  ServiceContext) line: 830
>       ComponentFactory(IPojoFactory).createComponentInstance(Dictionary,
>  ServiceContext) line: 306
>       ComponentFactory(IPojoFactory).createComponentInstance(Dictionary)
>  line: 239
>       InstanceCreator$ManagedInstance.create(IPojoFactory) line: 343
>       InstanceCreator.onValidation(IPojoFactory) line: 202
>       InstanceCreator.stateChanged(Factory, int) line: 243
>       ComponentFactory(IPojoFactory).computeFactoryState() line: 766
>       ComponentFactory.addedService(ServiceReference) line: 414
>       Tracker$Tracked.trackAdding(ServiceReference) line: 725
>       Tracker$Tracked.track(ServiceReference) line: 686
>       Tracker$Tracked.serviceChanged(ServiceEvent) line: 642
>       FilteredServiceListener.serviceChanged(ServiceEvent) line: 107
>       BundleContextImpl.dispatchEvent(Object, Object, int, Object) line: 861
>       EventManager.dispatchEvent(Set, EventDispatcher, int, Object) line: 
>  230
>       ListenerQueue.dispatchEventSynchronous(int, Object) line: 148
>       ServiceRegistry.publishServiceEventPrivileged(ServiceEvent) line: 819
>       ServiceRegistry.publishServiceEvent(ServiceEvent) line: 771
>       ServiceRegistrationImpl.register(Dictionary) line: 130
>       ServiceRegistry.registerService(BundleContextImpl, String[], Object,
>  Dictionary) line: 214
>       BundleContextImpl.registerService(String[], Object, Dictionary) line: 
>  433
>       HandlerManagerFactory(IPojoFactory).start() line: 613
>       Extender.createAbstractFactory(Bundle, Element) line: 520
>       Extender.parse(Bundle, String) line: 301
>       Extender.startManagementFor(Bundle) line: 237
>       Extender.access$600(Extender, Bundle) line: 52
>       Extender$CreatorThread.run() line: 769
>       Thread.run() line: 662
>  Daemon Thread [Thread-7] (Suspended)
>       owns: HandlerManagerFactory  (id=5709)          <==============
>       owns: ComponentFactory  (id=5710)
>       owns: Tracker  (id=5711)
>       owns: Dependency[]  (id=5712)
>       waiting for: ArrayList<E>  (id=5708)            <==============
>       HandlerManagerFactory(IPojoFactory).createComponentInstance(Dictionary,
>  ServiceContext) line: 283
>       ComponentFactory(IPojoFactory).getHandler(IPojoFactory$RequiredHandler,
>  ServiceContext) line: 830
>       ComponentFactory(IPojoFactory).computeDescription() line: 721
>       ComponentFactory(IPojoFactory).computeFactoryState() line: 757
>       ComponentFactory.addedService(ServiceReference) line: 414
>       Tracker$Tracked.trackAdding(ServiceReference) line: 725
>       Tracker$Tracked.trackInitialServices() line: 610
>       Tracker.open() line: 210
>       ComponentFactory.starting() line: 262
>       ComponentFactory(IPojoFactory).start() line: 605
>       PrimitiveComponentType.createFactory() line: 441
>       PrimitiveComponentType.initializeFactory() line: 198
>       PrimitiveComponentType.getFactory() line: 171
>       PrimitiveComponentType(ComponentType).ensureFactory() line: 185
>       PrimitiveComponentType(ComponentType).ensureAndGetFactory() line: 177
>       PrimitiveComponentType(ComponentType).createInstance() line: 79
>       COI_Starter.__M_coiBuildler(COI_ConfigLoader) line: 176
>       COI_Starter.coiBuildler(COI_ConfigLoader) line: not available
>       COI_Starter.__M_startOSGI() line: 97
>       COI_Starter.startOSGI() line: not available
>       NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not  
> available [native method]
>       NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
>       DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
>       Method.invoke(Object, Object...) line: 597
>       Callback.call(Object[]) line: 233
>       Callback.call() line: 193
>       LifecycleCallback.call() line: 86
>       LifecycleCallbackHandler.__M_stateChanged(int) line: 162
>       LifecycleCallbackHandler.stateChanged(int) line: not available
>       InstanceManager.setState(int) line: 535
>       InstanceManager.stateChanged(ComponentInstance, int) line: 1401
>       HandlerManager(InstanceManager).setState(int) line: 560
>       HandlerManager.stateChanged(ComponentInstance, int) line: 239
>       DependencyHandler(Handler).setValidity(boolean) line: 174
>       DependencyHandler.__M_checkContext() line: 186
>       DependencyHandler.checkContext() line: not available
>       DependencyHandler.__M_validate(DependencyModel) line: 149
>       DependencyHandler.validate(DependencyModel) line: not available
>       Dependency(DependencyModel).validate() line: 642
>       Dependency(DependencyModel).computeDependencyState() line: 310
>       Dependency(DependencyModel).manageArrival(ServiceReference) line: 399
>       Dependency(DependencyModel).addedService(ServiceReference) line: 335
>       Tracker$Tracked.trackAdding(ServiceReference) line: 725
>       Tracker$Tracked.track(ServiceReference) line: 686
>       Tracker$Tracked.serviceChanged(ServiceEvent) line: 647
>       FilteredServiceListener.serviceChanged(ServiceEvent) line: 107
>       BundleContextImpl.dispatchEvent(Object, Object, int, Object) line: 861
>       EventManager.dispatchEvent(Set, EventDispatcher, int, Object) line: 
>  230
>       ListenerQueue.dispatchEventSynchronous(int, Object) line: 148
>       ServiceRegistry.publishServiceEventPrivileged(ServiceEvent) line: 819
>       ServiceRegistry.publishServiceEvent(ServiceEvent) line: 771
>       ServiceRegistrationImpl.register(Dictionary) line: 130
>       ServiceRegistry.registerService(BundleContextImpl, String[], Object,
>  Dictionary) line: 214
>       BundleContextImpl.registerService(String[], Object, Dictionary) line: 
>  433
>       BundleContextImpl.registerService(String, Object, Dictionary) line: 
>  451
>       IPojoContext.registerService(String, Object, Dictionary) line: 404
>       StartupSequencerImpl$SequenceThread.launchStartupPhase(StartupPhase)
>  line: 309
>       StartupSequencerImpl$SequenceThread.runStartup() line: 389
>       StartupSequencerImpl$SequenceThread.run() line: 262

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