Andy DeMaurice created AMQNET-727:
-------------------------------------
Summary: Thread sync error with MessageConsumer.pendingAck
Key: AMQNET-727
URL: https://issues.apache.org/jira/browse/AMQNET-727
Project: ActiveMQ .Net
Issue Type: Bug
Components: OpenWire
Affects Versions: 1.8.0
Reporter: Andy DeMaurice
pendingAck is accessed by multiple threads; in most places where it is written,
it is done along with accessing *deliveredMessages*, so it is written within a
*lock(this.deliveredMessages)* block.
However, this call stack shows where pendingAck gets assigned to a new
MessageAck object, NOT within the lock... and it is subject to being
overwritten by another thread (usually the other thread is in
MessageConsumer.Acknowledge() :
Apache.NMS.ActiveMQ.MessageConsumer.AckLater(Apache.NMS.ActiveMQ.Commands.MessageDispatch,
Apache.NMS.ActiveMQ.AckType)
Apache.NMS.ActiveMQ.MessageConsumer.AfterMessageIsConsumed(Apache.NMS.ActiveMQ.Commands.MessageDispatch,
Boolean)
Apache.NMS.ActiveMQ.MessageConsumer.Dispatch(Apache.NMS.ActiveMQ.Commands.MessageDispatch)
Apache.NMS.ActiveMQ.SessionExecutor.Dispatch(Apache.NMS.ActiveMQ.Commands.MessageDispatch)
Apache.NMS.ActiveMQ.SessionExecutor.Iterate()
Apache.NMS.ActiveMQ.Threads.DedicatedTaskRunner.Run()
The usual symptom I see is a NullReferenceException in this section of code
within AckLater; because pendingAck has been set to null by another thread:
if(oldPendingAck == null)
{
pendingAck.FirstMessageId = pendingAck.LastMessageId;
}
else if(oldPendingAck.AckType == pendingAck.AckType)
{
pendingAck.FirstMessageId = oldPendingAck.FirstMessageId;
}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)