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.