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

Mark Nuttall commented on ARIES-896:
------------------------------------

Hi Guillaume, 
We've run into a problem with this change in that unbind-method for blueprint 
references no longer work in our environment. 

This situation occurs when a bundle providing a service is stopped without 
stopping the whole framework. A blueprint <reference> in another bundle has an 
unbind-method which should be triggered. As per the OSGi R5 spec section 
121.7.10, "The callbacks must be made synchronously with the corresponding OSGi 
service event." Aries-896 violates this part of the specification and results 
in unbind-methods no longer working correctly. 

AbstractServiceReferenceRecipe.serviceChanged() is called because it is a 
ServiceListener, and the service is being unregistered. Under Aries-896, 
serviceRemoved() is now called under a Runnable(). This is the violation that I 
mention above. The effect in our environment is that the bundle providing the 
service in question is stopped before serviceRemoved() is invoked, so that 
there is no BundleContext associated with the ServiceReference provided to the 
blueprint unbind-method. This means that an unusable ServiceReference is now 
provided to the unbind-method. 

The net result is that application-level unbind-methods are broken in our 
environment as a result of the changes to AbstractServiceReferenceRecipe under 
Aries-896. 

Do you have any suggestions as to how we can restore the broken unbind-method 
support without reintroducing the deadlock problems addressed in Aries-896? 

Regards, 
Mark
                
> Deadlock with blueprint services
> --------------------------------
>
>                 Key: ARIES-896
>                 URL: https://issues.apache.org/jira/browse/ARIES-896
>             Project: Aries
>          Issue Type: Bug
>          Components: Blueprint
>            Reporter: Guillaume Nodet
>            Assignee: Guillaume Nodet
>             Fix For: blueprint-core-1.0.1
>
>
> {code}
> "Blueprint Extender: 3" daemon prio=5 tid=7febbc25b800 nid=0x10a56f000 in 
> Object.wait() [10a56c000]
>    java.lang.Thread.State: WAITING (on object monitor)
>       at java.lang.Object.wait(Native Method)
>       - waiting on <7e0099538> (a org.apache.felix.framework.ServiceRegistry)
>       at java.lang.Object.wait(Object.java:485)
>       at 
> org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:349)
>       - locked <7e0099538> (a org.apache.felix.framework.ServiceRegistry)
>       at org.apache.felix.framework.Felix.ungetService(Felix.java:3118)
>       at 
> org.apache.felix.framework.BundleContextImpl.ungetService(BundleContextImpl.java:342)
>       at 
> org.apache.aries.blueprint.container.ReferenceRecipe.bind(ReferenceRecipe.java:142)
>       - locked <7f9bd4c10> (a java.lang.Object)
>       at 
> org.apache.aries.blueprint.container.ReferenceRecipe.retrack(ReferenceRecipe.java:112)
>       at 
> org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.updateListeners(AbstractServiceReferenceRecipe.java:319)
>       at 
> org.apache.aries.blueprint.container.ReferenceRecipe.internalCreate(ReferenceRecipe.java:91)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)
>       - locked <7f9bd58a8> (a java.lang.Object)
>       at 
> org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:60)
>       at 
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)
>       - locked <7f9bd58a8> (a java.lang.Object)
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:219)
>       - locked <7f9bd58a8> (a java.lang.Object)
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.createInstance(BlueprintRepository.java:198)
>       at 
> org.apache.aries.blueprint.container.BlueprintRepository.create(BlueprintRepository.java:137)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.createRecipe(ServiceRecipe.java:370)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.createExplicitDependencies(ServiceRecipe.java:359)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.register(ServiceRecipe.java:154)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.notifySatisfaction(BlueprintContainerImpl.java:604)
>       - locked <7f9bd37e0> (a 
> org.apache.aries.blueprint.container.ServiceRecipe)
>       at 
> org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.setSatisfied(AbstractServiceReferenceRecipe.java:305)
>       at 
> org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.serviceAdded(AbstractServiceReferenceRecipe.java:262)
>       at 
> org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.serviceChanged(AbstractServiceReferenceRecipe.java:245)
>       at 
> org.apache.felix.framework.util.EventDispatcher$5.run(EventDispatcher.java:852)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at 
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:848)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:721)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:649)
>       at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3857)
>       at org.apache.felix.framework.Felix.access$000(Felix.java:89)
>       at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:739)
>       at 
> org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
>       at org.apache.felix.framework.Felix.registerService(Felix.java:2946)
>       at 
> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:251)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl$3.run(BlueprintContainerImpl.java:415)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl$3.run(BlueprintContainerImpl.java:413)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.registerService(BlueprintContainerImpl.java:413)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.register(ServiceRecipe.java:184)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.registerServices(BlueprintContainerImpl.java:654)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:337)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:233)
>       - locked <7e02a0dc0> (a java.util.concurrent.atomic.AtomicBoolean)
>       - locked <7e02a0db0> (a java.util.concurrent.atomic.AtomicBoolean)
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
>       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)
> "Blueprint Extender: 1" daemon prio=5 tid=7febbb392000 nid=0x10a369000 
> waiting for monitor entry [10a366000]
>    java.lang.Thread.State: BLOCKED (on object monitor)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.internalGetService(ServiceRecipe.java:247)
>       - waiting to lock <7f9bd58a8> (a java.lang.Object)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.getService(ServiceRecipe.java:327)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe$TriggerServiceFactory.getService(ServiceRecipe.java:430)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:310)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.access$100(ServiceRegistrationImpl.java:37)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl$ServiceFactoryPrivileged.run(ServiceRegistrationImpl.java:374)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at 
> org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:216)
>       at 
> org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:297)
>       at org.apache.felix.framework.Felix.getService(Felix.java:3106)
>       at 
> org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:329)
>       at 
> org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:442)
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:896)
>       at 
> org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:261)
>       at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:233)
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:840)
>       at 
> org.apache.felix.framework.util.EventDispatcher$5.run(EventDispatcher.java:852)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at 
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:848)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:721)
>       at 
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:649)
>       at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3857)
>       at org.apache.felix.framework.Felix.access$000(Felix.java:89)
>       at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:739)
>       at 
> org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:107)
>       at org.apache.felix.framework.Felix.registerService(Felix.java:2946)
>       at 
> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:251)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl$3.run(BlueprintContainerImpl.java:415)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl$3.run(BlueprintContainerImpl.java:413)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.registerService(BlueprintContainerImpl.java:413)
>       at 
> org.apache.aries.blueprint.container.ServiceRecipe.register(ServiceRecipe.java:184)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.registerServices(BlueprintContainerImpl.java:654)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:337)
>       at 
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:233)
>       - locked <7e02a13d8> (a java.util.concurrent.atomic.AtomicBoolean)
>       - locked <7e02a13c8> (a java.util.concurrent.atomic.AtomicBoolean)
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
>       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
>       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}

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