Mobrovac has submitted this change and it was merged. Change subject: Update restbase to 10d7242 ......................................................................
Update restbase to 10d7242 Simple rebuild to include service-runner v0.2.3 List of changes: xxxxxxx Update node module dependencies Change-Id: Id74eff2b41937750ec5703a537ef018bc43d4e95 --- M node_modules/preq/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json M node_modules/service-runner/lib/logger.js M node_modules/service-runner/node_modules/bunyan/node_modules/mv/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json M node_modules/service-runner/node_modules/js-yaml/node_modules/esprima/package.json M node_modules/service-runner/package.json M node_modules/service-runner/service-runner.js M node_modules/swagger-router/node_modules/js-yaml/node_modules/esprima/package.json 7 files changed, 130 insertions(+), 57 deletions(-) Approvals: Mobrovac: Verified; Looks good to me, approved diff --git a/node_modules/preq/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json b/node_modules/preq/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json index 2b7593c..add87ed 100644 --- a/node_modules/preq/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json +++ b/node_modules/preq/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -49,6 +49,5 @@ ], "directories": {}, "_shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", - "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", - "scripts": {} + "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" } diff --git a/node_modules/service-runner/lib/logger.js b/node_modules/service-runner/lib/logger.js index ed436a7..9de9092 100644 --- a/node_modules/service-runner/lib/logger.js +++ b/node_modules/service-runner/lib/logger.js @@ -167,5 +167,14 @@ } }; +Logger.prototype.close = function() { + var self = this; + self._logger.streams.filter(function(stream) { + return stream.type === 'file'; + }).forEach(function(stream) { + stream.stream.end(); + }); +}; + module.exports = Logger; diff --git a/node_modules/service-runner/node_modules/bunyan/node_modules/mv/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json b/node_modules/service-runner/node_modules/bunyan/node_modules/mv/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json index 2ae619b..420a206 100644 --- a/node_modules/service-runner/node_modules/bunyan/node_modules/mv/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json +++ b/node_modules/service-runner/node_modules/bunyan/node_modules/mv/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json @@ -30,7 +30,7 @@ "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, - "_from": "inherits@2", + "_from": "inherits@^2.0.1", "_npmVersion": "1.3.8", "_npmUser": { "name": "isaacs", diff --git a/node_modules/service-runner/node_modules/js-yaml/node_modules/esprima/package.json b/node_modules/service-runner/node_modules/js-yaml/node_modules/esprima/package.json index 50fe250..77d6cab 100644 --- a/node_modules/service-runner/node_modules/js-yaml/node_modules/esprima/package.json +++ b/node_modules/service-runner/node_modules/js-yaml/node_modules/esprima/package.json @@ -88,6 +88,5 @@ }, "directories": {}, "_shasum": "609ac5c2667eae5433b41eb9ecece2331b41498f", - "_resolved": "https://registry.npmjs.org/esprima/-/esprima-2.0.0.tgz", - "readme": "ERROR: No README data found!" + "_resolved": "https://registry.npmjs.org/esprima/-/esprima-2.0.0.tgz" } diff --git a/node_modules/service-runner/package.json b/node_modules/service-runner/package.json index d2324fb..6e3b41c 100644 --- a/node_modules/service-runner/package.json +++ b/node_modules/service-runner/package.json @@ -1,6 +1,6 @@ { "name": "service-runner", - "version": "0.2.2", + "version": "0.2.3", "description": "Generic nodejs service supervisor / cluster runner", "main": "service-runner.js", "bin": { @@ -49,9 +49,9 @@ "mocha-lcov-reporter": "0.0.1", "coveralls": "2.11.2" }, - "gitHead": "f129942af8a224cbc34f1df75f1b0e8f6a1ba2be", - "_id": "service-runner@0.2.2", - "_shasum": "6ff45871b24a75cb37f3d8497b9b05e41a692078", + "gitHead": "ad47cbfc1c2b0f6f76c21fd1eb1d3e624842dff1", + "_id": "service-runner@0.2.3", + "_shasum": "0a6f1f5da75871855ef77fda621e6ba5fa5beaca", "_from": "service-runner@^0.2.0", "_npmVersion": "1.4.28", "_npmUser": { @@ -69,9 +69,9 @@ } ], "dist": { - "shasum": "6ff45871b24a75cb37f3d8497b9b05e41a692078", - "tarball": "http://registry.npmjs.org/service-runner/-/service-runner-0.2.2.tgz" + "shasum": "0a6f1f5da75871855ef77fda621e6ba5fa5beaca", + "tarball": "http://registry.npmjs.org/service-runner/-/service-runner-0.2.3.tgz" }, "directories": {}, - "_resolved": "https://registry.npmjs.org/service-runner/-/service-runner-0.2.2.tgz" + "_resolved": "https://registry.npmjs.org/service-runner/-/service-runner-0.2.3.tgz" } diff --git a/node_modules/service-runner/service-runner.js b/node_modules/service-runner/service-runner.js index cb27ab9..ac4923a 100755 --- a/node_modules/service-runner/service-runner.js +++ b/node_modules/service-runner/service-runner.js @@ -52,14 +52,31 @@ ServiceRunner.prototype.run = function run(conf) { var self = this; - return this.updateConfig(conf) + var configUpdateAction; + if (cluster.isMaster) { + configUpdateAction = self.updateConfig(conf); + } else { + configUpdateAction = new Promise(function(resolve, reject) { + var timeout = setTimeout(function() { + reject(new Error('Timeout waiting for config in worker ' + process.pid)); + }, 3000); + process.on('message', function(message) { + if (message.type === 'config') { + clearTimeout(timeout); + self.updateConfig(message.body) + .then(resolve); + } else { + reject(new Error('Invalid message received: ' + JSON.stringify(message))); + } + }); + }); + } + return configUpdateAction .then(function() { var config = self.config; - var name = config.package && config.package.name || 'service-runner'; - // display the version if (self.options.displayVersion) { - console.log(name + ' ' + config.package.version); + console.log(config.serviceName + ' ' + config.package.version); process.exit(0); } @@ -69,18 +86,9 @@ return docker(self.options, self.config); } - // Set up the logger - if (!config.logging.name) { - config.logging.name = name; - } self._logger = new Logger(config.logging); - // And the statsd client - if (!config.metrics.name) { - config.metrics.name = name; - } - - if (cluster.isMaster && config.num_workers > 0) { + if (cluster.isMaster && self.config.num_workers > 0) { return self._runMaster(); } else { return self._runWorker(); @@ -105,44 +113,89 @@ return conf; }; -ServiceRunner.prototype.updateConfig = function updateConfig(conf) { - var self = this; - if (conf) { - self.config = this._sanitizeConfig(conf, self.options); - return P.resolve(conf); - } else { - var package_json = {}; - try { - package_json = require(self._basePath + '/' + 'package.json'); - } catch (e) {} +/** + * Loads the config from file, serialized input or Object + * + * @param conf a configuration. + * If undefined - config is loaded from config.yaml file + * If Object - treated as already parsed configuration + * If sting - treated a serialized yaml config + */ +ServiceRunner.prototype.loadConfig = function loadConfig(conf) { + var self = this; + var action; + if (conf && conf instanceof Object) { + // Ready config object, no need to load from FS or parse yaml + action = P.resolve(conf); + } else if (conf && typeof conf === 'string') { + // Yaml source provided as config string + action = P.try(function() { + return yaml.safeLoad(conf); + }); + } else { + // No config provided - load from file and parse yaml. var configFile = this.options.configFile; if (/^\./.test(configFile)) { // resolve relative paths configFile = path.resolve(self._basePath + '/' + configFile); } - return fs.readFileAsync(configFile) + action = fs.readFileAsync(configFile) .then(function(yamlSource) { - self.config = self._sanitizeConfig(yaml.safeLoad(yamlSource), - self.options); - - // Make sure we have a sane config object by pulling in - // package.json info if necessary - var config = self.config; - config.package = package_json; - if (config.info) { - // for backwards compat - var pack = config.package; - pack.name = config.info.name || pack.name; - pack.description = config.info.description || pack.description; - pack.version = config.version || pack.version; - } - }) - .catch(function(e) { - console.error('Error while reading config file: ' + e); - process.exit(1); + return yaml.safeLoad(yamlSource); }); } + + var package_json = {}; + try { + package_json = require(self._basePath + '/' + 'package.json'); + } catch (e) {} + + return action.then(function(config) { + config = self._sanitizeConfig(config, self.options); + config.package = package_json; + if (config.info) { + // for backwards compat + var pack = config.package; + pack.name = config.info.name || pack.name; + pack.description = config.info.description || pack.description; + pack.version = config.version || pack.version; + } + self.config = config; + }) + .catch(function(e) { + console.error('Error while reading config file: ' + e); + process.exit(1); + }); +}; + +/** + * Updates the config and sets instance properties. + * + * @param conf a configuration. + * If undefined - config is loaded from config.yaml file + * If Object - treated as already parsed configuration + * If sting - treated a serialized yaml config + */ +ServiceRunner.prototype.updateConfig = function updateConfig(conf) { + var self = this; + + return self.loadConfig(conf) + .then(function() { + var config = self.config; + var name = config.package && config.package.name || 'service-runner'; + config.serviceName = name; + + // Set up the logger + if (!config.logging.name) { + config.logging.name = name; + } + + // And the statsd client + if (!config.metrics.name) { + config.metrics.name = name; + } + }); }; ServiceRunner.prototype._checkHeartbeat = function() { @@ -202,7 +255,15 @@ process.on('SIGTERM', shutdown_master); // Set up rolling restarts - process.on('SIGHUP', this._rollingRestart.bind(this)); + process.on('SIGHUP', function() { + return self.updateConfig() + .then(function() { + // Recreate loggers + self._logger.close(); + self._logger = new Logger(self.config.logging); + }) + .then(self._rollingRestart.bind(self)); + }); return this._startWorkers(this.config.num_workers) .then(function(workers) { @@ -308,6 +369,10 @@ self._saveBeat(worker); return new P(function(resolve) { fixCloseDisconnectListeners(worker); + worker.send({ + type: 'config', + body: yaml.safeDump(self.config) + }); worker.on('message', function(msg) { if (msg.type === 'startup_finished') { resolve(self._startWorkers(--remainingWorkers)); diff --git a/node_modules/swagger-router/node_modules/js-yaml/node_modules/esprima/package.json b/node_modules/swagger-router/node_modules/js-yaml/node_modules/esprima/package.json index 77d6cab..50fe250 100644 --- a/node_modules/swagger-router/node_modules/js-yaml/node_modules/esprima/package.json +++ b/node_modules/swagger-router/node_modules/js-yaml/node_modules/esprima/package.json @@ -88,5 +88,6 @@ }, "directories": {}, "_shasum": "609ac5c2667eae5433b41eb9ecece2331b41498f", - "_resolved": "https://registry.npmjs.org/esprima/-/esprima-2.0.0.tgz" + "_resolved": "https://registry.npmjs.org/esprima/-/esprima-2.0.0.tgz", + "readme": "ERROR: No README data found!" } -- To view, visit https://gerrit.wikimedia.org/r/236955 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Id74eff2b41937750ec5703a537ef018bc43d4e95 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/services/restbase/deploy Gerrit-Branch: master Gerrit-Owner: Mobrovac <mobro...@wikimedia.org> Gerrit-Reviewer: Eevans <eev...@wikimedia.org> Gerrit-Reviewer: GWicke <gwi...@wikimedia.org> Gerrit-Reviewer: Mobrovac <mobro...@wikimedia.org> Gerrit-Reviewer: Ppchelko <ppche...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits