Fix occasional exceptions on SIGINT and SIGTERM
This commit is contained in:
1 parent
6f0e1d66ce
commit
1c9aa493c6
6 files changed
+95
-66
No files matched your search
+19
-15
@@ -94,21 +94,7 @@ if (!cluster.worker) {
|
|||||||
.catch(exitWorkerUngracefully);
|
.catch(exitWorkerUngracefully);
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on("SIGINT", () => {
|
const initPromise = Promise.all([db.connect(), cache.connect()])
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on("SIGTERM", () => {
|
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.all([db.connect(), cache.connect()])
|
|
||||||
.then(() => {
|
.then(() => {
|
||||||
server.start(
|
server.start(
|
||||||
SERVICE_PORT,
|
SERVICE_PORT,
|
||||||
@@ -124,4 +110,22 @@ if (!cluster.worker) {
|
|||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
process.on("SIGINT", () => {
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on("SIGTERM", () => {
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
+19
-15
@@ -90,21 +90,7 @@ if (!cluster.worker) {
|
|||||||
.catch(exitWorkerUngracefully);
|
.catch(exitWorkerUngracefully);
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on("SIGINT", () => {
|
const initPromise = Promise.all([db.connect(), cache.connect()])
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on("SIGTERM", () => {
|
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.all([db.connect(), cache.connect()])
|
|
||||||
.then(() => {
|
.then(() => {
|
||||||
server.start(SERVICE_PORT, SERVICE_ADDRESS, ssl, listener);
|
server.start(SERVICE_PORT, SERVICE_ADDRESS, ssl, listener);
|
||||||
})
|
})
|
||||||
@@ -113,4 +99,22 @@ if (!cluster.worker) {
|
|||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
process.on("SIGINT", () => {
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on("SIGTERM", () => {
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
+19
-15
@@ -94,21 +94,7 @@ if (!cluster.worker) {
|
|||||||
.catch(exitWorkerUngracefully);
|
.catch(exitWorkerUngracefully);
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on("SIGINT", () => {
|
const initPromise = Promise.all([db.connect(), cache.connect()])
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on("SIGTERM", () => {
|
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
Promise.all([db.connect(), cache.connect()])
|
|
||||||
.then(() => {
|
.then(() => {
|
||||||
server.start(SERVICE_PORT, SERVICE_ADDRESS, ssl, listener);
|
server.start(SERVICE_PORT, SERVICE_ADDRESS, ssl, listener);
|
||||||
})
|
})
|
||||||
@@ -117,4 +103,22 @@ if (!cluster.worker) {
|
|||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
process.on("SIGINT", () => {
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on("SIGTERM", () => {
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
+21
-17
@@ -99,28 +99,12 @@ if (!cluster.worker) {
|
|||||||
.catch(exitWorkerUngracefully);
|
.catch(exitWorkerUngracefully);
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on("SIGINT", () => {
|
|
||||||
stopping = true;
|
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on("SIGTERM", () => {
|
|
||||||
stopping = true;
|
|
||||||
server
|
|
||||||
.stop()
|
|
||||||
.then(exitWorkerGracefully)
|
|
||||||
.catch(exitWorkerUngracefully);
|
|
||||||
});
|
|
||||||
|
|
||||||
const _listener = (req, res): void => {
|
const _listener = (req, res): void => {
|
||||||
if (stopping) res.setHeader("Connection", "close");
|
if (stopping) res.setHeader("Connection", "close");
|
||||||
listener(req, res);
|
listener(req, res);
|
||||||
};
|
};
|
||||||
|
|
||||||
Promise.all([db2.connect(), cache.connect()])
|
const initPromise = Promise.all([db2.connect(), cache.connect()])
|
||||||
.then(() => {
|
.then(() => {
|
||||||
server.start(SERVICE_PORT, SERVICE_ADDRESS, ssl, _listener);
|
server.start(SERVICE_PORT, SERVICE_ADDRESS, ssl, _listener);
|
||||||
})
|
})
|
||||||
@@ -129,4 +113,24 @@ if (!cluster.worker) {
|
|||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
process.on("SIGINT", () => {
|
||||||
|
stopping = true;
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on("SIGTERM", () => {
|
||||||
|
stopping = true;
|
||||||
|
initPromise.finally(() => {
|
||||||
|
server
|
||||||
|
.stop()
|
||||||
|
.then(exitWorkerGracefully)
|
||||||
|
.catch(exitWorkerUngracefully);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
+15
-3
@@ -24,6 +24,18 @@ import * as logger from "./logger";
|
|||||||
let respawnTimestamp = 0;
|
let respawnTimestamp = 0;
|
||||||
let tooManyCrashesTimestamp = 0;
|
let tooManyCrashesTimestamp = 0;
|
||||||
|
|
||||||
|
function fork(): cluster.Worker {
|
||||||
|
const w = cluster.fork();
|
||||||
|
w.on("error", (err: NodeJS.ErrnoException) => {
|
||||||
|
// Avoid exception when attempting to kill the process just as it's exiting
|
||||||
|
if (err.code !== "EPIPE") throw err;
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!w.isDead()) throw err;
|
||||||
|
}, 50);
|
||||||
|
});
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
function restartWorker(worker, code, signal): void {
|
function restartWorker(worker, code, signal): void {
|
||||||
const msg = {
|
const msg = {
|
||||||
message: "Worker died",
|
message: "Worker died",
|
||||||
@@ -42,7 +54,7 @@ function restartWorker(worker, code, signal): void {
|
|||||||
respawnTimestamp = Math.max(now, respawnTimestamp + 2000);
|
respawnTimestamp = Math.max(now, respawnTimestamp + 2000);
|
||||||
if (respawnTimestamp === now) {
|
if (respawnTimestamp === now) {
|
||||||
tooManyCrashesTimestamp = now;
|
tooManyCrashesTimestamp = now;
|
||||||
cluster.fork();
|
fork();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +72,7 @@ function restartWorker(worker, code, signal): void {
|
|||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (process.exitCode) return;
|
if (process.exitCode) return;
|
||||||
cluster.fork();
|
fork();
|
||||||
}, respawnTimestamp - now);
|
}, respawnTimestamp - now);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +96,7 @@ export function start(workerCount, servicePort, serviceAddress): void {
|
|||||||
|
|
||||||
if (!workerCount) workerCount = Math.max(2, cpus().length);
|
if (!workerCount) workerCount = Math.max(2, cpus().length);
|
||||||
|
|
||||||
for (let i = 0; i < workerCount; ++i) cluster.fork();
|
for (let i = 0; i < workerCount; ++i) fork();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function stop(): void {
|
export function stop(): void {
|
||||||
|
|||||||
+2
-1
@@ -46,7 +46,8 @@ function closeServer(timeout, callback): void {
|
|||||||
|
|
||||||
const cb = callback;
|
const cb = callback;
|
||||||
callback = null;
|
callback = null;
|
||||||
cb();
|
// Allow some time for connection close events to fire
|
||||||
|
setTimeout(cb, 50);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user