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:
1 parent
d74c56f182
commit
4be709a61b
2 files changed
+29
-10
No files matched your search
+26
-9
@@ -42,19 +42,23 @@ function run(args, callback) {
|
|||||||
|
|
||||||
if (!processes[scriptName]) {
|
if (!processes[scriptName]) {
|
||||||
let p = childProcess.fork('lib/extension-wrapper', [scriptName]);
|
let p = childProcess.fork('lib/extension-wrapper', [scriptName]);
|
||||||
|
processes[scriptName] = p;
|
||||||
|
|
||||||
p.on('error', function() {
|
p.on('error', function() {
|
||||||
kill(processes[scriptName]);
|
if (process[scriptName] === p) {
|
||||||
delete processes[scriptName];
|
kill(processes[scriptName]);
|
||||||
|
delete processes[scriptName];
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
p.on('disconnect', function() {
|
p.on('disconnect', function() {
|
||||||
kill(processes[scriptName]);
|
if (process[scriptName] === p) {
|
||||||
delete processes[scriptName];
|
kill(processes[scriptName]);
|
||||||
|
delete processes[scriptName];
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
p.on('message', messageHandler);
|
p.on('message', messageHandler);
|
||||||
processes[scriptName] = p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let id = crypto.randomBytes(8).toString('hex');
|
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)
|
if (process.signalCode !== null || process.exitCode !== null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -81,18 +85,31 @@ function kill(process) {
|
|||||||
let t = setInterval(function() {
|
let t = setInterval(function() {
|
||||||
if (process.signalCode !== null || process.exitCode !== null) {
|
if (process.signalCode !== null || process.exitCode !== null) {
|
||||||
clearInterval(t);
|
clearInterval(t);
|
||||||
|
if (callback)
|
||||||
|
callback();
|
||||||
}
|
}
|
||||||
else if (Date.now() > timeToKill) {
|
else if (Date.now() > timeToKill) {
|
||||||
process.kill('SIGKILL');
|
process.kill('SIGKILL');
|
||||||
clearInterval(t);
|
clearInterval(t);
|
||||||
|
if (callback)
|
||||||
|
callback();
|
||||||
}
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function killAll() {
|
function killAll(signal, callback) {
|
||||||
for (let n in processes)
|
let counter = 1;
|
||||||
kill(processes[n]);
|
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
@@ -41,7 +41,9 @@ server = null
|
|||||||
|
|
||||||
exit = () ->
|
exit = () ->
|
||||||
setTimeout(() ->
|
setTimeout(() ->
|
||||||
process.exit(1)
|
extensions.killAll(() ->
|
||||||
|
process.exit(1)
|
||||||
|
)
|
||||||
, 30000).unref()
|
, 30000).unref()
|
||||||
|
|
||||||
cluster.worker?.disconnect()
|
cluster.worker?.disconnect()
|
||||||
|
|||||||
Reference in new issue
Block a user