www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - std.stream doesn't play well with others

reply teqDruid <me teqdruid.com> writes:
So the subject implies that the problem is std.stream... but that's not
necessarily true.

I'm relatively certain at this point the the freezing issues I've been
having (plenty of posts on the dsource mango forum, and "SIGUSR1 Makes
Program Hang" here) are due to std.stream... or some interaction between
it and mango...  Whenever something std.stream gets linked in (even if it
isn't used!) the HTTP server freezes after a certain number of requests.
The number of HTTP requests before failing seems to be inversely
proportional to the amount of code to process said requests.  That is with
all my code, I get about 9 to 24 requests in... with a short "canned"
response, and no reading of the request (sometimes mango responds before
the client finishes sending!) I'm able to get up to about 1900
requests.... which is one of the reasons this one took so long to track
down.

Now that I've figured this out, I'm switch over to all mango IO, which
I've been planning on doing anyway, but I thought I'd let you all know.
I haven't been able to pinpoint what in std.stream is causing it... I just
know that my problem went away when I converted one of my libraries to
mango, and the problem came back when I put xmld back in, which relies on
streams- MemoryStream, and the generic Stream.  The good news is there's a
test case below... the bad news is that it's a little long, and it relies
on Mango (not sure what version... I'm using SVN HEAD) and Andy's xmld,
which is available on his website.  I've also had the problem occur with
some of my own code using std.stream, so I don't think the issue is with
xmld, but I can't get the issue to manifest without it.  Sorry... but it's
as short as I could get it.  Haven't tested it on windows, since I don't
have a working windows box.

Anyway, on the 312th request- every time- all three processes freeze up,
and the only way to kill it is to send them all a SIGKILL.  To test it,
fire the rig up, and send a couple hundred POST requests to /RPC2.  I've
been sending 2500 HTTP POSTs, since sometimes the issue only manifests
itself at higher numbers.

I'm running DMD 0.101 (was also an issue with DMD 0.98) on Linux.

John

------------------------------------

import mango.servlet.ServletProvider;
import mango.servlet.Servlet;
import mango.log.Logger;
import mango.log.ConsoleAppender;
import mango.io.Socket;
import mango.http.server.HttpServer;

import xmld.xml;

import std.stream;

XmlNode readString(char[] string)
{
	string ~= " ";
	return readDocument(new MemoryStream(string));
}

char[] smpl = "<methodResponse>
	<params>
		<param>
		<value>
			<struct>
			<member>
				<name>ID</name>
				<value>
				<string>1 1</string>
				</value>
			</member>
			</struct>
		</value>
		</param>
	</params>
</methodResponse>";

char[] output = "<?xml version=\"1.0\"?>
	<methodResponse>
	<params>
		<param>
		<value>
			<struct>
			<member>
				<name>ID</name>
				<value>
				<string>1 1</string>
				</value>
			</member>
			</struct>
		</value>
		</param>
	</params>
</methodResponse>";

class TestServlet : MethodServlet
{
	public override void doPost (IServletRequest request, IServletResponse
response)
	{
		try
		{
			XmlNode n = readString(smpl);
			
			response.setContentType("text/xml");
			response.getWriter().put(output);
		}
		catch (Exception e)
		{
			printf(e.toString() ~ "\n\0");
		}
	}
	
		public void install(ServletProvider provider)
		{
			IRegisteredServlet irs = provider.addServlet (this, "XmlRpc");
			provider.addMapping ("/RPC2", irs);
		}
}

void main()
{
	Logger hLogger = Logger.getLogger ("HTTP Server");
	hLogger.setLevel(Logger.Level.Trace);
	hLogger.addAppender(new ConsoleAppender());
	
	InternetAddress bindTo = new InternetAddress(8181);
	ServletProvider sp = new ServletProvider();
	
	TestServlet ts = new TestServlet();
	ts.install(sp);
	
	//The HTTP Server
	HttpServer httpServer = new HttpServer(sp, bindTo, 1, hLogger);
	
	//Go!
	httpServer.start();
	
	//Wait for input, then close it all up
	stdin.readLine();
}
Sep 13 2004
next sibling parent Ben Hinkle <bhinkle4 juno.com> writes:
well naturally I'm curious and will come to the defense of std.stream...
I'll poke around some with the example below. I compiled it but when I run
it I get a seg-v in _D5mango2io8FilePath8FilePath7getNameFZAa inside of
mango's Logger.getLogger. Anyway, I'll keep debugging.

Since the GC deals with SIGUSER1 my assumption is that something is
generating garbage like mad and kicking off a garbage collection. I'll try
sprinkling in calls to gcstats and printing out the results and see what is
going on memory-wise.

teqDruid wrote:

 So the subject implies that the problem is std.stream... but that's not
 necessarily true.
 
 I'm relatively certain at this point the the freezing issues I've been
 having (plenty of posts on the dsource mango forum, and "SIGUSR1 Makes
 Program Hang" here) are due to std.stream... or some interaction between
 it and mango...  Whenever something std.stream gets linked in (even if it
 isn't used!) the HTTP server freezes after a certain number of requests.
 The number of HTTP requests before failing seems to be inversely
 proportional to the amount of code to process said requests.  That is with
 all my code, I get about 9 to 24 requests in... with a short "canned"
 response, and no reading of the request (sometimes mango responds before
 the client finishes sending!) I'm able to get up to about 1900
 requests.... which is one of the reasons this one took so long to track
 down.
 
 Now that I've figured this out, I'm switch over to all mango IO, which
 I've been planning on doing anyway, but I thought I'd let you all know.
 I haven't been able to pinpoint what in std.stream is causing it... I just
 know that my problem went away when I converted one of my libraries to
 mango, and the problem came back when I put xmld back in, which relies on
 streams- MemoryStream, and the generic Stream.  The good news is there's a
 test case below... the bad news is that it's a little long, and it relies
 on Mango (not sure what version... I'm using SVN HEAD) and Andy's xmld,
 which is available on his website.  I've also had the problem occur with
 some of my own code using std.stream, so I don't think the issue is with
 xmld, but I can't get the issue to manifest without it.  Sorry... but it's
 as short as I could get it.  Haven't tested it on windows, since I don't
 have a working windows box.
 
 Anyway, on the 312th request- every time- all three processes freeze up,
 and the only way to kill it is to send them all a SIGKILL.  To test it,
 fire the rig up, and send a couple hundred POST requests to /RPC2.  I've
 been sending 2500 HTTP POSTs, since sometimes the issue only manifests
 itself at higher numbers.
 
 I'm running DMD 0.101 (was also an issue with DMD 0.98) on Linux.
 
 John
 
 ------------------------------------
 
 import mango.servlet.ServletProvider;
 import mango.servlet.Servlet;
 import mango.log.Logger;
 import mango.log.ConsoleAppender;
 import mango.io.Socket;
 import mango.http.server.HttpServer;
 
 import xmld.xml;
 
 import std.stream;
 
 XmlNode readString(char[] string)
 {
 string ~= " ";
 return readDocument(new MemoryStream(string));
 }
 
 char[] smpl = "<methodResponse>
 <params>
 <param>
 <value>
 <struct>
 <member>
 <name>ID</name>
 <value>
 <string>1 1</string>
 </value>
 </member>
 </struct>
 </value>
 </param>
 </params>
 </methodResponse>";
 
 char[] output = "<?xml version=\"1.0\"?>
 <methodResponse>
 <params>
 <param>
 <value>
 <struct>
 <member>
 <name>ID</name>
 <value>
 <string>1 1</string>
 </value>
 </member>
 </struct>
 </value>
 </param>
 </params>
 </methodResponse>";
 
 class TestServlet : MethodServlet
 {
 public override void doPost (IServletRequest request, IServletResponse
 response) {
 try
 {
 XmlNode n = readString(smpl);
 
 response.setContentType("text/xml");
 response.getWriter().put(output);
 }
 catch (Exception e)
 {
 printf(e.toString() ~ "\n\0");
 }
 }
 
 public void install(ServletProvider provider)
 {
 IRegisteredServlet irs = provider.addServlet (this, "XmlRpc");
 provider.addMapping ("/RPC2", irs);
 }
 }
 
 void main()
 {
 Logger hLogger = Logger.getLogger ("HTTP Server");
 hLogger.setLevel(Logger.Level.Trace);
 hLogger.addAppender(new ConsoleAppender());
 
 InternetAddress bindTo = new InternetAddress(8181);
 ServletProvider sp = new ServletProvider();
 
 TestServlet ts = new TestServlet();
 ts.install(sp);
 
 //The HTTP Server
 HttpServer httpServer = new HttpServer(sp, bindTo, 1, hLogger);
 
 //Go!
 httpServer.start();
 
 //Wait for input, then close it all up
 stdin.readLine();
 }

Sep 13 2004
prev sibling next sibling parent reply Ben Hinkle <bhinkle4 juno.com> writes:
I got the example to compile and run. It sits there with
INFO HTTP Server - Server http::Servlet started on 0.0.0.0:8181 with 1
accept threads, 10 backlogs
until I hit enter and then it seg-v's. Is this what is supposed to happen? I
don't understand what it is doing or what it is supposed to be doing. How
do I reproduce the bug?

-Ben
Sep 13 2004
parent reply Regan Heath <regan netwin.co.nz> writes:
------------H8W13lYhPQcA6OeByHmkeW
Content-Type: text/plain; format=flowed; charset=iso-8859-15
Content-Transfer-Encoding: 8bit

On Mon, 13 Sep 2004 21:50:34 -0400, Ben Hinkle <bhinkle4 juno.com> wrote:
 I got the example to compile and run.

You got further than I did. I'd like to help too, however, mine simply says 'Access Violation' when I run it, I don't think I compiled it right. :) I have the latest mango and xmld from andy's site. I need to produce a lib for each of them right, how?
 It sits there with
 INFO HTTP Server - Server http::Servlet started on 0.0.0.0:8181 with 1
 accept threads, 10 backlogs
 until I hit enter and then it seg-v's. Is this what is supposed to 
 happen? I
 don't understand what it is doing or what it is supposed to be doing. How
 do I reproduce the bug?

I suspect you're supposed to connect and send a web POST request, attached is a Windows console program I wrote it's really quite neat/useful for debugging tcpip stuff. Included in the zip you'll find post.txt and instructions.txt. To run it type: tcpbot post.txt localhost 8181 it will attempt to connect to localhost on port 8181 the it will carry out the instructions in post.txt. See instructions.txt for a description of how to format post.txt - it's a rough guide. Regan -- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/ ------------H8W13lYhPQcA6OeByHmkeW Content-Disposition: attachment; filename=tcpbot.zip Content-Type: application/zip; name=tcpbot.zip Content-Transfer-Encoding: Base64 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 KLzh1aviG0v6pDfEFreXQvkNTXbDo8lt/FUXktt4xdryk2IbIRIrpLlF5BjxDqPH X6NrCU+pPym21owRipjUk42DYKUebtp7LFM2eFPubDDblFyG64RoPgsAavNgX/r0 zTGACNK5sBYqRf7XFco3awoXpsyh5cEeaeuHyEWDZceQXxJaaoC8lRsK7FGpAbwW pNBvP1Ho5847vZR3EFKhvc8/X/68FB9PJLDE6jjBwZj22j8Wwk37gCBw0Cjx6JGi Cd/JItQYUUY3pI0GCdhycU74PiUCOcvjcMIOdNJjD8NAE+fQ4mDT7o8IVoGBZoJq CFwvO8T6Gcv436AycAdgH+Id+QYirjLYepyLRdWkyIguF5Yw8nz/GzoIJhT1igcD nfGBjujoNggQDbD9Ihq1DZrr34OOYTa0ix8H5DHRH/mNgwWMX9uqKFCgd+XPgPaK Plwu5DCkIbx66a3n+i/cbor8N6c+hTIJ2WssdniHh1z9QORo9mI/Q1HodapEJCOM wjDyjR6PS5WnAT+nJk+DogitYay2q5FeHVdjVqVopJHkMkbBHrcdfXGDYZTCJYYE q8whtfCYUOenoc2Q4yQRS5+QjcXjUYOL9qQBQjYWVRxGPCEUnbZ+Zqp7ksJ7wHv9 9EhV0GaWqAraHNAudJaHhCRsFLzVGlzEotPp1afYcrwbWs0BxWy0dKHSuVBZ4qWW ch3ZyRa4E9Yedmq3PYZmbenViaY6vOzDyiVuGa1W7dooeFs0Ensoo9N2jYxO6Fws fZta5sZGtcynhCJyCFYe3Ffm1JOkyJD7Z+zrbhc5ZH9NPuyTUB6Ph6M9HjlcLYzb pe5dYK1w40LsQnWs96GumpZO1FCu9pETP9dHUrQ+Akhx473Iwy/hbJ492EOcHqfL pcSXhvrHTPSXx3r2bOz3rNAUnGO/aA3bqHUQkYuznqsxo2STdBGZOoUI1bj0okTs N1hq6Uud2m8St2/U+s1IrT4Deg2m3vmCDu8/M9U/RZj1AzqN9RwbCUma6h9Xm4dj cHmGxx4BSDURYmsn3jxj7dmS6bcfULvTKq24+ehxrmYiX31AX3mj334wreggO6LR qZtxnB0i5pobI2cwlfSMg+v/24Z7Yme8Bvl5LP0UEuF5LcJTaoTfirkJJAIz46Dp QdQOTyJ90Xk/KpF3YYW8kX29DpYh1mZT3WGKIARDk9otqhqu6cpD+4TFhCK1K3Nx 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 /37Hc8//4YWdf3zxpZf/+5VXX/vTn//y+l937d7zxptvvf23vfuaAvubD7zT0trW fvDdQ39/7/CRo8eOv/+PDz488dHHJ0998ulnHZ9/8eXpf575Sur8Wj77zbffdX3/ w7nz/+ruCV64eKn38hXlZyfon3v64KV9q2D7+fD/yf//4QdFQPLWrkf+MfKOkWeM /GLkFVO5yzchrxj5xMgjRt4w8oWRH4y8YOQBI+8X+b7I8x0wr95TxmriS5pAyWqV VUdRd0FfXQLGCSYHTHbZ3RxOuGQTHB6N6QBlUnnVy8GMmzw1pQqQeGkRzgsWRNmA t8epeLdq8riU6aVoKM/KNchvs6xXWTQ448NMAYgAQv60X7840uIV65AdMn5c6YSl 4ybfUlUEaYMbYbGA460D3V3I4GAtK3C7GwuhMhosK6uIMFLVakAcqjTLSrUOhCuy ZvkqS5Ua8e7/EB43xUvXcoRnnrfWEgKJCht15ka0r+LTiYRsGchFtZSTdlA9VA6A ZTVyJ9WJbKDv1fGu9Ya81XhrVV6nmj+0Lcm+P8lQWqTcFij4T4RBf41T+vOFgefZ tZl976tY/uYf912kZ39aKqDfX/+/MBauP9cf7E94BD7UdwzaG5XIoYI21PaDR9XD weAUEEERWQnU7U7ekdo7SvOLHuA3VIuLb5OWrllzw3s6BmsG3W/Q3Kdr35nad5b2 7dTiLNLcXdrbo6VfqOW9SnNHQRwLGFzMJVIq/Rqp1QPD+7Qy12rvBzR/XvOv09L5 JRgczE9r39u18jyn5feC5r5bK997mv+Hmn9ChAoL7nFYO4KZtdxGFWhm4OO9NZMY LPW1f+P7/n7s9+O/HIDxv/ur+4m/q0PUDvjT/Q//BsZ/YMCf/n/4F4pr+dme+v8/ D47JydTVuF563Ea+Q9PCtimZxOzUjKI9XeD3/f/dBb7+XH+uP9ef68/15/pz/bn+ XH+uP9ef68/15/pz/bn+XH+uP9ef68/15/pz/bn+XH+uP9ef68/15/rzf8mDsgEd mgDBzop/f8T8xDX+Xdd8N/2H+P9XPpawXw8f+H1Cn0m16VV5ByK48z98Qjr9Qk9S eCZlBNMVBnACcwDMa2AeBeMDswrMEjDZYCxgjGCCdCZ1FswpMIfANIF5DcyzYLaB 8YFZBWYBmDQwcVpYGuMZwA7mAJjXwewE8ziYOoMapkJ7L4a3DUwSGDOYoF51T76m PruP237S+NapciNd3yuK07X4/yzYyePM/v8t/uuuTOq8S+0718L/2u8w6GbRmn0U 2GnN/tsBdj/YGc3+8AD7IwPs2wbYfznA/qsB9l8PsKO8G8qtbaRUOTCU3UqJzCQy bDS8USbsBJNJ/F6HN8rfNMAbZb2WwBvl16bBewi8GXijzNyRiEwKO+1OeI+A9zp4 j4R3GrxRFs0Mb8yPgjfqk+qCfng/vDvg3QvvQ2Ohf2M64f3jDuE1Gt5WMHdq5X0M zF/BvA/mHJhB0PApYPCyjtW6/jgzKFU+boMKT+p1MMfB4HVRZgh3K5hcMHhTAwr+ 6XoVBeXwsD1smLdBlZerhfSwfggbC5gtlCqfl0X9P//8v6EM+Oj0NOlaeE/5XQ9s euAGzf0Pn6nv7c+r79pnOrCpKVuNj7x3QvjAjo93WH4m3dor6tumvf/6Pwyfqb13 QfjDvz/9+xHUP38v/X7pz6dfs53Y8mFA5n9c/LGFKvnY+/HUH4c/fuLTjgsUNaUm FFN7ntXb+uxtYf32i0yf3faksc/ubDb12ZPODw7Zfb99fGjIbnl773DVTu9rH/nw NLRv/+bQeyP3H8+zWbqe/uu65J3//c5TK21Hii6P++eIhxcOl3nbfb/98DdZsWH+ Ca8+bbuw79nsb2oHP1L7wBu2fRn/+MNhZd6YjfuP29a2dGzt9LXPffPXOzPfrr+3 4OZ0f8+6js1z3v7k4U8vPHVJrnkxP2v7mfVfHvphwq11tTdljzcPezH4ivnLdw5c zJZfeP9cj/z5Hff/5rC97FDrL2P/8Mqzw7/c4YgpG2bkah/k1rfn5C6Zc/qFX6db p+/58zeu3Bf+WTTznSKr+PSv7lSK/tC13dK0+Pmtty8/elm8Uzwxrki4cPKeF38T PHfzvt+3FX3iW7Og/XePWRr1i+46QI4YUn8/9HftpoVLs++bGfXhjnX4E5x9Z6n1 s4X+x9YM5v81u/n4xLLhXywZtvvo97OPmMbWzR059+V3Xvh2tu0Pu1auejXsb7c/ KM9Onfn2nPv/+Y9H933w1ez9ly+/t7xu0IZDL52efeuCpZ/nHtj76G/OtM/+1QGX lcv+e9ze/3p19qf3vPlouv2/R//p8KOzk8a2fPH2m9Ypy8X7Zy8vKAzU/Mm1efBb JbM//PZWf/jeX9XHX8qenTT7+c7052/+esvOW2ZXv7z99Nulmx1HPimYteIX4YfG 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 ------------H8W13lYhPQcA6OeByHmkeW--
Sep 13 2004
parent reply teqDruid <me teqdruid.com> writes:
Yes... after firing it up, throw a couple hundred or thousand HTTP POSTS
at it.  There's a sample HTTP Post that I've been throwing at it on the
mango forum. The stdin.readLine is there to terminate the program- once
one is done with it.  The segfault is a bug in mango's socket stuff, and
is unrelated. Once the bug occurs, one cannot simply hit enter to kill it,
as it is frozen.

 I have the latest mango and xmld from andy's site. I need to produce a lib 
 for each of them right, how?

I extracted xmld into mango's directory, and added it to the mango makefile. This way, all one has to do is run the mango makefile, and link the program with the mango lib, and xmld is automagically there. Plus, it's only one more source path to give to dmd, if you're compiling the test file outside the mango directory. John On Tue, 14 Sep 2004 17:47:05 +1200, Regan Heath wrote:
 On Mon, 13 Sep 2004 21:50:34 -0400, Ben Hinkle <bhinkle4 juno.com> wrote:
 I got the example to compile and run.

You got further than I did. I'd like to help too, however, mine simply says 'Access Violation' when I run it, I don't think I compiled it right. :) I have the latest mango and xmld from andy's site. I need to produce a lib for each of them right, how?
 It sits there with
 INFO HTTP Server - Server http::Servlet started on 0.0.0.0:8181 with 1
 accept threads, 10 backlogs
 until I hit enter and then it seg-v's. Is this what is supposed to 
 happen? I
 don't understand what it is doing or what it is supposed to be doing. How
 do I reproduce the bug?

I suspect you're supposed to connect and send a web POST request, attached is a Windows console program I wrote it's really quite neat/useful for debugging tcpip stuff. Included in the zip you'll find post.txt and instructions.txt. To run it type: tcpbot post.txt localhost 8181 it will attempt to connect to localhost on port 8181 the it will carry out the instructions in post.txt. See instructions.txt for a description of how to format post.txt - it's a rough guide. Regan

Sep 14 2004
parent reply Regan Heath <regan netwin.co.nz> writes:
On Tue, 14 Sep 2004 14:56:56 -0400, teqDruid <me teqdruid.com> wrote:
 Yes... after firing it up, throw a couple hundred or thousand HTTP POSTS
 at it.  There's a sample HTTP Post that I've been throwing at it on the
 mango forum. The stdin.readLine is there to terminate the program- once
 one is done with it.  The segfault is a bug in mango's socket stuff, and
 is unrelated. Once the bug occurs, one cannot simply hit enter to kill 
 it,
 as it is frozen.

 I have the latest mango and xmld from andy's site. I need to produce a 
 lib
 for each of them right, how?

I extracted xmld into mango's directory, and added it to the mango makefile. This way, all one has to do is run the mango makefile, and link the program with the mango lib, and xmld is automagically there.

Good idea.. first I have to get mango to compile however.
 Plus,
 it's only one more source path to give to dmd, if you're compiling the
 test file outside the mango directory.

I tried.. D:\D\src\mango>d:\d\dm\bin\make -f win32.make lib d:\d\dm\bin\lib -c -n -p256 obj/mango.lib obj/mango.rsp Digital Mars Librarian Version 8.00n Copyright (C) Digital Mars 2000-2002 All Rights Reserved www.digitalmars.com Error: cannot open response file --- errorlevel 1 the file 'obj/mango.rsp' does not exist. Regan
 John

 On Tue, 14 Sep 2004 17:47:05 +1200, Regan Heath wrote:

 On Mon, 13 Sep 2004 21:50:34 -0400, Ben Hinkle <bhinkle4 juno.com> 
 wrote:
 I got the example to compile and run.

You got further than I did. I'd like to help too, however, mine simply says 'Access Violation' when I run it, I don't think I compiled it right. :) I have the latest mango and xmld from andy's site. I need to produce a lib for each of them right, how?
 It sits there with
 INFO HTTP Server - Server http::Servlet started on 0.0.0.0:8181 with 1
 accept threads, 10 backlogs
 until I hit enter and then it seg-v's. Is this what is supposed to
 happen? I
 don't understand what it is doing or what it is supposed to be doing. 
 How
 do I reproduce the bug?

I suspect you're supposed to connect and send a web POST request, attached is a Windows console program I wrote it's really quite neat/useful for debugging tcpip stuff. Included in the zip you'll find post.txt and instructions.txt. To run it type: tcpbot post.txt localhost 8181 it will attempt to connect to localhost on port 8181 the it will carry out the instructions in post.txt. See instructions.txt for a description of how to format post.txt - it's a rough guide. Regan


-- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
Sep 14 2004
parent reply teqDruid <me teqdruid.com> writes:
I had what appears (to me) to be a similar problem.  All I had to do was
create the obj directory.

I haven't tried compiling on Windows, so I can't be too much help there. 
You may just want to ask on the Mango forum.

John

On Wed, 15 Sep 2004 12:11:00 +1200, Regan Heath wrote:

 On Tue, 14 Sep 2004 14:56:56 -0400, teqDruid <me teqdruid.com> wrote:
 Yes... after firing it up, throw a couple hundred or thousand HTTP POSTS
 at it.  There's a sample HTTP Post that I've been throwing at it on the
 mango forum. The stdin.readLine is there to terminate the program- once
 one is done with it.  The segfault is a bug in mango's socket stuff, and
 is unrelated. Once the bug occurs, one cannot simply hit enter to kill 
 it,
 as it is frozen.

 I have the latest mango and xmld from andy's site. I need to produce a 
 lib
 for each of them right, how?

I extracted xmld into mango's directory, and added it to the mango makefile. This way, all one has to do is run the mango makefile, and link the program with the mango lib, and xmld is automagically there.

Good idea.. first I have to get mango to compile however.
 Plus,
 it's only one more source path to give to dmd, if you're compiling the
 test file outside the mango directory.

I tried.. D:\D\src\mango>d:\d\dm\bin\make -f win32.make lib d:\d\dm\bin\lib -c -n -p256 obj/mango.lib obj/mango.rsp Digital Mars Librarian Version 8.00n Copyright (C) Digital Mars 2000-2002 All Rights Reserved www.digitalmars.com Error: cannot open response file --- errorlevel 1 the file 'obj/mango.rsp' does not exist. Regan
 John

 On Tue, 14 Sep 2004 17:47:05 +1200, Regan Heath wrote:

 On Mon, 13 Sep 2004 21:50:34 -0400, Ben Hinkle <bhinkle4 juno.com> 
 wrote:
 I got the example to compile and run.

You got further than I did. I'd like to help too, however, mine simply says 'Access Violation' when I run it, I don't think I compiled it right. :) I have the latest mango and xmld from andy's site. I need to produce a lib for each of them right, how?
 It sits there with
 INFO HTTP Server - Server http::Servlet started on 0.0.0.0:8181 with 1
 accept threads, 10 backlogs
 until I hit enter and then it seg-v's. Is this what is supposed to
 happen? I
 don't understand what it is doing or what it is supposed to be doing. 
 How
 do I reproduce the bug?

I suspect you're supposed to connect and send a web POST request, attached is a Windows console program I wrote it's really quite neat/useful for debugging tcpip stuff. Included in the zip you'll find post.txt and instructions.txt. To run it type: tcpbot post.txt localhost 8181 it will attempt to connect to localhost on port 8181 the it will carry out the instructions in post.txt. See instructions.txt for a description of how to format post.txt - it's a rough guide. Regan



Sep 14 2004
parent Regan Heath <regan netwin.co.nz> writes:
On Tue, 14 Sep 2004 23:35:48 -0400, teqDruid <me teqdruid.com> wrote:

 I had what appears (to me) to be a similar problem.  All I had to do was
 create the obj directory.

I have an obj directory, I can compile it like so: D:\D\src\mango>d:\d\dm\bin\make -f win32.make it creates all the .obj files and mango.exe in the obj directory. Do you know where the 'mango.rsp' file comes from? is it part of the svn repository or is it created by some build step?
 I haven't tried compiling on Windows, so I can't be too much help there.
 You may just want to ask on the Mango forum.

Ok. Thanks. Regan
 John

 On Wed, 15 Sep 2004 12:11:00 +1200, Regan Heath wrote:

 On Tue, 14 Sep 2004 14:56:56 -0400, teqDruid <me teqdruid.com> wrote:
 Yes... after firing it up, throw a couple hundred or thousand HTTP 
 POSTS
 at it.  There's a sample HTTP Post that I've been throwing at it on the
 mango forum. The stdin.readLine is there to terminate the program- once
 one is done with it.  The segfault is a bug in mango's socket stuff, 
 and
 is unrelated. Once the bug occurs, one cannot simply hit enter to kill
 it,
 as it is frozen.

 I have the latest mango and xmld from andy's site. I need to produce a
 lib
 for each of them right, how?

I extracted xmld into mango's directory, and added it to the mango makefile. This way, all one has to do is run the mango makefile, and link the program with the mango lib, and xmld is automagically there.

Good idea.. first I have to get mango to compile however.
 Plus,
 it's only one more source path to give to dmd, if you're compiling the
 test file outside the mango directory.

I tried.. D:\D\src\mango>d:\d\dm\bin\make -f win32.make lib d:\d\dm\bin\lib -c -n -p256 obj/mango.lib obj/mango.rsp Digital Mars Librarian Version 8.00n Copyright (C) Digital Mars 2000-2002 All Rights Reserved www.digitalmars.com Error: cannot open response file --- errorlevel 1 the file 'obj/mango.rsp' does not exist. Regan
 John

 On Tue, 14 Sep 2004 17:47:05 +1200, Regan Heath wrote:

 On Mon, 13 Sep 2004 21:50:34 -0400, Ben Hinkle <bhinkle4 juno.com>
 wrote:
 I got the example to compile and run.

You got further than I did. I'd like to help too, however, mine simply says 'Access Violation' when I run it, I don't think I compiled it right. :) I have the latest mango and xmld from andy's site. I need to produce a lib for each of them right, how?
 It sits there with
 INFO HTTP Server - Server http::Servlet started on 0.0.0.0:8181 with 
 1
 accept threads, 10 backlogs
 until I hit enter and then it seg-v's. Is this what is supposed to
 happen? I
 don't understand what it is doing or what it is supposed to be doing.
 How
 do I reproduce the bug?

I suspect you're supposed to connect and send a web POST request, attached is a Windows console program I wrote it's really quite neat/useful for debugging tcpip stuff. Included in the zip you'll find post.txt and instructions.txt. To run it type: tcpbot post.txt localhost 8181 it will attempt to connect to localhost on port 8181 the it will carry out the instructions in post.txt. See instructions.txt for a description of how to format post.txt - it's a rough guide. Regan




-- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
Sep 14 2004
prev sibling next sibling parent reply Ben Hinkle <bhinkle4 juno.com> writes:
well, you'll have to tell me how to send 1900 POST requests. When I point my
browser at http://localhost:8181 I get a 404 in the browser and "closing
socket handle... socket handle closed" echoed to the console of the server.
So something is happening but I have no idea how to use this server
(needless to say I'm not server-savvy).
Without more hints there isn't much more I can do to debug.

-Ben
Sep 13 2004
parent reply teqDruid <me teqdruid.com> writes:
Just write a quick program to open a connection to port 8181, and have it
send something like the following:
---------------------------
POST /RPC2 HTTP/1.1
Content-Length: 157
Content-Type: text/xml
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.4.2_05
Host: localhost:8181
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

<?xml version="1.0" encoding="ISO-8859-1"?><methodCall><methodName>nnCore.getNode</methodName><params><param><value>1 1</value></param></params></methodCall>
------------------------------

As you can tell, I'm using Java to send it.  I'd send you my app, but
actually I'm using an XML-RPC library to send it, though I don't believe
it need be that complicated.

I'm pretty sure the content is irrevelent, but that's what I've been
testing it with.

You may also need to have your app read the response from the server...
Mine does, but I'm not sure if it's necessary.

John

On Mon, 13 Sep 2004 22:35:38 -0400, Ben Hinkle wrote:

 well, you'll have to tell me how to send 1900 POST requests. When I point my
 browser at http://localhost:8181 I get a 404 in the browser and "closing
 socket handle... socket handle closed" echoed to the console of the server.
 So something is happening but I have no idea how to use this server
 (needless to say I'm not server-savvy).
 Without more hints there isn't much more I can do to debug.
 
 -Ben

Sep 14 2004
parent reply Ben Hinkle <bhinkle4 juno.com> writes:
teqDruid wrote:

 Just write a quick program to open a connection to port 8181, and have it
 send something like the following:
 ---------------------------
 POST /RPC2 HTTP/1.1
 Content-Length: 157
 Content-Type: text/xml
 Cache-Control: no-cache
 Pragma: no-cache
 User-Agent: Java/1.4.2_05
 Host: localhost:8181
 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
 Connection: keep-alive
 
 <?xml version="1.0"

 ------------------------------

I have no idea how to do that. Please post all the code required to reproduce the bug or send me something bhinkle4 at juno.com (if you are interested in pursuing this that is).
 As you can tell, I'm using Java to send it.  I'd send you my app, but
 actually I'm using an XML-RPC library to send it, though I don't believe
 it need be that complicated.
 
 I'm pretty sure the content is irrevelent, but that's what I've been
 testing it with.
 
 You may also need to have your app read the response from the server...
 Mine does, but I'm not sure if it's necessary.

Don't underestimate my lack of knowledge about debugging web servers. :-) The word "may" makes me nervous because that implies a decision I don't know how to make.
 John
 
 On Mon, 13 Sep 2004 22:35:38 -0400, Ben Hinkle wrote:
 
 well, you'll have to tell me how to send 1900 POST requests. When I point
 my browser at http://localhost:8181 I get a 404 in the browser and
 "closing socket handle... socket handle closed" echoed to the console of
 the server. So something is happening but I have no idea how to use this
 server (needless to say I'm not server-savvy).
 Without more hints there isn't much more I can do to debug.
 
 -Ben


Sep 14 2004
parent reply teqDruid <me teqdruid.com> writes:
OK... Below is a small program that uses mango to send a sample POST...
It's a quick hack- I swear this isn't how all my programs look!  Once you
fire up the server- run this... it only iterates 500 times, so you may
have to run it more than once- although on my computer it dies not far
after the 300th request.

BTW... this D HttpClient is MUCH, MUCH faster than the Java one I've been
using.  Props to Kris on Mango, and Walter on DMD (and D).  Kris: you
should really write that paper on the Mango Http server using D's slicing,
and it's speed implications, which I believe I've heard about.  I'd love
to read it in Dobb's.

John


----------------------------
import mango.io.model.IBuffer;
import mango.io.model.IWriter;
import mango.http.client.HttpClient;
import mango.http.server.HttpHeaders;
import std.string;
 
char[] sendText = "Content-Length: 157
Content-Type: text/xml
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.4.2_05
Host: localhost:8181
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

<?xml version=\"1.0\"
encoding=\"ISO-8859-1\"?><methodCall><methodName>nnCore.getNode</methodName><params><param><value>1 1</value></param></params></methodCall>";

class charWriter : IWritable
{
	void write(IWriter w)
	{
		w.put(sendText);
	}
}

public char[] send()
{
	auto HttpClient client = new HttpClient (HttpClient.Post,
"http://localhost:8181/RPC2");
	client.getRequestHeaders.add (HttpHeader.UserAgent, "MyAgent");
	client.getRequestHeaders.add (HttpHeader.Host, client.getUri.getHost());
	client.getRequestHeaders.add (HttpHeader.ContentType, "text/xml");
	client.getRequestHeaders.add (HttpHeader.ContentLength, format("%d",
sendText.length));
	
	IBuffer ib = client.open(new charWriter());
	
	if (!client.isResponseOK)
		throw new Exception(client.getResponse().toString());
	
	return ib.toString();	
}

void main(){
	for(int i=0; i<500; i++) {
		printf("%d\n\0", i);
		send();
	}
}
----------------------------------------


On Tue, 14 Sep 2004 18:43:31 -0400, Ben Hinkle wrote:

 teqDruid wrote:
 
 Just write a quick program to open a connection to port 8181, and have it
 send something like the following:
 ---------------------------
 POST /RPC2 HTTP/1.1
 Content-Length: 157
 Content-Type: text/xml
 Cache-Control: no-cache
 Pragma: no-cache
 User-Agent: Java/1.4.2_05
 Host: localhost:8181
 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
 Connection: keep-alive
 
 <?xml version="1.0"

 ------------------------------

I have no idea how to do that. Please post all the code required to reproduce the bug or send me something bhinkle4 at juno.com (if you are interested in pursuing this that is).
 As you can tell, I'm using Java to send it.  I'd send you my app, but
 actually I'm using an XML-RPC library to send it, though I don't believe
 it need be that complicated.
 
 I'm pretty sure the content is irrevelent, but that's what I've been
 testing it with.
 
 You may also need to have your app read the response from the server...
 Mine does, but I'm not sure if it's necessary.

Don't underestimate my lack of knowledge about debugging web servers. :-) The word "may" makes me nervous because that implies a decision I don't know how to make.
 John
 
 On Mon, 13 Sep 2004 22:35:38 -0400, Ben Hinkle wrote:
 
 well, you'll have to tell me how to send 1900 POST requests. When I point
 my browser at http://localhost:8181 I get a 404 in the browser and
 "closing socket handle... socket handle closed" echoed to the console of
 the server. So something is happening but I have no idea how to use this
 server (needless to say I'm not server-savvy).
 Without more hints there isn't much more I can do to debug.
 
 -Ben



Sep 15 2004
parent Ben Hinkle <bhinkle4 juno.com> writes:
teqDruid wrote:

 OK... Below is a small program that uses mango to send a sample POST...
 It's a quick hack- I swear this isn't how all my programs look!  Once you
 fire up the server- run this... it only iterates 500 times, so you may
 have to run it more than once- although on my computer it dies not far
 after the 300th request.

ok thanks. One thing I noticed is that the server crashes if I put a call to fullCollect any time after httpServer.start() in your original code. I remember in the past the GC on linux did wierd things so this might be another bug along those lines. The funny thing is when I run that same code in gdb it doesn't seg-v. Very odd.
 BTW... this D HttpClient is MUCH, MUCH faster than the Java one I've been
 using.  Props to Kris on Mango, and Walter on DMD (and D).  Kris: you
 should really write that paper on the Mango Http server using D's slicing,
 and it's speed implications, which I believe I've heard about.  I'd love
 to read it in Dobb's.
 
 John
 
 
 ----------------------------
 import mango.io.model.IBuffer;
 import mango.io.model.IWriter;
 import mango.http.client.HttpClient;
 import mango.http.server.HttpHeaders;
 import std.string;
  
 char[] sendText = "Content-Length: 157
 Content-Type: text/xml
 Cache-Control: no-cache
 Pragma: no-cache
 User-Agent: Java/1.4.2_05
 Host: localhost:8181
 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
 Connection: keep-alive
 
 <?xml version=\"1.0\"

 
 class charWriter : IWritable
 {
 void write(IWriter w)
 {
 w.put(sendText);
 }
 }
 
 public char[] send()
 {
 auto HttpClient client = new HttpClient (HttpClient.Post,
 "http://localhost:8181/RPC2"); client.getRequestHeaders.add
 (HttpHeader.UserAgent, "MyAgent"); client.getRequestHeaders.add
 (HttpHeader.Host, client.getUri.getHost()); client.getRequestHeaders.add
 (HttpHeader.ContentType, "text/xml"); client.getRequestHeaders.add
 (HttpHeader.ContentLength, format("%d", sendText.length));
 
 IBuffer ib = client.open(new charWriter());
 
 if (!client.isResponseOK)
 throw new Exception(client.getResponse().toString());
 
 return ib.toString();
 }
 
 void main(){
 for(int i=0; i<500; i++) {
 printf("%d\n\0", i);
 send();
 }
 }
 ----------------------------------------
 
 
 On Tue, 14 Sep 2004 18:43:31 -0400, Ben Hinkle wrote:
 
 teqDruid wrote:
 
 Just write a quick program to open a connection to port 8181, and have
 it send something like the following:
 ---------------------------
 POST /RPC2 HTTP/1.1
 Content-Length: 157
 Content-Type: text/xml
 Cache-Control: no-cache
 Pragma: no-cache
 User-Agent: Java/1.4.2_05
 Host: localhost:8181
 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
 Connection: keep-alive
 
 <?xml version="1.0"



 ------------------------------

I have no idea how to do that. Please post all the code required to reproduce the bug or send me something bhinkle4 at juno.com (if you are interested in pursuing this that is).
 As you can tell, I'm using Java to send it.  I'd send you my app, but
 actually I'm using an XML-RPC library to send it, though I don't believe
 it need be that complicated.
 
 I'm pretty sure the content is irrevelent, but that's what I've been
 testing it with.
 
 You may also need to have your app read the response from the server...
 Mine does, but I'm not sure if it's necessary.

Don't underestimate my lack of knowledge about debugging web servers. :-) The word "may" makes me nervous because that implies a decision I don't know how to make.
 John
 
 On Mon, 13 Sep 2004 22:35:38 -0400, Ben Hinkle wrote:
 
 well, you'll have to tell me how to send 1900 POST requests. When I
 point my browser at http://localhost:8181 I get a 404 in the browser
 and "closing socket handle... socket handle closed" echoed to the
 console of the server. So something is happening but I have no idea how
 to use this server (needless to say I'm not server-savvy).
 Without more hints there isn't much more I can do to debug.
 
 -Ben




Sep 15 2004
prev sibling next sibling parent Ben Hinkle <bhinkle4 juno.com> writes:
note: one thing I noticed is that mango has destructors that reference other
objects. This means when the app can do random things (though I've always
just gotten a seg-v) during a GC. Destructors should only reference the
object being destroyed or system resources (ie non-GC resources). Since a
SIGUSR1 is indicating a paused thread during a GC I now even more strongly
suspect the problem occurs during GC. 

teqDruid wrote:

 So the subject implies that the problem is std.stream... but that's not
 necessarily true.
 
 I'm relatively certain at this point the the freezing issues I've been
 having (plenty of posts on the dsource mango forum, and "SIGUSR1 Makes
 Program Hang" here) are due to std.stream... or some interaction between
 it and mango...  Whenever something std.stream gets linked in (even if it
 isn't used!) the HTTP server freezes after a certain number of requests.
 The number of HTTP requests before failing seems to be inversely
 proportional to the amount of code to process said requests.  That is with
 all my code, I get about 9 to 24 requests in... with a short "canned"
 response, and no reading of the request (sometimes mango responds before
 the client finishes sending!) I'm able to get up to about 1900
 requests.... which is one of the reasons this one took so long to track
 down.
 
 Now that I've figured this out, I'm switch over to all mango IO, which
 I've been planning on doing anyway, but I thought I'd let you all know.
 I haven't been able to pinpoint what in std.stream is causing it... I just
 know that my problem went away when I converted one of my libraries to
 mango, and the problem came back when I put xmld back in, which relies on
 streams- MemoryStream, and the generic Stream.  The good news is there's a
 test case below... the bad news is that it's a little long, and it relies
 on Mango (not sure what version... I'm using SVN HEAD) and Andy's xmld,
 which is available on his website.  I've also had the problem occur with
 some of my own code using std.stream, so I don't think the issue is with
 xmld, but I can't get the issue to manifest without it.  Sorry... but it's
 as short as I could get it.  Haven't tested it on windows, since I don't
 have a working windows box.
 
 Anyway, on the 312th request- every time- all three processes freeze up,
 and the only way to kill it is to send them all a SIGKILL.  To test it,
 fire the rig up, and send a couple hundred POST requests to /RPC2.  I've
 been sending 2500 HTTP POSTs, since sometimes the issue only manifests
 itself at higher numbers.
 
 I'm running DMD 0.101 (was also an issue with DMD 0.98) on Linux.
 
 John
 
 ------------------------------------
 
 import mango.servlet.ServletProvider;
 import mango.servlet.Servlet;
 import mango.log.Logger;
 import mango.log.ConsoleAppender;
 import mango.io.Socket;
 import mango.http.server.HttpServer;
 
 import xmld.xml;
 
 import std.stream;
 
 XmlNode readString(char[] string)
 {
 string ~= " ";
 return readDocument(new MemoryStream(string));
 }
 
 char[] smpl = "<methodResponse>
 <params>
 <param>
 <value>
 <struct>
 <member>
 <name>ID</name>
 <value>
 <string>1 1</string>
 </value>
 </member>
 </struct>
 </value>
 </param>
 </params>
 </methodResponse>";
 
 char[] output = "<?xml version=\"1.0\"?>
 <methodResponse>
 <params>
 <param>
 <value>
 <struct>
 <member>
 <name>ID</name>
 <value>
 <string>1 1</string>
 </value>
 </member>
 </struct>
 </value>
 </param>
 </params>
 </methodResponse>";
 
 class TestServlet : MethodServlet
 {
 public override void doPost (IServletRequest request, IServletResponse
 response) {
 try
 {
 XmlNode n = readString(smpl);
 
 response.setContentType("text/xml");
 response.getWriter().put(output);
 }
 catch (Exception e)
 {
 printf(e.toString() ~ "\n\0");
 }
 }
 
 public void install(ServletProvider provider)
 {
 IRegisteredServlet irs = provider.addServlet (this, "XmlRpc");
 provider.addMapping ("/RPC2", irs);
 }
 }
 
 void main()
 {
 Logger hLogger = Logger.getLogger ("HTTP Server");
 hLogger.setLevel(Logger.Level.Trace);
 hLogger.addAppender(new ConsoleAppender());
 
 InternetAddress bindTo = new InternetAddress(8181);
 ServletProvider sp = new ServletProvider();
 
 TestServlet ts = new TestServlet();
 ts.install(sp);
 
 //The HTTP Server
 HttpServer httpServer = new HttpServer(sp, bindTo, 1, hLogger);
 
 //Go!
 httpServer.start();
 
 //Wait for input, then close it all up
 stdin.readLine();
 }

Sep 14 2004
prev sibling parent reply Ben Hinkle <bhinkle4 juno.com> writes:
teqDruid wrote:

 So the subject implies that the problem is std.stream... but that's not
 necessarily true.
 
 I'm relatively certain at this point the the freezing issues I've been
 having (plenty of posts on the dsource mango forum, and "SIGUSR1 Makes
 Program Hang" here) are due to std.stream... or some interaction between
 it and mango...  Whenever something std.stream gets linked in (even if it
 isn't used!) the HTTP server freezes after a certain number of requests.
 The number of HTTP requests before failing seems to be inversely
 proportional to the amount of code to process said requests.  That is with
 all my code, I get about 9 to 24 requests in... with a short "canned"
 response, and no reading of the request (sometimes mango responds before
 the client finishes sending!) I'm able to get up to about 1900
 requests.... which is one of the reasons this one took so long to track
 down.

[snip] I think this is a bug in the GC with multiple threads on Linux. Here are reproduction steps that (on my machine) hang the GC just like you describe by having two threads running: import std.thread; import std.gc; int main() { Object x; int n; GCStats stats; Thread t = new Thread(delegate int() { Object y; while(1) { y = new Object; Thread.yield(); } return 0; }); t.start(); while(1) { x = new Object; getStats(stats); printf("%u %u %u %u\n",stats.poolsize,stats.usedsize, stats.freeblocks,stats.pageblocks); Thread.yield(); // if (n++ == 1000) fullCollect(); } return 0; } I'm cross-posting to the bugs newsgroup so that the bug doesn't get lost.
Sep 16 2004
parent teqDruid <me teqdruid.com> writes:
Nice!  You have no idea how big of a headache this is (was)... With some
luck, Walter will fix it soon... it's still impeding my progress
(actually, stopping it altogether.)

So the problem isn't implicitly in std.stream, it's just that this happens
when the GC gets run... that makes a lot more sense.  I wonder why this
bug wasn't found sooner?  Am I the only one running DMD on Linux?

Thanks
John

On Thu, 16 Sep 2004 23:27:23 -0400, Ben Hinkle wrote:

 teqDruid wrote:
 
 So the subject implies that the problem is std.stream... but that's not
 necessarily true.
 
 I'm relatively certain at this point the the freezing issues I've been
 having (plenty of posts on the dsource mango forum, and "SIGUSR1 Makes
 Program Hang" here) are due to std.stream... or some interaction between
 it and mango...  Whenever something std.stream gets linked in (even if it
 isn't used!) the HTTP server freezes after a certain number of requests.
 The number of HTTP requests before failing seems to be inversely
 proportional to the amount of code to process said requests.  That is with
 all my code, I get about 9 to 24 requests in... with a short "canned"
 response, and no reading of the request (sometimes mango responds before
 the client finishes sending!) I'm able to get up to about 1900
 requests.... which is one of the reasons this one took so long to track
 down.

[snip] I think this is a bug in the GC with multiple threads on Linux. Here are reproduction steps that (on my machine) hang the GC just like you describe by having two threads running: import std.thread; import std.gc; int main() { Object x; int n; GCStats stats; Thread t = new Thread(delegate int() { Object y; while(1) { y = new Object; Thread.yield(); } return 0; }); t.start(); while(1) { x = new Object; getStats(stats); printf("%u %u %u %u\n",stats.poolsize,stats.usedsize, stats.freeblocks,stats.pageblocks); Thread.yield(); // if (n++ == 1000) fullCollect(); } return 0; } I'm cross-posting to the bugs newsgroup so that the bug doesn't get lost.

Sep 17 2004