Merge pull request #1089 from CartoDB/graceful-shutdown

Implement graceful shutdown
This commit is contained in:
Daniel G. Aubert
2019-03-29 15:23:27 +01:00
committed by GitHub
5 changed files with 85 additions and 39 deletions
+9 -2
View File
@@ -4,14 +4,21 @@
Released 2019-mm-dd
Announcements:
- Fix uncaught exception: TypeError: Cannot read property 'id' of undefined
- Implements graceful shutdown for:
- system signals `SIGINT` and `SIGTERM`
- events `uncaughtException`, `unhandledRejection` and, `ENOMEM`
- Experimental support for listing features in a grid when the map uses the dynamic agregation.
- Numeric histogram performance improvement (#1080)
- Fix boolean aggregation layer option not working when numbers of rows are above the threshold (#1082)
- Update deps:
- windshaft@4.13.5:
- camshat@0.64.0
- windshaft@5.0.0:
- Upgrade `tilelive-mapnik` to version `0.6.18-cdb20`
- Upgrade `@carto/tilelive-bridge` to version `2.5.1-cdb12`
- Upgrade `grainstore` to version `1.11.0`, do not hang when child process is not able to generate a Mapnik XML
- Upgrade `grainstore` to version `2.0.0`
- Upgrade `torque.js` to version `3.0.0`
## 7.0.0
Released 2019-02-22
+45 -6
View File
@@ -14,8 +14,9 @@ var logError = console.error.bind(console);
// jshint undef:true
var nodejsVersion = process.versions.node;
if (!semver.satisfies(nodejsVersion, '>=6.9.0')) {
logError(`Node version ${nodejsVersion} is not supported, please use Node.js 6.9 or higher.`);
const { engines } = require('./package.json');
if (!semver.satisfies(nodejsVersion, engines.node)) {
logError(`Node version ${nodejsVersion} is not supported, please use Node.js ${engines.node}.`);
process.exit(1);
}
@@ -177,10 +178,6 @@ process.on('SIGHUP', function() {
});
});
process.on('uncaughtException', function(err) {
global.logger.error('Uncaught exception: ' + err.stack);
});
if (global.gc) {
var gcInterval = Number.isFinite(global.environment.gc_interval) ?
global.environment.gc_interval :
@@ -231,3 +228,45 @@ function getGCTypeValue (type) {
return value;
}
addHandlers(listener, global.logger, 45000);
function addHandlers(listener, logger, killTimeout) {
process.on('uncaughtException', exitProcess(listener, logger, killTimeout));
process.on('unhandledRejection', exitProcess(listener, logger, killTimeout));
process.on('ENOMEM', exitProcess(listener, logger, killTimeout));
process.on('SIGINT', exitProcess(listener, logger, killTimeout));
process.on('SIGTERM', exitProcess(listener, logger, killTimeout));
}
function exitProcess (listener, logger, killTimeout) {
return function exitProcessFn (signal) {
scheduleForcedExit(killTimeout, logger);
let code = 0;
if (!['SIGINT', 'SIGTERM'].includes(signal)) {
const err = signal instanceof Error ? signal : new Error(signal);
signal = undefined;
code = 1;
logger.fatal(err);
} else {
logger.info(`Process has received signal: ${signal}`);
}
logger.info(`Process is going to exit with code: ${code}`);
listener.close(() => global.log4js.shutdown(() => process.exit(code)));
};
}
function scheduleForcedExit (killTimeout, logger) {
// Schedule exit if there is still ongoing work to deal with
const killTimer = setTimeout(() => {
logger.info('Process didn\'t close on time. Force exit');
process.exit(1);
}, killTimeout);
// Don't keep the process open just for this
killTimer.unref();
}
@@ -74,8 +74,8 @@ module.exports = class NamedMapMapConfigProvider extends BaseMapConfigProvider {
JSON.parse(this.config) :
this.config;
} catch (e) {
const error = new Error('malformed config parameter, should be a valid JSON');
this.err = error;
const err = new Error('malformed config parameter, should be a valid JSON');
this.err = err;
return callback(err);
}
+27 -27
View File
@@ -283,9 +283,9 @@
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
},
"camshaft": {
"version": "0.63.4",
"resolved": "https://registry.npmjs.org/camshaft/-/camshaft-0.63.4.tgz",
"integrity": "sha512-v6CpIyL2lCjCCUhksTrUSsmCUcDfjn9BD0ULs9lkz0TUwHfEMy3w2Q14NMsBXCCu0OjuiivnbPNm5XGjQe5Awg==",
"version": "0.64.0",
"resolved": "https://registry.npmjs.org/camshaft/-/camshaft-0.64.0.tgz",
"integrity": "sha512-5FPNdrkNlgfqq+1X2KWfc1MlZ/si8sqPmjogUZSLY/RnJIp+XlS80HDIsF3FYKSvmps9GO8k2Qi73fRll0EyGg==",
"requires": {
"async": "^1.5.2",
"bunyan": "1.8.1",
@@ -297,7 +297,7 @@
"dependencies": {
"request": {
"version": "2.85.0",
"resolved": "http://registry.npmjs.org/request/-/request-2.85.0.tgz",
"resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
"integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
"requires": {
"aws-sign2": "~0.7.0",
@@ -1933,9 +1933,9 @@
}
},
"generic-pool": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.6.1.tgz",
"integrity": "sha512-iMmD/pY4q0+V+f8o4twE9JPeqfNuX+gJAaIPB3B0W1lFkBOtTxBo6B0HxHPgGhzQA8jego7EWopcYq/UDJO2KA=="
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.7.1.tgz",
"integrity": "sha512-ug6DAZoNgWm6q5KhPFA+hzXfBLFQu5sTXxPpv44DmE0A2g+CiHoq9LTVdkXpZMkYVMoGw83F6W+WT0h0MFMK/w=="
},
"get-caller-file": {
"version": "1.0.3",
@@ -1980,9 +1980,9 @@
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
},
"grainstore": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/grainstore/-/grainstore-1.11.0.tgz",
"integrity": "sha512-JuEnCHX+qseEgD+Ii5V8SI7VlbSMSE/Jzq0UWC+sdZFi8mFcz15Nj8EKRkF28Rxj2NoWg2tFYMiUb9h8LQEOdg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/grainstore/-/grainstore-2.0.0.tgz",
"integrity": "sha512-eDCr8kkpvKaenLqomRnYPQT8ARJZh+QzqtCJ+iHCLyj2pAfGSEnnld6XtCnQdbtCgJsFPrUaaWn12DqCmJiDnQ==",
"requires": {
"carto": "0.16.3",
"debug": "~3.1.0",
@@ -2010,9 +2010,9 @@
},
"dependencies": {
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
}
}
},
@@ -2030,9 +2030,9 @@
},
"dependencies": {
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
}
}
},
@@ -2170,7 +2170,7 @@
},
"hoek": {
"version": "4.2.1",
"resolved": "http://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
"integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA=="
},
"hosted-git-info": {
@@ -2762,7 +2762,7 @@
},
"ncp": {
"version": "2.0.0",
"resolved": "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
"resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
"integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
"optional": true
},
@@ -3468,7 +3468,7 @@
},
"rimraf": {
"version": "2.4.5",
"resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
"integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
"optional": true,
"requires": {
@@ -3938,9 +3938,9 @@
}
},
"torque.js": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/torque.js/-/torque.js-2.17.1.tgz",
"integrity": "sha512-jZuw5P3muNoILsmiN2kaclzczYW6h9HBSQo5riEB1ub/oNzmj7FqvFJOJKG3dbsxuAqOMn0+AwcQUC3Fb0YTRw==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/torque.js/-/torque.js-3.0.0.tgz",
"integrity": "sha512-xwxRaf3ftq25BoMySqFMB3aHlhC3o0Xj02peILusijFWJzg+ewd7m+9XxAUBbROC11ZUjW7K5d2bZ48j4RmiTQ==",
"requires": {
"carto": "github:cartodb/carto#85881d99dd7fcf2c4e16478b04db67108d27a50c",
"d3": "3.5.17",
@@ -4139,9 +4139,9 @@
"integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU="
},
"windshaft": {
"version": "4.13.5",
"resolved": "https://registry.npmjs.org/windshaft/-/windshaft-4.13.5.tgz",
"integrity": "sha512-e4ZG+ofpuk74hASiqRTD6OqsNpziiXWzr8V5ZAGzcR3ErmlvaM4rEqLplI7AZ9Y3Hx5KUW0H7veCfxf1vhHQEg==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/windshaft/-/windshaft-5.0.0.tgz",
"integrity": "sha512-OMjOhiJa7tA8Pty41bTAXf9d6uIlMU3aCyzS2/cZ620MfRF6RhORnOMiTa/iV856KAiqWFjl7U1MJnIs2xe0MQ==",
"requires": {
"@carto/mapnik": "3.6.2-carto.11",
"@carto/tilelive-bridge": "github:cartodb/tilelive-bridge#8ce03ffd995cf0986b9d6ee7ffbbf310908625c9",
@@ -4151,7 +4151,7 @@
"cartodb-psql": "0.13.1",
"debug": "3.1.0",
"dot": "1.1.2",
"grainstore": "^1.11.0",
"grainstore": "^2.0.0",
"queue-async": "1.1.0",
"redis-mpool": "0.7.0",
"request": "2.87.0",
@@ -4159,7 +4159,7 @@
"sphericalmercator": "1.0.5",
"tilelive": "5.12.3",
"tilelive-mapnik": "github:cartodb/tilelive-mapnik#3f2021f6c5fd720bf09114ed4e012579564723c0",
"torque.js": "2.17.1",
"torque.js": "^3.0.0",
"underscore": "1.6.0"
}
},
+2 -2
View File
@@ -27,7 +27,7 @@
"@carto/fqdn-sync": "0.2.2",
"basic-auth": "2.0.0",
"body-parser": "1.18.3",
"camshaft": "0.63.4",
"camshaft": "^0.64.0",
"cartodb-psql": "0.13.1",
"cartodb-query-tables": "0.4.0",
"cartodb-redis": "2.1.0",
@@ -49,7 +49,7 @@
"step-profiler": "0.3.0",
"turbo-carto": "0.21.0",
"underscore": "1.6.0",
"windshaft": "4.13.5",
"windshaft": "^5.0.0",
"yargs": "11.1.0"
},
"devDependencies": {