Return-Path: X-Original-To: apmail-aries-dev-archive@www.apache.org Delivered-To: apmail-aries-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 83F42D47D for ; Tue, 4 Dec 2012 16:44:02 +0000 (UTC) Received: (qmail 2725 invoked by uid 500); 4 Dec 2012 16:44:02 -0000 Delivered-To: apmail-aries-dev-archive@aries.apache.org Received: (qmail 2645 invoked by uid 500); 4 Dec 2012 16:44:00 -0000 Mailing-List: contact dev-help@aries.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@aries.apache.org Delivered-To: mailing list dev@aries.apache.org Received: (qmail 2596 invoked by uid 99); 4 Dec 2012 16:43:59 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 04 Dec 2012 16:43:59 +0000 Date: Tue, 4 Dec 2012 16:43:59 +0000 (UTC) From: "Guillaume Nodet (JIRA)" To: dev@aries.apache.org Message-ID: <392529741.59379.1354639439833.JavaMail.jiratomcat@arcas> In-Reply-To: <1930086692.28516.1354037158513.JavaMail.jiratomcat@arcas> Subject: [jira] [Commented] (ARIES-974) Deadlock with cycle between service / bean / listener MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ 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} > init-method="init" > destroy-method="shutdown"> > > > > > > > > > > > > > > > > > > > > > > > > > {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