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 On 1 August 2012 20:30, Guillaume Nodet (JIRA) <[email protected]> wrote: > > [ > https://issues.apache.org/jira/browse/ARIES-896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel] > > Guillaume Nodet resolved ARIES-896. > ----------------------------------- > > Resolution: Fixed > Fix Version/s: blueprint-core-1.0.1 > Assignee: Guillaume Nodet > > http://svn.apache.org/viewvc?rev=1368206&view=rev > > > 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: > https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa > For more information on JIRA, see: http://www.atlassian.com/software/jira > > >
