You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Andy DeMaurice (Jira)" <ji...@apache.org> on 2021/08/17 14:57:00 UTC
[jira] [Created] (AMQNET-727) Thread sync error with
MessageConsumer.pendingAck
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)