[rabbitmq-discuss] Possible bug when disposing connections in .NET client 2.7.0/1
Steve Powell
steve at rabbitmq.com
Fri Dec 30 15:30:03 GMT 2011
This really does look like a bug. Thanks for spotting this.
I'm raising a bugzilla (bug24650) to track it, and will report back.
Steve Powell (a yule bunny)
----------some more definitions from the SPD----------
avoirdupois (phr.) 'Would you like peas with that?'
distribute (v.) To denigrate an award ceremony.
definite (phr.) 'It's hard of hearing, I think.'
modest (n.) The most mod.
On 29 Dec 2011, at 22:16, Dave Stevens wrote:
> Yes, heartbeat is what is causing this. Version 2.7.1 of the .NET
> client is itself calling System.Net.Sockets.TcpClient.Close() 3 times
> per connection shutdown (4 if shutdown times out).
> ConnectionBase.FinishClose() is called 3 different times when shutting
> down.See MainLoop(), HeartbeatReadLoop(), and HeartbeatWriteLoop() of
> ConnectionBase.cs lines 629, 566 and 538 respectively.
> I am required to set the Heartbeat due to another issue where
> exclusive queues are not being removed at the broker when connections
> died. This prevents components from being able to restart with the
> same queue name.
> See http://stackoverflow.com/questions/8296201/when-does-an-amqp-rabbitmq-channel-with-no-connections-die/8299475
>
> I believe that even with this, ConnectionBase.FinishClose() will be
> called once successfully which would allow the models to shutdown
> properly. I believe this is a bug though as FinishClose() should not
> be called more than once or it is possible that certain event handlers
> will be called more than once, Session.OnSessionShutdown specifically.
> This may impact certain reconnect implementations.
>
> On Dec 29, 4:38 pm, Simone Busoli <simone.bus... at gmail.com> wrote:
>> What happens if you remove the heartbeat setting?
>> On Dec 29, 2011 5:43 PM, "Dave Stevens" <daverstev... at gmail.com> wrote:
>>
>>
>>
>>
>>
>>
>>
>>> I get the same exception with this:
>>
>>> [Test(Description = "ObjectDispositionException")]
>>> public void TestFail()
>>> {
>>> var cf = new ConnectionFactory
>>> {
>>> HostName = "10.10.8.96",
>>> Port = 5672,
>>> RequestedHeartbeat = 2
>>> };
>>> using (var connection = cf.CreateConnection())
>>> using (var model = connection.CreateModel())
>>> {
>>> Thread.Sleep(TimeSpan.FromSeconds(1));
>>> }
>>> }
>>
>>> On Thu, Dec 29, 2011 at 2:59 AM, Simone Busoli <simone.bus... at gmail.com>
>>> wrote:
>>
>>>> Hi Dave, although counterintuitive the documentation of the .NET client
>>> states that explicitly. The connection closure/disposal is not idempotent,
>>> i.e. you shall not call it twice.
>>
>>>> On Dec 29, 2011 1:41 AM, "Dave Stevens" <daverstev... at gmail.com> wrote:
>>
>>>>> I am getting the following exception when disposing a connection. I
>>>>> had previously noticed this when going from RabbitMQ Client 2.5.1 to
>>>>> 2.7.0 which caused me to back out the update. I ended up going to
>>>>> 2.7.1 because I thought I found a shutdown issue in my own code. The
>>>>> exception did not present itself again until I started testing some
>>>>> reconnect logic. I first noticed it again after simply pulling the
>>>>> plug on my network.
>>
>>>>> System.ObjectDisposedException: Cannot access a disposed object.
>>>>> Object name: 'System.Net.Sockets.Socket'.
>>>>> at System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel
>>>>> optionLevel, SocketOptionName optionName, Object optionValue)
>>>>> at RabbitMQ.Client.Impl.SocketFrameHandler_0_9.Close()
>>>>> at RabbitMQ.Client.Impl.ConnectionBase.FinishClose()
>>>>> at RabbitMQ.Client.Impl.ConnectionBase.HeartbeatWriteLoop()
>>>>> at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
>>>>> at System.Threading.ExecutionContext.runTryCode(Object userData)
>>>>> at
>>
>>> System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCle anup(TryCode
>>>>> code, CleanupCode backoutCode, Object userData)
>>>>> at System.Threading.ExecutionContext.RunInternal(ExecutionContext
>>>>> executionContext, ContextCallback callback, Object state)
>>>>> at System.Threading.ExecutionContext.Run(ExecutionContext
>>>>> executionContext, ContextCallback callback, Object state, Boolean
>>>>> ignoreSyncCtx)
>>>>> at System.Threading.ExecutionContext.Run(ExecutionContext
>>>>> executionContext, ContextCallback callback, Object state)
>>>>> at System.Threading.ThreadHelper.ThreadStart()
>>
>>>>> This code is reproducible consistently with the following:
>>
>>>>> using System;
>>>>> using System.Threading;
>>>>> using NUnit.Framework;
>>>>> using RabbitMQ.Client;
>>>>> using RabbitMQ.Client.Framing.v0_9;
>>
>>>>> namespace BT.ThirdPartyProxy.Functional.Test.FunctionalTests
>>>>> {
>>>>> [TestFixture]
>>>>> public class TestingObjectDispositionException
>>>>> {
>>>>> [Test(Description = "ObjectDispositionException")]
>>>>> public void TestFail()
>>>>> {
>>>>> var cf = new ConnectionFactory
>>>>> {
>>>>> HostName = INSERT_IP_HERE,
>>>>> Port = 5672,
>>>>> RequestedHeartbeat = 2
>>>>> };
>>>>> using (var connection = cf.CreateConnection())
>>>>> using (var model = connection.CreateModel())
>>>>> {
>>>>> Thread.Sleep(TimeSpan.FromSeconds(1));
>>>>> model.Close(Constants.ReplySuccess, "Goodbye");
>>>>> connection.Close(Constants.ReplySuccess, "Goodbye");
>>>>> Thread.Sleep(TimeSpan.FromSeconds(1));
>>>>> }
>>>>> }
>>>>> }
>>>>> }
>>
>>>>> I am using RabbitMQ.Client.dll 2.7.1.0 in .NET 4.0 app on Windows
>>>>> server 2003 going against RabbitMQ 2.7.0 running on Ubuntu.
>>
>>>>> Status of node rabbit at xxx ...
>>>>> [{pid,1344},
>>>>> {running_applications,
>>>>> [{rabbitmq_management,"RabbitMQ Management Console","2.7.0"},
>>>>> {rabbitmq_management_agent,"RabbitMQ Management Agent","2.7.0"},
>>>>> {amqp_client,"RabbitMQ AMQP Client","2.7.0"},
>>>>> {rabbit,"RabbitMQ","2.7.0"},
>>>>> {os_mon,"CPO CXC 138 46","2.2.5"},
>>>>> {sasl,"SASL CXC 138 11","2.1.9.3"},
>>>>> {rabbitmq_mochiweb,"RabbitMQ Mochiweb Embedding","2.7.0"},
>>>>> {webmachine,"webmachine","1.7.0-rmq2.7.0-hg"},
>>>>> {mochiweb,"MochiMedia Web Server","1.3-rmq2.7.0-git"},
>>>>> {inets,"INETS CXC 138 49","5.5.2"},
>>>>> {mnesia,"MNESIA CXC 138 12","4.4.17"},
>>>>> {stdlib,"ERTS CXC 138 10","1.17.3"},
>>>>> {kernel,"ERTS CXC 138 10","2.14.3"}]},
>>>>> {os,{unix,linux}},
>>>>> {erlang_version,
>>>>> "Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:8:8] [rq:8]
>>>>> [async-threads:30] [kernel-poll:true]\n"},
>>>>> {memory,
>>>>> [{total,31177024},
>>>>> {processes,11828776},
>>>>> {processes_used,11772888},
>>>>> {system,19348248},
>>>>> {atom,1355273},
>>>>> {atom_used,1339382},
>>>>> {binary,84928},
>>>>> {code,14547474},
>>>>> {ets,1099944}]},
>>>>> {vm_memory_high_watermark,0.39999999995232727},
>>>>> {vm_memory_limit,5034326425}]
>>>>> ...done.
>>>>> _______________________________________________
>>>>> rabbitmq-discuss mailing list
>>>>> rabbitmq-disc... at lists.rabbitmq.com
>>>>> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
>>
>>
>>
>> _______________________________________________
>> rabbitmq-discuss mailing list
>> rabbitmq-disc... at lists.rabbitmq.comhttps://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-discuss at lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
More information about the rabbitmq-discuss
mailing list