[
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