From e0d3b758a016bd926e890e5acc71d321faf9bc09 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Sat, 5 Sep 2020 13:50:26 +0200 Subject: [PATCH] stream: improve Writable.destroy performance Avoid nextTick if there are no pending callbacks. PR-URL: https://github.com/nodejs/node/pull/35067 Reviewed-By: Matteo Collina Reviewed-By: Anna Henningsen Reviewed-By: Luigi Pinca Reviewed-By: Ricky Zhou <0x19951125@gmail.com> --- lib/_stream_writable.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 22aee3236c4ea7..2343704b0cdf85 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -45,6 +45,7 @@ const { getHighWaterMark, getDefaultHighWaterMark } = require('internal/streams/state'); +const assert = require('internal/assert'); const { ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED, @@ -826,9 +827,16 @@ ObjectDefineProperties(Writable.prototype, { const destroy = destroyImpl.destroy; Writable.prototype.destroy = function(err, cb) { const state = this._writableState; - if (!state.destroyed) { + + // Invoke pending callbacks. + if ( + state.bufferedIndex < state.buffered.length || + state[kOnFinished].length + ) { + assert(!state.destroyed); process.nextTick(errorBuffer, state); } + destroy.call(this, err, cb); return this; };