stream: Avoid nextTick warning filling read buffer
authorisaacs <i@izs.me>
Sat, 9 Mar 2013 18:56:17 +0000 (10:56 -0800)
committerisaacs <i@izs.me>
Sun, 10 Mar 2013 18:04:48 +0000 (11:04 -0700)
commitcd2b9f542c34ce59d2df7820a6237f7911c702f3
tree8be4feda3f05e696fe0b716ae24f4d6edec7f1af
parent738347b90433a38538ab298bf38860e83a4abc53
stream: Avoid nextTick warning filling read buffer

In the function that pre-emptively fills the Readable queue, it relies
on a recursion through:

stream.push(chunk) ->
maybeReadMore(stream, state) ->
  if (not reading more and < hwm) stream.read(0) ->
stream._read() ->
stream.push(chunk) -> repeat.

Since this was only calling read() a single time, and then relying on a
future nextTick to collect more data, it ends up causing a nextTick
recursion error (and potentially a RangeError, even) if you have a very
high highWaterMark, and are getting very small chunks pushed
synchronously in _read (as happens with TLS, or many simple test
streams).

This change implements a new approach, so that read(0) is called
repeatedly as long as it is effective (that is, the length keeps
increasing), and thus quickly fills up the buffer for streams such as
these, without any stacks overflowing.
lib/_stream_readable.js
test/simple/test-stream2-unpipe-leak.js