diff options
author | Anna Henningsen <anna@addaleax.net> | 2016-04-03 00:37:49 +0200 |
---|---|---|
committer | James M Snell <jasnell@gmail.com> | 2016-04-11 22:50:45 -0700 |
commit | 819b2d36bcffdb9f33e0e4497ac818d64fe5711d (patch) | |
tree | aea034c641263a520ba467f0ec8e0db2c176dab2 /test/parallel/test-stream-pipe-await-drain.js | |
parent | 5dafb435d8946805cbb25bccb1bfac31139915d1 (diff) | |
download | node-new-819b2d36bcffdb9f33e0e4497ac818d64fe5711d.tar.gz |
stream: Fix readableState.awaitDrain mechanism
In 68990948fe4 (https://github.com/nodejs/node/pull/2325),
the conditions for increasing `readableState.awaitDrain` when
writing to a piping destination returns false were changed so
that they could not actually be met, effectively leaving
`readableState.awaitDrain` with a constant value of 0.
This patch changes the conditions to testing whether the
stream for which `.write()` returned false is still a piping
destination, which was likely the intention of the original
patch.
Fixes: https://github.com/nodejs/node/issues/5820
Fixes: https://github.com/nodejs/node/issues/5257
PR-URL: https://github.com/nodejs/node/pull/6023
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test/parallel/test-stream-pipe-await-drain.js')
-rw-r--r-- | test/parallel/test-stream-pipe-await-drain.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/test/parallel/test-stream-pipe-await-drain.js b/test/parallel/test-stream-pipe-await-drain.js new file mode 100644 index 0000000000..fba99ed456 --- /dev/null +++ b/test/parallel/test-stream-pipe-await-drain.js @@ -0,0 +1,40 @@ +'use strict'; +const common = require('../common'); +const stream = require('stream'); + +// This is very similar to test-stream-pipe-cleanup-pause.js. + +const reader = new stream.Readable(); +const writer1 = new stream.Writable(); +const writer2 = new stream.Writable(); + +// 560000 is chosen here because it is larger than the (default) highWaterMark +// and will cause `.write()` to return false +// See: https://github.com/nodejs/node/issues/5820 +const buffer = Buffer.allocUnsafe(560000); + +reader._read = function(n) {}; + +writer1._write = common.mustCall(function(chunk, encoding, cb) { + this.emit('chunk-received'); + cb(); +}, 1); +writer1.once('chunk-received', function() { + setImmediate(function() { + // This one should *not* get through to writer1 because writer2 is not + // "done" processing. + reader.push(buffer); + }); +}); + +// A "slow" consumer: +writer2._write = common.mustCall(function(chunk, encoding, cb) { + // Not calling cb here to "simulate" slow stream. + + // This should be called exactly once, since the first .write() call + // will return false. +}, 1); + +reader.pipe(writer1); +reader.pipe(writer2); +reader.push(buffer); |