[ 
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)

Reply via email to