[Mono-bugs] [Bug 644936] New: NetworkStream.Read() block and use 100% CPU if the socket has been shutted down
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Fri Oct 8 09:46:20 EDT 2010
https://bugzilla.novell.com/show_bug.cgi?id=644936
https://bugzilla.novell.com/show_bug.cgi?id=644936#c0
Summary: NetworkStream.Read() block and use 100% CPU if the
socket has been shutted down
Classification: Mono
Product: Mono: Class Libraries
Version: 2.6.x
Platform: Other
OS/Version: Other
Status: NEW
Severity: Major
Priority: P5 - None
Component: CORLIB
AssignedTo: mono-bugs at lists.ximian.com
ReportedBy: informatique.internet at fiducial.fr
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.10)
Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.5
I was trying to use the memcache
http://sourceforge.net/projects/memcacheddotnet/ C# lib...
and if i restart the memcached server i saw that the program blocked and use
100% CPU.
This problem doesn't happens on Windows (MS.NET)
I've isolated the problem and made a test case:
Reproducible: Always
Steps to Reproduce:
1.Install Memcached on a server
2.run socketTest
public static void socketTest ()
{
Socket sock = new Socket (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sock.Connect (new IPEndPoint (IPAddress.Parse ("10.69.207.44"),
11211));
NetworkStream _networkStream = new NetworkStream (sock);
for (;;) {
Console.WriteLine (sock.Connected);
string cmd = "get mykey\n";
byte[] cmdByte = System.Text.ASCIIEncoding.ASCII.GetBytes
(cmd);
_networkStream.Write (cmdByte, 0, cmdByte.Length);
_networkStream.Flush();
byte[] b = new byte[1];
MemoryStream memoryStream = new MemoryStream ();
bool eol = false;
while (_networkStream.Read (b, 0, 1) != -1) {
if (b[0] == 13) {
eol = true;
} else {
if (eol) {
if (b[0] == 10)
break;
eol = false;
}
}
// cast byte into char array
memoryStream.Write (b, 0, 1);
}
string temp = UTF8Encoding.UTF8.GetString
(memoryStream.GetBuffer ()).TrimEnd ('\0', '\r', '\n');
Console.WriteLine (temp);
Console.ReadLine ();
}
}
3. This programs send a command to the memcached server and read the output..
and loop!
4. Stop the memcached server... and you'll see that the program would block at
:
_networkStream.Read (b, 0, 1)
Actual Results:
The program blocks : with the thread dump :
"<unnamed thread>" tid=0x0x2b3bfcb7f600 this=0x0x2aaaaacdce60 thread handle
0x405 state : not waiting owns ()
at (wrapper managed-to-native) System.Net.Sockets.Socket.Receive_internal
(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&) <IL 0x00014,
0x0006b>
at (wrapper managed-to-native) System.Net.Sockets.Socket.Receive_internal
(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&) <IL 0x00014,
0x0006b>
at System.Net.Sockets.Socket.Receive_nochecks
(byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.Sockets.SocketError&)
[0x00000] in
/home/hfongarnand/mono/monostablegit/mono/mcs/class/System/System.Net.Sockets/Socket_2_1.cs:615
at System.Net.Sockets.Socket.Receive
(byte[],int,int,System.Net.Sockets.SocketFlags) [0x00070] in
/home/hfongarnand/mono/monostablegit/mono/mcs/class/System/System.Net.Sockets/Socket.cs:2398
at System.Net.Sockets.NetworkStream.Read (byte[],int,int) [0x0004f] in
/home/hfongarnand/mono/monostablegit/mono/mcs/class/System/System.Net.Sockets/NetworkStream.cs:363
at MemCachedTest.MainClass.socketTest () [0x000ac] in
/home/hfongarnand/Projects/MemCached/MemCachedTest/Main.cs:63
at MemCachedTest.MainClass.Main (string[]) [0x00000] in
/home/hfongarnand/Projects/MemCached/MemCachedTest/Main.cs:17
at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object
(object,intptr,intptr,intptr) <IL 0x0001d, 0x00054>
Expected Results:
The program should stop with a proper exception :
Exception non gérée : System.IO.IOException: Impossible de lire les données de
l
a connexion de transport. ---> System.Net.Sockets.SocketException: Une
connexion
établie a été abandonnée par un logiciel de votre ordinateur hôte
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32
size,
SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32
s
ize)
--- Fin de la trace de la pile d'exception interne ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32
s
ize)
at MemCachedTest.MainClass.socketTest()
at MemCachedTest.MainClass.Main(String[] args)
as in windows...
It's blocking us for using MemCache on our web servers...
--
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
More information about the mono-bugs
mailing list