/*! * Pomelo -- consoleModule serverStop stop/kill * Copyright(c) 2012 fantasyni * MIT Licensed */ var logger = require('pomelo-logger').getLogger('pomelo', __filename); var countDownLatch = require('../util/countDownLatch'); var utils = require('../util/utils'); var Constants = require('../util/constants'); var starter = require('../master/starter'); var exec = require('child_process').exec; module.exports = function(opts) { return new Module(opts); }; module.exports.moduleId = '__console__'; var Module = function(opts) { opts = opts || {}; this.app = opts.app; this.starter = opts.starter; }; Module.prototype.monitorHandler = function(agent, msg, cb) { var serverId = agent.id; switch(msg.signal) { case 'stop': if(agent.type === Constants.RESERVED.MASTER) { return; } this.app.stop(true); break; case 'list': var serverType = agent.type; var pid = process.pid; var heapUsed = (process.memoryUsage().heapUsed/(1024 * 1024)).toFixed(2); var rss = (process.memoryUsage().rss/(1024 * 1024)).toFixed(2); var heapTotal = (process.memoryUsage().heapTotal/(1024 * 1024)).toFixed(2); var uptime = (process.uptime()/60).toFixed(2); utils.invokeCallback(cb, { serverId: serverId, body: {serverId:serverId, serverType: serverType, pid:pid, rss: rss, heapTotal: heapTotal, heapUsed:heapUsed, uptime:uptime} }); break; case 'kill': utils.invokeCallback(cb, serverId); if (agent.type !== 'master') { setTimeout(function() { process.exit(-1); }, Constants.TIME.TIME_WAIT_MONITOR_KILL); } break; case 'addCron': this.app.addCrons([msg.cron]); break; case 'removeCron': this.app.removeCrons([msg.cron]); break; case 'blacklist': if(this.app.isFrontend()) { var connector = this.app.components.__connector__; connector.blacklist = connector.blacklist.concat(msg.blacklist); } break; case 'restart': if(agent.type === Constants.RESERVED.MASTER) { return; } var self = this; var server = this.app.get(Constants.RESERVED.CURRENT_SERVER); utils.invokeCallback(cb, server); process.nextTick(function() { self.app.stop(true); }); break; default: logger.error('receive error signal: %j', msg); break; } }; Module.prototype.clientHandler = function(agent, msg, cb) { var app = this.app; switch(msg.signal) { case 'kill': kill(app, agent, msg, cb); break; case 'stop': stop(app, agent, msg, cb); break; case 'list': list(agent, msg, cb); break; case 'add': add(app, msg, cb); break; case 'addCron': addCron(app, agent, msg, cb); break; case 'removeCron': removeCron(app, agent, msg, cb); break; case 'blacklist': blacklist(agent, msg, cb); break; case 'restart': restart(app, agent, msg, cb); break; default: utils.invokeCallback(cb, new Error('The command cannot be recognized, please check.'), null); break; } }; var kill = function(app, agent, msg, cb) { var sid, record; var serverIds = []; var count = utils.size(agent.idMap); var latch = countDownLatch.createCountDownLatch(count, {timeout: Constants.TIME.TIME_WAIT_MASTER_KILL}, function(isTimeout) { if (!isTimeout) { utils.invokeCallback(cb, null, {code: 'ok'}); } else { utils.invokeCallback(cb, null, {code: 'remained', serverIds: serverIds}); } setTimeout(function() { process.exit(-1); }, Constants.TIME.TIME_WAIT_MONITOR_KILL); }); var agentRequestCallback = function(msg) { for (var i = 0; i < serverIds.length; ++i) { if (serverIds[i] === msg) { serverIds.splice(i,1); latch.done(); break; } } }; for(sid in agent.idMap) { record = agent.idMap[sid]; serverIds.push(record.id); agent.request(record.id, module.exports.moduleId, { signal: msg.signal }, agentRequestCallback); } }; var stop = function(app, agent, msg, cb) { var serverIds = msg.ids; if(!!serverIds.length) { var servers = app.getServers(); app.set(Constants.RESERVED.STOP_SERVERS, serverIds); for(var i=0; i