master-cluster
Advanced tools
Comparing version 0.1.2 to 0.1.3
(function () { | ||
'use strict'; | ||
var MC = require('../master-cluster'); | ||
function index (req, res) { | ||
// do something with the request and response | ||
console.log('Worker %d received request for "%s"', MC.cluster.worker.id, req.url); | ||
res.end('OK'); | ||
} | ||
@@ -7,0 +11,0 @@ |
@@ -5,4 +5,5 @@ (function () { | ||
var MC = require('../master-cluster') | ||
, worker = require.resolve('./server.js'); | ||
, worker = require.resolve('./server'); | ||
MC.start({exec: worker}); | ||
})(); |
@@ -5,3 +5,3 @@ (function () { | ||
var MC = require('../master-cluster') | ||
, app = require('./app.js') | ||
, app = require('./app') | ||
, http = require('http'); | ||
@@ -17,8 +17,9 @@ | ||
server.listen(3000, function () { | ||
console.log("Listening on %d", 3000); | ||
console.log('Worker %d listening on %d', MC.cluster.worker.id, 3000); | ||
}); | ||
function shutdown () { | ||
function shutdown (err) { | ||
// optional - cleanly close db connections and other resources | ||
if (err) console.error(err); | ||
} | ||
})(); |
@@ -1,5 +0,8 @@ | ||
var cluster = require("cluster") | ||
, reloader = require("./reloader") | ||
, setup = {}; | ||
'use strict'; | ||
var cluster = require('cluster'); | ||
var debug = require('debug')('master-cluster'); | ||
var reloader = require('./reloader'); | ||
var setup = {}; | ||
function start (options) { | ||
@@ -13,11 +16,13 @@ if (! cluster.isMaster) throw new Error('Start can only be run on master!'); | ||
} | ||
if (! options.size) options.size = require("os").cpus().length; | ||
if (! options.size) options.size = require('os').cpus().length; | ||
cluster.setupMaster(options); | ||
var reload = options.reload || options.reload === false ? options.reload : /^dev/.test(process.env.NODE_ENV), counter = 0; | ||
var counter = 0; | ||
var reload = options.reload || options.reload === false ? options.reload : /^dev/.test(process.env.NODE_ENV); | ||
if (reload ) { | ||
reloader.reload(options); | ||
cluster.reset = function () { | ||
eachCluster(options.size, cluster.fork.bind(cluster)); | ||
eachCluster(options.size, fork); | ||
counter = 0; | ||
@@ -27,11 +32,12 @@ } | ||
eachCluster(options.size, cluster.fork.bind(cluster)); | ||
eachCluster(options.size, fork); | ||
cluster.on('disconnect', function (worker) { | ||
debug('Worker %d with pid %s disconnected', worker.id, worker.process.pid); | ||
if (! reload) { | ||
cluster.fork(); | ||
fork(); | ||
return; | ||
} | ||
if (counter > options.size * 3) { | ||
console.error('Application is crashing. Waiting for file change.'); | ||
debug('Application is crashing. Waiting for file change.'); | ||
return; | ||
@@ -44,3 +50,3 @@ } | ||
counter++; | ||
cluster.fork(); | ||
fork(); | ||
}); | ||
@@ -55,2 +61,6 @@ } | ||
function fork () { | ||
cluster.fork().on('error', onWorkerError); | ||
} | ||
function run () { | ||
@@ -60,3 +70,3 @@ if (typeof setup.run === 'undefined') throw new Error('There is nothing to run!'); | ||
var d = require("domain").create(), args = arguments; | ||
var d = require('domain').create(), args = arguments; | ||
d.on('error', onWorkerError); | ||
@@ -76,3 +86,4 @@ for (var i = 0; i < arguments.length; i++) d.add(arguments[i]); | ||
function setFnHandlers (runFn, errorFn) { | ||
setup.run = runFn, setup.error = errorFn || function () {}; | ||
setup.run = runFn; | ||
setup.error = errorFn || function () {}; | ||
return this; | ||
@@ -82,3 +93,3 @@ } | ||
function onWorkerError (err) { | ||
console.error('master-cluster', 'Worker uncaught exception', err.stack); | ||
debug('Worker uncaught exception\n%s', err.stack); | ||
@@ -91,3 +102,4 @@ try { | ||
// But don't keep the process open just for that! | ||
if (typeof killtimer.unref === 'function') killtimer.unref(); | ||
if (typeof killtimer.unref === 'function') | ||
killtimer.unref(); | ||
@@ -97,10 +109,12 @@ // Let the master know we're dead. This will trigger a | ||
// a new worker. | ||
if (cluster.worker && !cluster.worker.suicide) cluster.worker.disconnect(); | ||
if (cluster.worker && !(cluster.worker.exitedAfterDisconnect || cluster.worker.suicide)) | ||
cluster.worker.disconnect(); | ||
// stop everything | ||
if (typeof setup.error === 'function') setup.error(err); | ||
if (typeof setup.error === 'function') | ||
setup.error(err); | ||
} catch (er2) { | ||
// oh well, not much we can do at this point. | ||
console.error('master-cluster', 'Error closing worker down!', er2.stack); | ||
debug('Error closing worker down!\n%s', er2.stack); | ||
} | ||
@@ -107,0 +121,0 @@ } |
@@ -5,3 +5,3 @@ { | ||
"description": "Facilitate using cluster and domain modules, live reload application in development mode on code change.", | ||
"version": "0.1.2", | ||
"version": "0.1.3", | ||
"dependencies": { | ||
@@ -8,0 +8,0 @@ "debug": "^2.0.0", |
@@ -1,5 +0,7 @@ | ||
var fs = require("fs") | ||
, cluster = require("cluster") | ||
, debug = require("debug")("master-cluster") | ||
, moment = require("moment") | ||
'use strict'; | ||
var fs = require('fs') | ||
, cluster = require('cluster') | ||
, debug = require('debug')('master-cluster') | ||
, moment = require('moment') | ||
, cooldown = 100 | ||
@@ -16,3 +18,3 @@ , last = moment() | ||
debug('Watcher started for extensions', rg); | ||
debug('Watcher started for extensions %s', rg.toString()); | ||
walk(path, rg); | ||
@@ -37,3 +39,3 @@ } | ||
function watch (path, rg) { | ||
debug('Watching files in', path); | ||
debug('Watching files in %s', path); | ||
fs.watch(path, function (event, filename) { | ||
@@ -50,6 +52,10 @@ if (skipFile(filename, rg)) return; | ||
try { | ||
debug('Killing worker', worker.id); | ||
worker.kill(); | ||
debug('Killing worker %d', worker.id); | ||
worker.disconnect(); | ||
var timeout = setTimeout(worker.kill.bind(worker), 3000); | ||
worker.on('disconnect', clearTimeout.bind(null, timeout)); | ||
} | ||
catch (e) {} | ||
catch (e) { | ||
debug('Error killing worker %d: %s', worker.id, e.message); | ||
} | ||
}) | ||
@@ -56,0 +62,0 @@ }) |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
11542
198