diff --git a/package.json b/package.json index 38430d75073..49ca597da8f 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "tomlify-j0.4": "^3.0.0", "uglify-es": "^3.2.1", "v8-compile-cache": "^1.1.0", - "worker-farm": "^1.4.1", + "worker-farm": "^1.5.2", "ws": "^3.3.3" }, "devDependencies": { diff --git a/src/WorkerFarm.js b/src/WorkerFarm.js index 7bc641be9a8..bc3e9860645 100644 --- a/src/WorkerFarm.js +++ b/src/WorkerFarm.js @@ -51,6 +51,13 @@ class WorkerFarm extends Farm { } receive(data) { + if (!this.children[data.child]) { + // This handles premature death + // normally only accurs for workers + // that are still warming up when killed + return; + } + if (data.event) { this.emit(data.event, ...data.args); } else { @@ -79,7 +86,13 @@ class WorkerFarm extends Farm { } end() { - super.end(); + // Force kill all children + this.ending = true; + for (let child in this.children) { + this.stopChild(child); + } + + this.ending = false; shared = null; } diff --git a/src/worker.js b/src/worker.js index cbd068a50ef..22253a66457 100644 --- a/src/worker.js +++ b/src/worker.js @@ -34,3 +34,10 @@ exports.run = async function(path, pkg, options, isWarmUp, callback) { callback(returned); } }; + +process.on('unhandledRejection', function(err) { + // ERR_IPC_CHANNEL_CLOSED happens when the worker is killed before it finishes processing + if (err.code !== 'ERR_IPC_CHANNEL_CLOSED') { + console.error('Unhandled promise rejection:', err.stack); + } +}); diff --git a/yarn.lock b/yarn.lock index 99394dfffc8..e8fcdc632fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5753,7 +5753,7 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -worker-farm@^1.4.1: +worker-farm@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" dependencies: