[ https://issues.apache.org/jira/browse/AMQNET-727?focusedWorklogId=915120&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-915120 ]
ASF GitHub Bot logged work on AMQNET-727: ----------------------------------------- Author: ASF GitHub Bot Created on: 17/Apr/24 13:26 Start Date: 17/Apr/24 13:26 Worklog Time Spent: 10m Work Description: AndyDeMauriceGEDigital commented on PR #37: URL: https://github.com/apache/activemq-nms-openwire/pull/37#issuecomment-2061260927 @Havret Can you please review this change? Issue Time Tracking ------------------- Worklog Id: (was: 915120) Time Spent: 50m (was: 40m) > 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 > Priority: Major > Time Spent: 50m > Remaining Estimate: 0h > > 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.20.10#820010)