diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 7de77958d56b4c..d87072a967bf2c 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -502,6 +502,7 @@ function clearBuffer(stream, state) { corkReq.finish = onCorkedFinish.bind(undefined, corkReq, state); state.corkedRequestsFree = corkReq; } + state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one while (entry) { @@ -512,6 +513,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 @@ -525,7 +527,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();