[ https://issues.apache.org/activemq/browse/AMQ-988?page=all ]

james strachan resolved AMQ-988.
--------------------------------

    Resolution: Fixed

Patch applied - thanks!

> Thread synchronization error in TcpTransport
> --------------------------------------------
>
>                 Key: AMQ-988
>                 URL: https://issues.apache.org/activemq/browse/AMQ-988
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: NMS (C# client)
>    Affects Versions: 4.0.2
>         Environment: Windows
>            Reporter: Rob Lugt
>         Assigned To: james strachan
>             Fix For: 4.1
>
>         Attachments: amq988-patch.txt
>
>
> I have a problem where my C# client application crashes when placed under 
> load.  It's taken a while to get to the bottom of it, but I believe I have 
> identified the problem and luckily there's a simple solution.
> The AMQ .Net client uses a common pattern where a full-duplex TCP/IP 
> connection is established with the broker, and the client uses two threads to 
> concurrently read and write data to/from the underlying socket - one thread 
> reading from a Reader object and the other writing to a Writer object.
> The TcpTransport.Start() method contains the following:-
>   NetworkStream networkStream = new NetworkStream(socket);
>   socketWriter = new OpenWireBinaryWriter(networkStream);
>   socketReader = new OpenWireBinaryReader(networkStream);
> This pattern is explicitly allowed in Java and Win32 applications, but .Net 
> is a little vague on the subject.  The Microsoft documentation [1] suggests 
> use of the asynchronous read/write calls for multithreaded applications, but 
> that would significantly complicate the C# client which relies on blocking 
> stream behaviour.  On the same doc page 
> Microsoft does specifiy that the Socket class is thread-safe, which I take to 
> mean that concurrent read/write calls are permitted, however the same is not 
> true of NetworkStream [2].
> Perhaps it would be reasonable to expect NetworkStream to have no internal 
> state other than the Socket it contains, but apparently this is not the case 
> because I've identified that it is a corrupt NetworkStream which is causing 
> my application to crash under load.  After some experimentation and a fair 
> amount of load testing, I think the solution is a simple change to the 
> TcpTransport.start() method to use a separate NetworkStream for input and 
> output operations. e.g. :-
>   NetworkStream inputNetworkStream = new NetworkStream(socket);
>   NetworkStream outputNetworkStream = new NetworkStream(socket);
>   socketWriter = new OpenWireBinaryWriter(inputNetworkStream);
>   socketReader = new OpenWireBinaryReader(outputNetworkStream);
> This works for me and my test client has now been running for 16 hours 
> without crashing (before it would rarely last longer than 10 minutes).
> Regards
> Rob Lugt
> [1] http://msdn2.microsoft.com/en-us/library/system.net.sockets.socket.aspx
> [2] 
> http://msdn2.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://issues.apache.org/activemq/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to