Avoid deadlock when shutting down a SA while receiving a sync exchange for it
-----------------------------------------------------------------------------

                 Key: SMX4NMR-116
                 URL: https://issues.apache.org/activemq/browse/SMX4NMR-116
             Project: ServiceMix NMR
          Issue Type: Bug
    Affects Versions: 1.0.0-m3
            Reporter: Gert Vanthienen
            Assignee: Gert Vanthienen
             Fix For: 1.0.0


When a sync MessageExchange has been sent by a component and the platform 
starts shutting down, you can run into a deadlock:

This thread is waiting for all sync exchanges to finish and is holding on to 
the ServiceAssemblyImpl (synchronized method)
{noformat}
"Timer-3" daemon prio=1 tid=0x00007fc210211910 nid=0x5706 in Object.wait() 
[0x0000000041778000..0x0000000041779d00]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00007fc2235490d0> (a java.lang.Object)
        at java.lang.Object.wait(Object.java:474)
        at 
org.springframework.jms.listener.DefaultMessageListenerContainer.doShutdown(DefaultMessageListenerContainer.java:489)
        - locked <0x00007fc2235490d0> (a java.lang.Object)
        at 
org.springframework.jms.listener.AbstractJmsListeningContainer.shutdown(AbstractJmsListeningContainer.java:211)
        at 
org.apache.servicemix.jms.endpoints.JmsConsumerEndpoint.deactivate(JmsConsumerEndpoint.java:523)
        - locked <0x00007fc223548820> (a 
org.apache.servicemix.jms.endpoints.JmsConsumerEndpoint)
        at 
org.apache.servicemix.common.DefaultServiceUnit.shutDown(DefaultServiceUnit.java:126)
        - locked <0x00007fc2235489a8> (a 
org.apache.servicemix.common.xbean.XBeanServiceUnit)
        at 
org.apache.servicemix.common.xbean.XBeanServiceUnit.shutDown(XBeanServiceUnit.java:42)
        at 
org.apache.servicemix.common.BaseServiceUnitManager.shutDown(BaseServiceUnitManager.java:221)
        - locked <0x00007fc222b4c2d8> (a 
org.apache.servicemix.common.BaseServiceUnitManager)
        at 
org.apache.servicemix.jbi.deployer.artifacts.ServiceUnitImpl.shutdown(ServiceUnitImpl.java:145)
        at 
org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl.changeState(ServiceAssemblyImpl.java:282)
        at 
org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl.transition(ServiceAssemblyImpl.java:252)
        at 
org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl.shutDown(ServiceAssemblyImpl.java:220)
        - locked <0x00007fc2233fd348> (a 
org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl)
        at 
org.apache.servicemix.jbi.deployer.impl.Deployer.lifeCycleChanged(Deployer.java:576)
        at 
org.apache.servicemix.jbi.deployer.artifacts.AbstractLifecycleJbiArtifact.fireEvent(AbstractLifecycleJbiArtifact.java:102)
        at 
org.apache.servicemix.jbi.deployer.artifacts.ComponentImpl.shutDown(ComponentImpl.java:174)
        at 
org.apache.servicemix.jbi.deployer.impl.Deployer.unregisterComponent(Deployer.java:454)
        at 
org.apache.servicemix.jbi.deployer.impl.Deployer.unregisterDeployedComponent(Deployer.java:646)
        at 
org.apache.servicemix.jbi.deployer.impl.Deployer$1.removedService(Deployer.java:237)
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.untrack(ServiceTracker.java:1126)
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:957)
        at 
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:820)
        at 
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:678)
        at 
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:609)
        at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3379)
        at org.apache.felix.framework.Felix.access$000(Felix.java:39)
        at org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:620)
        at 
org.apache.felix.framework.ServiceRegistry.fireServiceChanged(ServiceRegistry.java:571)
        at 
org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:105)
        at 
org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:120)
        at 
org.springframework.osgi.service.exporter.support.internal.support.ServiceRegistrationDecorator.unregister(ServiceRegistrationDecorator.java:65)
        at 
