[
https://issues.apache.org/jira/browse/QPID-3319?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13059237#comment-13059237
]
Robbie Gemmell commented on QPID-3319:
--------------------------------------
Hi Srinath, thanks for the patches. I have taken a look at them and it seems
fairly clear they should resolve the memory release issues with the current
implementation, however they do appear to introduce new issues and the general
approach appears to have scope for being significantly slower.
The new implementation utilizes an already thread-safe data structure in the
form of a LinkedConcurrentQueue but then applies synchronization to it,
seemingly in order to allow for cases such as checking the size in the face of
additions/removals or ensuring there is an elment present before requesting it
to avoid exceptions. In the former case tracking additions and removals like
the current implementation would seem to allow sizing without the
synchronization and would additionally avoid the introduced inefficiency of
traversing the entire structure in order to determine the size upon each
invocation of the size() method. In terms of checking for the non-empty case
before retrieving an element, there is an existing peek() method available on
the LinkedConcurrentQueue that provides the same functionality without the need
for synchronization to first check the size. The addition of synchronization in
general doesnt seem ideal for performance of the list, and I would suggest that
since use of the Iterator is not synchronized then its use for the other
methods has to be questioned. The weakly consistent nature of the Iterator also
looks to be the source of an issue whereby it can return elements that have
already been removed from the backing queue since the Iterator was created and
might not include new Subscriptions added since the Iterator was created, both
things the existing implementation makes effort to avoid.
The findNextNode(Subscription node) method seems like it should be a function
of the SubscriptionList itself, is there a reason it was added to the
SimpleAMQQueue? The requirement to search the list of subscriptions from the
beginning in order to find the next node is already less efficient than the
existing solution, but it appears that the method also always searches the
entire data set to the end rather than stopping as soon as it can identify the
next node. It isnt clear to me what special significance index == 2 provides
and along with it what exactly the 'alternativeNextNode' functionality is
doing, except possibly attempting to provide a fallback for when the provided
node isnt found? If so it doesnt appear this method will function in the
expected/existing manner (returning what would have been the next Subscription
to try immediate delivery to upon a new enqueue) in most situations that
occurs, and together with the changes in SimpleAMQQueue#enqueue could also
instead lead to specific subscriptions unfairly being used repeatedly instead
of cycling the subscriptions in the list.
The use of an existing generic data structure clearly leads to a vast
simplification of the SubscriptionList class itself, but I cant help but think
the above issues suggest retaining the existing approach whilst addressing its
memory issues might be the better option.
You mention having done intensive testing but I note there are no new tests
added by the patches. I would suggest a change of this type should really be
verfied through significant unit tests to help provide confidence in the
change. That the existing class has no unit tests is less than ideal, but
serves as all the more reason some should be added before/during large changes
to such a fairly mature and rarely changed piece of core code.
Finally, there are some stylistic issues in your patches such as use of tab
characters instead of spaces, and differences from our field naming convention.
The code style we use on the project is described at:
https://cwiki.apache.org/qpid/java-coding-standards.html
Regards,
Robbie
> org.apache.qpid.server.subscription.SubscriptionList leaks memory
> -----------------------------------------------------------------
>
> Key: QPID-3319
> URL: https://issues.apache.org/jira/browse/QPID-3319
> Project: Qpid
> Issue Type: Bug
> Reporter: Danushka Menikkumbura
> Assignee: Robbie Gemmell
> Priority: Critical
> Attachments: QPID-3319.2.patch, QPID-3319.3.patch, QPID-3319.patch
>
>
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]