[rabbitmq-discuss] RabbitMQ .NET Client Can Hang with SSL Connections
Jonathan Oliver
jonathan.s.oliver42 at gmail.com
Wed Mar 5 02:43:57 GMT 2014
Awesome guys! Thanks for the fix:
http://www.rabbitmq.com/release-notes/README-3.2.4.txt
http://hg.rabbitmq.com/rabbitmq-dotnet-client/rev/49cfdfd34e15
On Sunday, February 16, 2014 11:33:13 AM UTC-7, Jonathan Oliver wrote:
>
> During periods of degraded WAN performance and availability, e.g. lost
> packets, increased latency, etc. the .NET RabbitMQ connection is destroyed
> according to the requested heartbeat and works as intended. Our client is
> observes this and then attempts to reconnect periodically until a
> connection is re-established with the broker. We've noticed however, that
> sometimes these reconnection attempts hang *indefinitely/forever* despite
> a configured RequestedConnectionTimeout value of 30 seconds.
>
> After months of seeing this problem every few weeks because of various
> network hiccups, we were finally able to capture a snapshot and then
> perform an inspection of the memory dump using WinDbg. Here's the stack
> trace (which uses the production RabbitMQ .NET client v3.2.1):
>
> 000000001adde530 000007fef77ad01a
> System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32,
> System.Net.Sockets.SocketFlags, System.Net.Sockets.SocketError ByRef)
> 000000001adde5d0 000007fef77ace88
> System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32)
> 000000001adde650 000007fef777294c
> System.Net.FixedSizeReader.ReadPacket(Byte[], Int32, Int32)
> 000000001adde6a0 000007fef77d3803
> System.Net.Security.SslState.StartReceiveBlob(Byte[],
> System.Net.AsyncProtocolRequest)
> 000000001adde6e0 000007fef77d1f09
> System.Net.Security.SslState.StartSendBlob(Byte[], Int32,
> System.Net.AsyncProtocolRequest)
> 000000001adde760 000007fef77d3d26
> System.Net.Security.SslState.ProcessReceivedBlob(Byte[], Int32,
> System.Net.AsyncProtocolRequest)
> 000000001adde7d0 000007fef77d3816
> System.Net.Security.SslState.StartReceiveBlob(Byte[],
> System.Net.AsyncProtocolRequest)
> 000000001adde810 000007fef77d1f09
> System.Net.Security.SslState.StartSendBlob(Byte[], Int32,
> System.Net.AsyncProtocolRequest)
> 000000001adde890 000007fef77d1b85
> System.Net.Security.SslState.ForceAuthentication(Boolean, Byte[],
> System.Net.AsyncProtocolRequest)
> 000000001adde900 000007fef77d1856
> System.Net.Security.SslState.ProcessAuthentication(System.Net.LazyAsyncResult)
>
> *RabbitMQ.Client.Impl.SocketFrameHandler_0_9..ctor(RabbitMQ.Client.AmqpTcpEndpoint,
> ObtainSocket, Int32)*
> 000000001addea00 000007fe9a28c5e1
> RabbitMQ.Client.Framing.Impl.v0_9_1.ProtocolBase.CreateFrameHandler(RabbitMQ.Client.AmqpTcpEndpoint,
> ObtainSocket, Int32)
> 000000001addea50 000007fe9a28c245
> RabbitMQ.Client.ConnectionFactory.FollowRedirectChain(Int32,
> System.Collections.Generic.IDictionary`2<RabbitMQ.Client.AmqpTcpEndpoint,Int32>,
> System.Collections.Generic.IDictionary`2<RabbitMQ.Client.AmqpTcpEndpoint,System.Exception>,
> RabbitMQ.Client.AmqpTcpEndpoint[] ByRef, RabbitMQ.Client.AmqpTcpEndpoint)
> 000000001addeb50 000007fe9a28c05f
> RabbitMQ.Client.ConnectionFactory.CreateConnection(Int32,
> System.Collections.Generic.IDictionary`2<RabbitMQ.Client.AmqpTcpEndpoint,Int32>,
> System.Collections.Generic.IDictionary`2<RabbitMQ.Client.AmqpTcpEndpoint,System.Exception>,
> RabbitMQ.Client.AmqpTcpEndpoint[])
> 000000001addebe0 000007fe9a28bf51
> RabbitMQ.Client.ConnectionFactory.CreateConnection(Int32)
> 000000001addec70 000007fe9a28bd6f *** ERROR: Module load completed but
> symbols could not be loaded for Accounting.UsageHost.dll
>
> If you follow the stack trace through the .NET client source code, you'll
> notice that a few of the methods are missing. These have been optimized
> away by the compiler when using a "Release" build.
>
> I have highlighted exactly where the problem is above and if you follow
> the source code, you'll find the problem right here:
> *http://hg.rabbitmq.com/rabbitmq-dotnet-client/file/e399c21792d7/projects/client/RabbitMQ.Client/src/client/api/SslHelper.cs#l97
> <http://hg.rabbitmq.com/rabbitmq-dotnet-client/file/e399c21792d7/projects/client/RabbitMQ.Client/src/client/api/SslHelper.cs#l97>*
>
> The problem is that there is *no timeout* value configured for SSL
> connections. This means that the SSL connection attempt will hang
> indefinitely. And since the connection doesn't exist yet, there's no way
> for any kind of heartbeat thread to tear things down.
>
> The .NET docs also state that the default read/write timeout is set to
> Infinite by default<http://msdn.microsoft.com/en-us/library/system.net.security.sslstream.readtimeout(v=vs.110).aspx>
> .
>
> The simple fix is as follows:
> sslStream.ReadTimeout = connectionTimeout;
> sslStream.WriteTimeout=connectionTimout;
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20140304/e199715e/attachment.html>
More information about the rabbitmq-discuss
mailing list