From 4be709a61b065d42d497c2786a957da530cfd601 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Mon, 17 Jul 2017 13:44:49 -0700 Subject: [PATCH] Fix orphan extension processes bug Issue happens after an exception occurs and existing sessions fail to finish within the timeout period. --- lib/extensions.js | 35 ++++++++++++++++++++++++++--------- lib/server.coffee | 4 +++- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/lib/extensions.js b/lib/extensions.js index 3615d1a..80adc40 100644 --- a/lib/extensions.js +++ b/lib/extensions.js @@ -42,19 +42,23 @@ function run(args, callback) { if (!processes[scriptName]) { let p = childProcess.fork('lib/extension-wrapper', [scriptName]); + processes[scriptName] = p; p.on('error', function() { - kill(processes[scriptName]); - delete processes[scriptName]; + if (process[scriptName] === p) { + kill(processes[scriptName]); + delete processes[scriptName]; + } }); p.on('disconnect', function() { - kill(processes[scriptName]); - delete processes[scriptName]; + if (process[scriptName] === p) { + kill(processes[scriptName]); + delete processes[scriptName]; + } }); p.on('message', messageHandler); - processes[scriptName] = p; } let id = crypto.randomBytes(8).toString('hex'); @@ -70,7 +74,7 @@ function run(args, callback) { }; -function kill(process) { +function kill(process, callback) { if (process.signalCode !== null || process.exitCode !== null) return; @@ -81,18 +85,31 @@ function kill(process) { let t = setInterval(function() { if (process.signalCode !== null || process.exitCode !== null) { clearInterval(t); + if (callback) + callback(); } else if (Date.now() > timeToKill) { process.kill('SIGKILL'); clearInterval(t); + if (callback) + callback(); } }, 100); } -function killAll() { - for (let n in processes) - kill(processes[n]); +function killAll(signal, callback) { + let counter = 1; + for (let n in processes) { + ++counter; + kill(processes[n], function() { + if (--counter == 0 && callback) + callback(); + }); + delete processes[n]; + } + if (--counter == 0 && callback) + callback(); } diff --git a/lib/server.coffee b/lib/server.coffee index 7398039..5b8ba11 100644 --- a/lib/server.coffee +++ b/lib/server.coffee @@ -41,7 +41,9 @@ server = null exit = () -> setTimeout(() -> - process.exit(1) + extensions.killAll(() -> + process.exit(1) + ) , 30000).unref() cluster.worker?.disconnect()