[
https://issues.apache.org/jira/browse/QPID-1791?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Ritchie reassigned QPID-1791:
------------------------------------
Assignee: Martin Ritchie
> NonTransactional Sessions can dequeueandDelete a queueEntry twice
> -----------------------------------------------------------------
>
> Key: QPID-1791
> URL: https://issues.apache.org/jira/browse/QPID-1791
> Project: Qpid
> Issue Type: Bug
> Components: Java Broker
> Affects Versions: M4
> Reporter: Martin Ritchie
> Assignee: Martin Ritchie
>
> Summary:
> When a consumer closes the connection any unacknowledged messages are removed
> from the map and then re-queued.
> If the queue was temporary then it will have been deleted and our current
> approach is to delete the message.
> However, in the NonTransactional context the way we process single Acks is
> not thread safe.
> We first of all perform a get from the unacknowledgeMessageMap do the
> acknowledgement and then remove it.
> So the sequence of the ack thread is.
> unackedMap.get(messageID)
> dequeueAndDelete(queueEntry for MessageID)
> unackedMap.remove(messageID)
> Whilst the get and remove take the lock on the unackedMap the lack of lock
> between the two calls allows the ConnectionClose thread to call
> unackedMap.cancelAllMessages() to return the message that have not been acked.
> This could include the message that is currently being processed by the ack
> thread.
> It is difficult to see why the get is being used here. There is no code that
> attempts any error handling if the dequeueAndDelete fails other than simply
> not performing the remove.
> Replacing the get with a remove should solve this problem. However, there is
> the question of what to do in the case of a failure in dequeueAndDelete
> The deleteAndDequeue should not normally fail and when it does it signifies a
> severe broker condition. If we are wanting to attempt dequeueAndDelete and
> only remove the message from the map if the dequeueAndDelete is successful
> then we need to perform this action with the unackedMap lock so that we can
> only ack one message from the session at a time.
> This would have a performance impact. However, I don't believe that this is
> something we need to do, swapping get with remove should be all we need to do
> here.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]