From b6ce918e0a96bd1814ad734f7479387080324749 Mon Sep 17 00:00:00 2001 From: jlvivero Date: Thu, 28 Sep 2017 11:21:58 -0700 Subject: [PATCH] stream: fix disparity between buffer and the count This changes the disparity of bufferedRequestCount and the actual buffer on file _stream_writable.js PR-URL: https://github.com/nodejs/node/pull/15661 Fixes: https://github.com/nodejs/node/issues/6758 Reviewed-By: Ruben Bridgewater Reviewed-By: Matteo Collina Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- lib/_stream_writable.js | 3 +- .../test-stream-writable-clear-buffer.js | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/sequential/test-stream-writable-clear-buffer.js diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 8251e8e219a519..250bd65f872a78 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -429,6 +429,7 @@ function clearBuffer(stream, state) { } else { state.corkedRequestsFree = new CorkedRequest(state); } + state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one while (entry) { @@ -439,6 +440,7 @@ function clearBuffer(stream, state) { doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently @@ -452,7 +454,6 @@ function clearBuffer(stream, state) { state.lastBufferedRequest = null; } - state.bufferedRequestCount = 0; state.bufferedRequest = entry; state.bufferProcessing = false; } diff --git a/test/sequential/test-stream-writable-clear-buffer.js b/test/sequential/test-stream-writable-clear-buffer.js new file mode 100644 index 00000000000000..dc859e3fb6b362 --- /dev/null +++ b/test/sequential/test-stream-writable-clear-buffer.js @@ -0,0 +1,34 @@ +'use strict'; +const common = require('../common'); +const Stream = require('stream'); +// This test ensures that the _writeableState.bufferedRequestCount and +// the actual buffered request count are the same +const assert = require('assert'); + +class StreamWritable extends Stream.Writable { + constructor() { + super({ objectMode: true }); + } + + // We need a timeout like on the original issue thread + // otherwise the code will never reach our test case + // this means this should go on the sequential folder. + _write(chunk, encoding, cb) { + setTimeout(cb, common.platformTimeout(10)); + } +} + +const testStream = new StreamWritable(); +testStream.cork(); + +for (let i = 1; i <= 5; i++) { + testStream.write(i, function() { + assert.strictEqual( + testStream._writableState.bufferedRequestCount, + testStream._writableState.getBuffer().length, + 'bufferedRequestCount variable is different from the actual length of' + + ' the buffer'); + }); +} + +testStream.end();