[ 
https://issues.apache.org/jira/browse/ARIES-974?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13509846#comment-13509846
 ] 

Guillaume Nodet commented on ARIES-974:
---------------------------------------

No, I haven't really looked at the problem.  I've currently worked around the 
problem by using a ServiceTracker instead of blueprint proxies.
The problem described above is caused by an indirect cycle between 3 beans 
using blueprint listeners.

The blueprint container starts exposing the service, then create singletons.  
The fact that services are exposed first may trigger the creation of the actual 
service if another bundle actually get the service.  If that happens at the 
same time singletons are being created, both threads start creating a bean and 
end-up waiting for each other because they need each-other bean at the end.

Cycles are actually supported when using listeners (else, they are supposed to 
be rejected), however, the way they are supported is by putting a partial 
object in the context so that it can be used for injection even if that object 
is not fully initialized. In that case, I'm not completely sure what happens 
and how to fix it at this point.
                
> Deadlock with cycle between service / bean / listener
> -----------------------------------------------------
>
>                 Key: ARIES-974
>                 URL: https://issues.apache.org/jira/browse/ARIES-974
>             Project: Aries
>          Issue Type: Bug
>            Reporter: Guillaume Nodet
>
> Thread dump:
> {code}
> Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.12-b01-434 mixed mode):
> "pool-org.apache.servicemix.nmr.osgi-1.6.0.fuse-71-040-thread-2" prio=5 
> tid=7ff10dd5d000 nid=0x11e000000 waiting on condition [11dffd000]
>    java.lang.Thread.State: WAITING (parking)
>       at sun.misc.Unsafe.park(Native Method)
>       - parking to wait for  <7fba729a8> (a 
> java.util.concurrent.FutureTask$Sync)
>       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
>       at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
>       at java.util.concurrent.FutureTask.get(FutureTask.java:83)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:93)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.di.CollectionRecipe.internalCreate(CollectionRecipe.java:90)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.createListeners(AbstractServiceReferenceRecipe.java:240)
>       at 
> org.apache.aries.blueprint.container.ReferenceRecipe.internalCreate(ReferenceRecipe.java:108)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.createService(ServiceRecipe.java:280)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.internalGetService(ServiceRecipe.java:247)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.getService(ServiceRecipe.java:349)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe$TriggerServiceFactory.getService(ServiceRecipe.java:502)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:325)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.access$100(ServiceRegistrationImpl.java:46)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl$1.call(ServiceRegistrationImpl.java:234)
>       at org.apache.felix.framework.Felix$6.call(Felix.java:2098)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>       at java.lang.Thread.run(Thread.java:680)
> "pool-org.apache.servicemix.nmr.osgi-1.6.0.fuse-71-040-thread-1" prio=5 
> tid=7ff10bba2000 nid=0x11defd000 waiting on condition [11defb000]
>    java.lang.Thread.State: WAITING (parking)
>       at sun.misc.Unsafe.park(Native Method)
>       - parking to wait for  <7fba5acb8> (a 
> java.util.concurrent.FutureTask$Sync)
>       at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
>       at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
>       at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
>       at java.util.concurrent.FutureTask.get(FutureTask.java:83)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:93)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)
>       at 
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:245)
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:183)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:649)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:356)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:255)
>       - locked <7fb6513b0> (a java.util.concurrent.atomic.AtomicBoolean)
>       at 
> org.apache.aries.blueprint.container.BlueprintExtender.checkBundle(BlueprintExtender.java:325)
>       at 
> org.apache.aries.blueprint.container.BlueprintExtender.bundleChanged(BlueprintExtender.java:243)
>       at 
> org.apache.aries.blueprint.container.BlueprintExtender$BlueprintBundleTrackerCustomizer.modifiedBundle(BlueprintExtender.java:471)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:198)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:128)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:468)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:161)
>       at 
> org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:117)
>       at 
> org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1103)
>       at 
> org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:696)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:484)
>       at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4479)
>       at org.apache.felix.framework.Felix$4.run(Felix.java:2019)
>       at org.apache.felix.framework.Felix$5.run(Felix.java:2061)
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>       at java.lang.Thread.run(Thread.java:680)
> {code}
> Object creation stack:
> {code}
> executorConfigurator
>  - executorFactory
>    - managementStrategy
>      - servicemix
> - servicemix
>   - endpointStrategy
>     - executorFactory
> {code}
> Blueprint code: 
> https://github.com/apache/servicemix4-nmr/blob/dd66b65342d757d66af36988ecdc8f785dc61826/nmr/osgi/src/main/resources/OSGI-INF/blueprint/servicemix-nmr.xml
> Stripped xml
> {code}
>     <bean id="servicemix" class="org.apache.servicemix.nmr.core.ServiceMix"
>           init-method="init"
>           destroy-method="shutdown">
>         <property name="endpointRegistry" ref="endpointRegistry"/>
>         <property name="listenerRegistry" ref="listenerRegistry"/>
>         <property name="flowRegistry" ref="flowRegistry"/>
>         <property name="wireRegistry" ref="wireRegistry"/>
>         <property name="executorFactory" ref="executorFactory"/>
>         <property name="id" value="${nmrId}"/>
>     </bean>
>  
>     <reference id="managementStrategy" 
> interface="org.fusesource.commons.management.ManagementStrategy">
>         <reference-listener ref="servicemix" 
> bind-method="bindManagementStrategy" unbind-method="unbindManagementStrategy" 
> />
>     </reference>
>     <bean id="executorFactory" 
> class="org.apache.servicemix.executors.impl.ExecutorFactoryImpl">
>         <property name="defaultConfig">
>             <bean class="org.apache.servicemix.executors.impl.ExecutorConfig">
>                 <property name="allowCoreThreadTimeOut" 
> value="${allowCoreThreadTimeOut}"/>
>                 <property name="corePoolSize" value="${corePoolSize}"/>
>                 <property name="maximumPoolSize" value="${maximumPoolSize}"/>
>                 <property name="queueSize" value="${queueSize}"/>
>                 <property name="bypassIfSynchronous" 
> value="${bypassIfSynchronous}"/>
>             </bean>
>         </property>
>         <property name="managementStrategy" ref="managementStrategy"/>
>     </bean>
>     <service ref="executorFactory" 
> interface="org.apache.servicemix.executors.ExecutorFactory"/>
> {code}

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