Fix orphan extension processes bug

Issue happens after an exception occurs and existing sessions fail to
finish within the timeout period.
This commit is contained in:
Zaid Abdulla committed 2017-07-17 13:44:49 -07:00
1 parent d74c56f182
commit 4be709a61b
2 files changed
+29 -10

No files matched your search

+26 -9
View File
@@ -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();
}
+3 -1
View File
@@ -41,7 +41,9 @@ server = null
exit = () ->
setTimeout(() ->
process.exit(1)
extensions.killAll(() ->
process.exit(1)
)
, 30000).unref()
cluster.worker?.disconnect()