guvnor
Version:
A node process manager that isn't spanners all the way down
82 lines (65 loc) • 2.25 kB
JavaScript
var Autowire = require('wantsit').Autowire
var ProcessRPC = require('../process/ProcessRPC')
var util = require('util')
var async = require('async')
var ClusterManagerRPC = function () {
ProcessRPC.call(this)
this._clusterManager = Autowire
this._os = Autowire
}
util.inherits(ClusterManagerRPC, ProcessRPC)
ClusterManagerRPC.prototype.reportStatus = function (callback) {
ProcessRPC.prototype.reportStatus.call(this, function (error, status) {
if (error) {
return callback(error)
}
status = status || {}
status.cluster = true
status.workers = []
async.parallel(this._clusterManager.workers.map(function (worker) {
return function (callback) {
if (!worker.remote) {
return callback(undefined, {
id: worker.id,
restarts: worker.totalRestarts,
status: worker.status,
script: worker.script,
debugPort: worker.debugPort
})
}
return worker.remote.reportStatus(function (error, status) {
status = status || {}
status.restarts = worker.totalRestarts
status.id = worker.id
status.status = worker.status
status.script = worker.script
status.debugPort = worker.debugPort
if (error && error.code === 'TIMEOUT') {
// this worker timed out, return basic information so other workers have a chance to reply,
// otherwise the whole call will fail
error = null
}
return callback(error, status)
})
}
}), function (error, result) {
status.workers = result
callback(error, status)
})
}.bind(this))
}
ClusterManagerRPC.prototype.setClusterWorkers = function (workers, callback) {
workers = parseInt(workers, 10)
if (isNaN(workers)) {
return callback(new Error('Invalid number of workers'))
}
if (workers < 1) {
return callback(new Error('A cluster must have at least one worker'))
}
var maxWorkers = this._os.cpus().length
if (workers > maxWorkers) {
return callback(new Error('A cluster cannot have more workers than CPUs'))
}
this._clusterManager.setNumWorkers(workers, callback)
}
module.exports = ClusterManagerRPC