You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cm...@yahoo.com on 2001/03/21 23:23:12 UTC

Re: [PATCH] [Bug 1001] - available() method on ServletInputStream always returns 0

Mike, 

I'm not sure I understand ( not your mail - the "available" definition ).

Isn't availabe supposed to return how many bytes can be returned without a
read() on the "primary" source ( that would block ) ? 

What you describe is slightly different - and I'm not sure it's a good
idea. In any case, I would prefer the second choice - have the protocol
return what it has in it's buffers ( if any ). 

Of course, a big question is what is available :-) If the data has been
read by Apache but not yet sent to tomcat - is it available ? Probably so
( AFAIK this shouldn't happen - actual read from network is driven by a
tomcat request and no data is buffered on apache ). But that would be a
bit too complex even for 3.3 ( but may be implemented in a future ajp14 )

I don't think this would have any significant impact on code stability -
since you replace a method that returns 0 to something a bit more acurate,
and I see no problem with adding a patch to 3.3 ( 3.2 is quite close to 
a release, it's up to Marc to decide ). But I'm a bit concerned about the
corectness of the result.


Costin  




On Wed, 21 Mar 2001, Mike Anderson wrote:

> I noticed that this bug was marked RESOLVED/LATER and was wondering if there was any way to get this into 3.2.2 since that is the version that is closest to being released.  I've already found 2 ways to fix this issue but am willing to abide by the groups decision and concentrate on getting this into the 3.3 release instead.
> The 2 ways to fix this are:
> 
> 1.  In BufferedServletInputStream, implement an available() method that returns limit - bytesRead or 0 whichever is greater.  The limit class variable is set to the value of the Content-Length header and bytesRead is the number of bytes read since limit was set (see the attached diff1.txt).  This is the easy fix but doesn't address the feature of available that says it will return the number of bytes that can be read "without blocking".  Obviously, if there is a large amount of data, a read will most likely block at some point depending on how much is asked for, however this prevents a condition where one of the adapters returns 0 because a read hasn't actually been requested from the webserver.
> 
> 2.  Update BufferedServletInputStream to call reqA.available and then update the following files to provide this interface:
>   Request.java
>   RequestImpl.java
>   HttpRequestAdapter.java
>   Ajp12ConnectionHandler.java
>   Ajp13ConnectorRequest.java
>   JNIConnectionHandler.java
>   MsgConnector.java
>   TcpConnector.java
> Each of these classes would need to provide an appropriate available() method.  I've also done the work on these files as well (see the attached diff2.txt) but noticed that since some of the protocols (particularly AJP13) actually have to request a read to fill their internal buffer, the adapter (i.e. Ajp13ConnectorRequest.java) will return a 0 if doRead is called and it exactly empties the internal buffer.  Also the JNIRequestAdapter (in JNIConnectionHandler.java) makes a native call back into the webserver to do the reads and so available is implemented similar to #1 above; it just returns the max of contentLength - bytesRead or 0.  This was because I'm not sure of a way to imp
> 
> After testing both of these, implementation 1 is actually faster and more reliable.  Typically if someone is calling available and they get back a 0, they would block the thread anyways and so it makes some sense to let it block on the read plus it gets around the issue of an adapter requiring one of it's read methods to be called to actually have something available.
> 
> Any response positive or negative would be appreciated so that I know where to focus my energy (i.e. 3.2.2 or 3.3).
> 
> 
> 
>