Bug fix for mod_fastcgi

Joe Strout <joe-QzMH92Wc/[email protected]>
Newsgroups gmane.comp.web.fastcgi.devel,gmane.spam.detected
Message-ID <[email protected]>
[I posted this on 3/13, but nobody replied, and now I can't find it  
in the archives, so maybe the mailing list burped.  Here's trying  
again.]

I dug into the mod_fastcgi source, and believe I have found (and  
fixed) the problem with timeouts with certain-sized responses.   
Here's what's going on:

It can happen that we already have some data in the  
clientOutputBuffer before calling ap_select and fcgi_buf_socket_recv,  
to receive data into serverInputBuffer.  Then we call  
fcgi_protocol_dequeue, which will return after filling up  
clientOutputBuffer.  Then, if there is still more data to receive  
sitting on the socket itself, we're fine; ap_select will return  
happily on our next iteration and we finish processing the data.  But  
if not -- if we've emptied the socket into serverInputBuffer -- then  
ap_select times out, resulting in the "idle timeout" error.

So there are really two related problems here:

1. The socket_io method (which implements the main state machine)  
uses some heuristics to calculate how long it should wait before  
timing out.  This includes a check for pending data to be sent to the  
client (clientOutputBuffer) -- but does NOT include a check for data  
that's already been received from the socket and is waiting to be  
processed (serverInputBuffer).  I think in this case we want to just  
poll the sockets without waiting at all, so I added an additional  
block before the else clause:

		else if (BufferLength(fr->serverInputBuffer)) {
			/* data already in input buffer, so just poll sockets and continue */
			timeout.tv_sec = 0;
			timeout.tv_usec = 0;
		}

2. When we're in this situation, and ap_select returns 0 indicating  
that no knew data was found, we should not consider it an error as  
long as we still have pending data in serverInputBuffer.  So I  
changed the "if (select_status == 0)" line to

         if (select_status == 0 && !BufferLength(fr->serverInputBuffer))

With these changes, I'm now able to serve files of any size without  
hanging.

How and where do I go about submitting a patch to have this change  
reviewed and rolled into the standard distribution?

Thanks,
- Joe


--
Joe Strout
Inspiring Applications, Inc.
http://www.InspiringApps.com



___________________________________
fastcgi-developers mailing list
http://fastcgi.com/fastcgi-developers/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.