close chidl processes when parent exits

This commit is contained in:
Jan Prochazka
2020-05-01 09:35:57 +02:00
parent 17134552ce
commit 933f29afda
9 changed files with 39 additions and 4 deletions

View File

@@ -27,7 +27,12 @@ module.exports = {
}, },
test(req, res) { test(req, res) {
const subprocess = fork(process.argv[1], ['connectProcess']); const subprocess = fork(process.argv[1], ['connectProcess']);
subprocess.on('message', (resp) => res.json(resp)); subprocess.on('message', (resp) => {
const { msgtype } = res;
if (msgtype == 'connected' || msgtype == 'error') {
res.json(resp);
}
});
subprocess.send(req.body); subprocess.send(req.body);
}, },

View File

@@ -24,6 +24,7 @@ module.exports = {
resolve(response); resolve(response);
delete this.requests[msgid]; delete this.requests[msgid];
}, },
handle_ping() {},
async ensureOpened(conid, database) { async ensureOpened(conid, database) {
const existing = this.opened.find((x) => x.conid == conid && x.database == database); const existing = this.opened.find((x) => x.conid == conid && x.database == database);

View File

@@ -14,6 +14,8 @@ module.exports = {
handle_error(conid, { error }) { handle_error(conid, { error }) {
console.log(`Error in server connection ${conid}: ${error}`); console.log(`Error in server connection ${conid}: ${error}`);
}, },
handle_ping() {
},
async ensureOpened(conid) { async ensureOpened(conid) {
const existing = this.opened.find(x => x.conid == conid); const existing = this.opened.find(x => x.conid == conid);

View File

@@ -58,6 +58,8 @@ module.exports = {
jsldata.notifyChangedStats(stats); jsldata.notifyChangedStats(stats);
}, },
handle_ping() {},
create_meta: 'post', create_meta: 'post',
async create({ conid, database }) { async create({ conid, database }) {
const sesid = uuidv1(); const sesid = uuidv1();

View File

@@ -1,13 +1,15 @@
const engines = require('@dbgate/engines'); const engines = require('@dbgate/engines');
const driverConnect = require('../utility/driverConnect'); const driverConnect = require('../utility/driverConnect');
const childProcessChecker = require('../utility/childProcessChecker');
function start() { function start() {
process.on('message', async connection => { childProcessChecker();
process.on('message', async (connection) => {
try { try {
const driver = engines(connection); const driver = engines(connection);
const conn = await driverConnect(driver, connection); const conn = await driverConnect(driver, connection);
const res = await driver.getVersion(conn); const res = await driver.getVersion(conn);
process.send(res); process.send({ msgtype: 'connected', ...res });
} catch (e) { } catch (e) {
console.log(e); console.log(e);
process.send({ msgtype: 'error', error: e.message }); process.send({ msgtype: 'error', error: e.message });

View File

@@ -1,5 +1,6 @@
const engines = require('@dbgate/engines'); const engines = require('@dbgate/engines');
const driverConnect = require('../utility/driverConnect'); const driverConnect = require('../utility/driverConnect');
const childProcessChecker = require('../utility/childProcessChecker');
let systemConnection; let systemConnection;
let storedConnection; let storedConnection;
@@ -67,6 +68,7 @@ async function handleMessage({ msgtype, ...other }) {
} }
function start() { function start() {
childProcessChecker();
process.on('message', async (message) => { process.on('message', async (message) => {
try { try {
await handleMessage(message); await handleMessage(message);

View File

@@ -1,5 +1,6 @@
const engines = require('@dbgate/engines'); const engines = require('@dbgate/engines');
const driverConnect = require('../utility/driverConnect'); const driverConnect = require('../utility/driverConnect');
const childProcessChecker = require('../utility/childProcessChecker');
let systemConnection; let systemConnection;
let storedConnection; let storedConnection;
@@ -29,7 +30,8 @@ async function handleMessage({ msgtype, ...other }) {
} }
function start() { function start() {
process.on('message', async message => { childProcessChecker();
process.on('message', async (message) => {
try { try {
await handleMessage(message); await handleMessage(message);
} catch (e) { } catch (e) {

View File

@@ -3,6 +3,7 @@ const uuidv1 = require('uuid/v1');
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
const _ = require('lodash'); const _ = require('lodash');
const childProcessChecker = require('../utility/childProcessChecker');
const driverConnect = require('../utility/driverConnect'); const driverConnect = require('../utility/driverConnect');
const { jsldir } = require('../utility/directories'); const { jsldir } = require('../utility/directories');
@@ -132,6 +133,7 @@ async function handleMessage({ msgtype, ...other }) {
} }
function start() { function start() {
childProcessChecker();
process.on('message', async (message) => { process.on('message', async (message) => {
try { try {
await handleMessage(message); await handleMessage(message);

View File

@@ -0,0 +1,17 @@
let counter = 0;
function childProcessChecker() {
setInterval(() => {
try {
process.send({ msgtype: 'ping', counter: counter++ });
} catch (ex) {
// This will come once parent dies.
// One way can be to check for error code ERR_IPC_CHANNEL_CLOSED
// and call process.exit()
console.log('parent died', ex.toString());
process.exit();
}
}, 1000);
}
module.exports = childProcessChecker;