[
https://issues.apache.org/jira/browse/QPID-2418?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12850103#action_12850103
]
Robbie Gemmell commented on QPID-2418:
--------------------------------------
The approach taken in the patch looks good, but I spotted some issues wih it
that need addressed, and an opportunity to get rid of a lot of [pre-existing]
duplication:
The unsubscribe method synchronises around the _subscriptions map, but nothing
else appears to. The content in the various maps within the block are
accessed/updated from a few other locations (in AMQsession, and its 0_8 and
0_10 subclasses), and the content in multiple maps is generally directly
related (eg subscriptions and reverse subscriptions maps, and the topics and
selectors maps) so there could still be threading issues despite the
synchorized block in unsubscribe. The various other uses of the maps should
also be protected to ensure the associated information in the multiple maps
they access/update is properly matched.
When a new durable subscription is made without a selector, it should also
check if any known existing/previous subscription using the same name DID have
a selector, and if so should both unsubscribe the subscription name _and_
remove the existing selector from the selectors map.
In AMQSession.createDurableSubscriber(Topic topic, String name, String
messageSelector, boolean noLocal), when removing an entry from the
reverseSubscriptionsMap the subscription is given as the key. It should
actually be the parent Consumer which is provided as the key. The same applies
in the unsubscribe method (existing bug).
When adding the selector to the subscriptionSelectors map the value is not
permitted to be null, but the selector value is not checked before adding it.
The value can quite easily be null here, as although it is retrieved from the
consumer object it is the same String that is passed into the create method,
meaning it can be provided null and is actually set to null in the method
itself if the selector string given 'isBlank'.
A small update was made in the AMQSession_0_8 and 0_10 subclasses. Examining
the almost-identical methods more closesly seems to show that although they
look to do slightly different things and call differnet methods to achieve
their result, they do infact ultimately end up doing exactly the same thing.
These methods (and those they call) should be rationalised and the
createDurableSubscriber(Topic, String) method implementation moved into the
abstract superclass with the comparible selector method variant which already
resides there (those 2 methods can then potentially be reduced to a common
implementation too).
> Existing durable subscription with selector is not unsubscribed during
> change to new subscription
> --------------------------------------------------------------------------------------------------
>
> Key: QPID-2418
> URL: https://issues.apache.org/jira/browse/QPID-2418
> Project: Qpid
> Issue Type: Bug
> Components: Java Client
> Affects Versions: M4, 0.5, 0.6
> Reporter: Robbie Gemmell
> Assignee: Robbie Gemmell
> Fix For: 0.7
>
> Attachments:
> 0001-QPID-2418-Unsubscribe-existing-durable-subscription.patch
>
>
> AMQSession.createDurableSubscriber(topic, name, messageSelector, noLocal)
> does not unsubscribe existing durable subscriptions. Whilst it does check for
> existing durable subscriptions in use by the client with the same name, it
> instead simply closes the subscriptions then creates a new one. As a result
> of not unsubscribing, the queue backing the subscription is not deleted
> before being used by the updated subscription as it should be (and as happens
> in the 0_8 and 0_10 subclasses when using durable subscriptions without
> selectors).
--
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]