-
Notifications
You must be signed in to change notification settings - Fork 591
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
'Leak' of channels (IModel instances) in case where connection is blocked #1573
Comments
In the Java client, the behavior of a In Bunny, in addition to the behavior above, there's a predicate on If the Java client option would be too difficult or impractical to pull off, the Bunny solution plus throwing an exception might be a good enough approximation. |
Thanks @michaelklishin. I moved this to an issue to try to reproduce it. |
I was the original author of the discussion post. I did try this again recently and the behaviour still seems to be there. |
Hi @neilgreatorex, thanks for following up. I took you code and added it to a test to demonstrate that this issue is fixed in the latest code - Note that the |
Add test demonstrating that #1573 is fixed
Hi @lukebakken. Unfortunately I can still reproduce the issue using the code in master. I have shared my test class at https://gist.github.com/neilgreatorex/63e163c933ca8b2836b987eeac85a7b4. To test:
|
@neilgreatorex do you get |
@lukebakken I get TaskCancelledExceptions now with the async methods |
Thanks for the updated code, I had a bug in my test. I can reproduce this now. |
Here is what is happening - when those When the connection is unblocked, RabbitMQ sends the Maaybe the next version of this library can keep track of "stale, timed-out" continuations for some time (perhaps when the connection is blocked) to see if a response is sent back, but version 7 will not do that. cc @michaelklishin @Gsantomaggio I thought you'd find this case interesting. |
@lukebakken Would it be possible that if the library received a |
@neilgreatorex that's a good idea. |
Discussed in #1131
Originally posted by neilgreatorex December 24, 2021
Hi,
I think I've come across an issue whereby channels can be 'leaked' during a connection that has been blocked by the broker due to resource constraints. The issue occurs if you try to create new channels while the connection is blocked. The calls to CreateModel() throw a System.TimeoutException and you (quite reasonably) don't get a reference to the channel.
The problem is that once the connection is unblocked, suddenly the channels that you tried to create appear on the broker end and are not cleaned up by any garbage collection in the client. Looking at the heap at this point, the problem seems to be that the sessions created in the SessionManager are not cleaned up. As far as I can see, there's no way for a user of the client library to access the SessionManager via public API.
I've added my sample code to this gist. In the gist is also the results that I get on the console when running the code against a resource constrained (blocked) broker (along with the rabbitmqctl commands that were run and their output).
Please let me know if you want me to raise an issue here on GitHub for this, or if I should post this elsewhere.
Thanks,
Neil
PS. Merry Christmas to those who celebrate 😃🎅
The text was updated successfully, but these errors were encountered: