activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Laurence Pike (JIRA)" <jira+amq...@apache.org>
Subject [jira] [Updated] (AMQNET-488) Deadlock in InactivityMonitor when using Failover
Date Tue, 12 Aug 2014 10:13:14 GMT

     [ https://issues.apache.org/jira/browse/AMQNET-488?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Laurence Pike updated AMQNET-488:
---------------------------------

    Attachment: AMQNET-488-CompositeTaskRunner.cs.patch
                AMQNET-488-CompositeTaskRunnerTest.cs.patch

This looks like the best solution to me as the InactivityMonitor will need to lock internally.
It appears safe to not hold the "mutex" lock whilst calling iterate in the CompositeTaskRunner.

The test will fail before, but succeed after the patch. As it is a race condition it is possible
for the test to pass before occasionally.

> Deadlock in InactivityMonitor when using Failover
> -------------------------------------------------
>
>                 Key: AMQNET-488
>                 URL: https://issues.apache.org/jira/browse/AMQNET-488
>             Project: ActiveMQ .Net
>          Issue Type: Bug
>          Components: ActiveMQ
>    Affects Versions: 1.6.2
>         Environment: ActiveMQ 5.10.0 on Windows Server 2012
> Apache.NMS.ActiveMQ 6.2 on .Net 4.5 + Windows 7
>            Reporter: Laurence Pike
>            Assignee: Jim Gomes
>            Priority: Critical
>         Attachments: AMQNET-488-CompositeTaskRunner.cs.patch, AMQNET-488-CompositeTaskRunnerTest.cs.patch
>
>
> Can occur when FailoverTransport is disposing the transport when the inactivity monitor
fires. Deadlock between InactivityMonitor.monitor and CompositeTaskRunner.mutex.
> Stack traces for deadlock:
> mscorlib.dll!System.Threading.Monitor.Enter(object obj, ref bool lockTaken)	Unknown
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.InactivityMonitor.StopMonitorThreads()
Line 381	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.InactivityMonitor.OnException(Apache.NMS.ActiveMQ.Transport.ITransport
sender, System.Exception command) Line 310	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.Tcp.TcpTransport.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 146	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.InactivityMonitor.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 294	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.InactivityMonitor.AsyncWriteTask.Iterate()
Line 474	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Threads.CompositeTaskRunner.Iterate() Line
194	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Threads.CompositeTaskRunner.Run() Line 149
C#
> mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state)	Unknown
> mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext
executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
Unknown
> mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext
executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
Unknown
> mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext
executionContext, System.Threading.ContextCallback callback, object state)	Unknown
> mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()	Unknown
> ============================================================================================================================
> mscorlib.dll!System.Threading.Monitor.Enter(object obj, ref bool lockTaken)	Unknown
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Threads.CompositeTaskRunner.RemoveTask(Apache.NMS.ActiveMQ.Threads.CompositeTask
task) Line 65	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.InactivityMonitor.StopMonitorThreads()
Line 401	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.InactivityMonitor.Stop() Line 223
C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.TransportFilter.Stop() Line 196
C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.Failover.FailoverTransport.DisposeTransport(Apache.NMS.ActiveMQ.Transport.ITransport
transport) Line 1521	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.Failover.FailoverTransport.HandleTransportFailure(System.Exception
e) Line 454	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.Failover.FailoverTransport.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 815	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.TransportFilter.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 82	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.MutexTransport.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 69	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Transport.ResponseCorrelator.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 54	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Connection.Oneway(Apache.NMS.ActiveMQ.Commands.Command
command) Line 883	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Session.Session(Apache.NMS.ActiveMQ.Connection
connection, Apache.NMS.ActiveMQ.Commands.SessionId sessionId, Apache.NMS.AcknowledgementMode
acknowledgementMode) Line 72	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Connection.CreateActiveMQSession(Apache.NMS.AcknowledgementMode
ackMode) Line 594	C#
> Apache.NMS.ActiveMQ.dll!Apache.NMS.ActiveMQ.Connection.CreateSession(Apache.NMS.AcknowledgementMode
sessionAcknowledgementMode) Line 588	C#
> [Private code sending message in new session]



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message