Sebastien GRIMARD created FELIX-3789: ----------------------------------------
Summary: 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 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