[
https://issues.apache.org/jira/browse/AMQNET-570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16111661#comment-16111661
]
john weidman commented on AMQNET-570:
-------------------------------------
We have been using this fix now for more than 48 hours and it seems to work
flawlessly and has resolved our connection leak issue with ActiveMQ.
> Error in Apache.NMS.ActiveMQ.Connection.Close()
> -----------------------------------------------
>
> Key: AMQNET-570
> URL: https://issues.apache.org/jira/browse/AMQNET-570
> Project: ActiveMQ .Net
> Issue Type: Bug
> Components: ActiveMQ
> Affects Versions: 1.7.2
> Environment: Windows Server 2008 R2
> Reporter: john weidman
>
> We have been having issues with our ActiveMQ server and we think we have
> tracked at least part of the issue to a bug in the Close function of the
> Apache.NMS.ActiveMQ.Connection class. In the close function it appear to try
> to cleanup temporary destinations here:
> {code}
> if(this.tempDests.Count > 0)
> {
> // Make a copy of the destinations to delete, because the act of
> deleting
> // them will modify the collection.
> ActiveMQTempDestination[] tempDestsToDelete = new
> ActiveMQTempDestination[this.tempDests.Count];
> this.tempDests.Values.CopyTo(tempDestsToDelete, 0);
> foreach(ActiveMQTempDestination dest in tempDestsToDelete)
> {
> dest.Delete();
> }
> }
> {code}
> We have seen the following exceptions:
> - "System.NullReferenceException" on {{dest.Delete()}}
> - "System.IndexOutOfRangeException: Index was outside the bounds of the
> array." on {{this.tempDests.Values.CopyTo(tempDestsToDelete, 0)}}
> - "System.ArgumentException: Destination array is not long enough to copy all
> the items in the collection. Check array index and length." on
> {{this.tempDests.Values.CopyTo(tempDestsToDelete, 0)}}
> I assume that this is because of the length of {{tempDests}} is changing
> during the close. It seems like a {{lock(this.tempDests.SyncRoot)}} would be
> necessary around this section, something like:
> {code}
> if(this.tempDests.Count > 0)
> {
> lock (this.tempDests.SyncRoot)
> {
> // Make a copy of the destinations to delete, because the act
> of deleting
> // them will modify the collection.
> ActiveMQTempDestination[] tempDestsToDelete = new
> ActiveMQTempDestination[this.tempDests.Count];
> this.tempDests.Values.CopyTo(tempDestsToDelete, 0);
> foreach (ActiveMQTempDestination dest in tempDestsToDelete)
> {
> dest.Delete();
> }
> }
> }
> {code}
> Because of the exceptions about 1 out of 1,000 connections in our system do
> not get closed, and causes issues with the performance of ActiveMQ, to the
> point of needing restarting every few days.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)