org.springframework.osgi.util.OsgiServiceUtils.unregisterService(OsgiServiceUtils.java:41)
        at 
org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean.unregisterService(OsgiServiceFactoryBean.java:370)
        at 
org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean.unregisterService(OsgiServiceFactoryBean.java:360)
        at 
org.springframework.osgi.service.exporter.support.AbstractOsgiServiceExporter.destroy(AbstractOsgiServiceExporter.java:84)
        at 
org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:151)
        at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:487)
        at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:462)
        at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:430)
        - locked <0x00007fc222b74f78> (a java.util.LinkedHashMap)
        at 
org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:853)
        at 
org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.destroyBeans(AbstractOsgiBundleApplicationContext.java:213)
        at 
org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:831)
        at 
org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.doClose(AbstractOsgiBundleApplicationContext.java:206)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$501(AbstractDelegatedExecutionApplicationContext.java:68)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$2.run(AbstractDelegatedExecutionApplicationContext.java:215)
        at 
org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.normalClose(AbstractDelegatedExecutionApplicationContext.java:211)
        at 
org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.close(DependencyWaiterApplicationContextExecutor.java:345)
        at 
org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.doClose(AbstractDelegatedExecutionApplicationContext.java:226)
        at 
org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:794)
        - locked <0x00007fc222b65af8> (a java.lang.Object)
        at 
org.springframework.osgi.extender.internal.activator.ContextLoaderListener$1.run(ContextLoaderListener.java:552)
        at 
org.springframework.osgi.extender.internal.util.concurrent.RunnableTimedExecution$MonitoredRunnable.run(RunnableTimedExecution.java:60)
        at 
org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:66)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)
{noformat}

... while the AssemblyReferencesListener is blocking completion of the same 
MessageExchange while the ServiceAssemblyImpl lock can not be acquired
{noformat}
"DefaultMessageListenerContainer-8" prio=1 tid=0x00007f9044bfbb90 nid=0x6082 
waiting for monitor entry [0x00000000458c1000..0x00000000458c2e00]
        at 
org.apache.servicemix.jbi.deployer.artifacts.AssemblyReferencesListener.unreference(AssemblyReferencesListener.java:164)
        - waiting to lock <0x00007f9057e05530> (a 
org.apache.servicemix.jbi.deployer.artifacts.ServiceAssemblyImpl)
        at 
org.apache.servicemix.jbi.deployer.artifacts.AssemblyReferencesListener.unreference(AssemblyReferencesListener.java:145)
        at 
org.apache.servicemix.jbi.deployer.artifacts.AssemblyReferencesListener.exchangeFailed(AssemblyReferencesListener.java:118)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at 
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:64)
        at 
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:78)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
        at 
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:57)
        at 
org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:40)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
        at 
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy24.exchangeFailed(Unknown Source)
        at 
org.apache.servicemix.nmr.core.ChannelImpl.sendSync(ChannelImpl.java:144)
        at 
org.apache.servicemix.nmr.core.ChannelImpl.sendSync(ChannelImpl.java:117)
        at 
org.apache.servicemix.jbi.runtime.impl.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:187)
        at 
org.apache.servicemix.common.EndpointDeliveryChannel.sendSync(EndpointDeliveryChannel.java:115)
        at 
org.apache.servicemix.common.endpoints.SimpleEndpoint.sendSync(SimpleEndpoint.java:74)
        at 
org.apache.servicemix.jms.endpoints.AbstractConsumerEndpoint.onMessage(AbstractConsumerEndpoint.java:548)
        at 
org.apache.servicemix.jms.endpoints.JmsConsumerEndpoint$1.onMessage(JmsConsumerEndpoint.java:505)
        at 
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:518)
        at 
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:479)
        at 
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:451)
        at 
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323)
        at 
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:241)
        at 
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
        at 
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
        at 
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
        at java.lang.Thread.run(Thread.java:595)
{noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to