tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From igaz <thurs...@nomagicsoftware.com>
Subject Re: Getting my head around NIO 'simulated' blocking (trying to)
Date Mon, 25 Mar 2013 03:46:20 GMT
>You need to read the Javadoc more carefully. 

I suggest you take a look at java.io.ByteArrayInputStream (both source and
javadoc).
Perfectly good InputStream (never heard anyone claim otherwise)
Never blocks.
>While the words "blocking
>and "non-blocking" are not used in ServletInputStream blocking IO is the
>only way to implement readLine. 
Nope.  readLine is beyond trivial (just delegates to #read()) -- has nothing
to do with blocking/non-blocking.
Could implement a non-blocking ServletInputStream (only defines extra
readLine method) in a minute or two.
If I had to guess, you're confusing non-blocking io with asynchronous io 
(it's a common mistake).  The servlet 3.0 spec does proscribe asynchronous
reads when servlets access the http request body (and headers as well for
that matter)

The reason that I'm even bringing this up is that more and more web
applications receive an increasing share of their traffic from GPS devices,
cellphones, etc.  And these devices often use comparatively unreliable
networks, where it is not uncommon for tcp segments to arrive seconds apart
(and I mean tcp segments that are part of the same http request body).
In such a case, Tomcat's current NIO connector leaves us in the same old
place: a dedicated thread per socket, in an io-wait state (i.e. blocking). 
If that's the majority of your traffic, that doesn't scale (and that's just
an empirical statement, not a judgment).

Do you really think that is optimal?  I don't and I think (hope) it is
unnecessary.
Now if the spec really does proscribe a java.io.ByteArrayInputStream-like
approach (and it's not in the pdf and it's not in the javadoc), then that's
unfortunate.

Are there tradeoffs with reading (not parsing, just reading) all the bytes
from the http request body before invoking the servlet FilterChain?  Sure.
Although for servlets that access the http request body via
HttpRequest.getParameter('xxxx') (which I submit are the vast majority)
there really is no tradeoff (memory usage is the same).  You certainly
identified one; I can think of others.  And if you're writing an online
backup service, those tradeoffs aren't going to make you very happy.

I'm sure the tomcat committers wouldn't be thrilled with yet another
configuration parameter, yet another code execution path (I know I wouldn't
be) ; maxPostSize is too coarse of course.  Ideally, you want something
where the container could ask the servlet (based upon the dynamic http
request header) - "should I read all of the request body (into memory) or
should I defer reading and let you do it (via request.getInputStream() or
request.getReader()).  This has to be asked *before* invoking the
FilterChain.  Now that is definitely not in the spec (maybe it should be)





--
View this message in context: http://tomcat.10.n6.nabble.com/Getting-my-head-around-NIO-simulated-blocking-trying-to-tp4996773p4996847.html
Sent from the Tomcat - Dev mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message