docs/clusterEvents.js.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>node-pm Source: clusterEvents.js</title>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/sunlight.default.css">
<link type="text/css" rel="stylesheet" href="styles/site.cerulean.css">
</head>
<body>
<div class="container-fluid">
<div class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<a class="brand" href="index.html">node-pm</a>
<ul class="nav">
<li class="dropdown">
<a href="modules.list.html" class="dropdown-toggle" data-toggle="dropdown">Modules<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="module-clusterEvents.html">clusterEvents</a>
</li>
<li>
<a href="module-Logger.html">Logger</a>
</li>
<li>
<a href="module-main.html">main</a>
</li>
<li>
<a href="module-master.html">master</a>
</li>
<li>
<a href="module-processEvents.html">processEvents</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="events.list.html" class="dropdown-toggle" data-toggle="dropdown">Events<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="module-master.html#event:shutdown">shutdown</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="row-fluid">
<div class="span12">
<div id="main">
<h1 class="page-title">Source: clusterEvents.js</h1>
<section>
<article>
<pre class="sunlight-highlight-javascript linenums">var Logger = require('./Logger');
var debug = Logger.debug;
var verbose = Logger.verbose;
var error = Logger.error;
var info = Logger.info;
var master = require('./master');
/**
* Register Cluster Events
*
* @module
*
* @author Kevin Smithson <ksmithson@sazze.com>
* @author Craig Thayer <cthayer@sazze.com>
*/
module.exports = (function () {
"use strict";
var forkTimers = {};
var disconnectTimers = {};
var cluster = master.cluster;
var config = require('./config');
// when the master forks a worker
cluster.on('fork', function (worker) {
verbose('worker %d forked', worker.process.pid);
forkTimers[worker.id] = setTimeout(function () {
forkTimeoutHandler(worker, cluster);
}, config.timeouts.start);
});
// when a worker starts executing
cluster.on('online', function (worker) {
verbose('worker %d online', worker.process.pid);
if (master.count == config.n) {
debug('%d workers are now online', config.n);
}
if (forkTimers[worker.id]) {
clearTimeout(forkTimers[worker.id]);
delete forkTimers[worker.id];
}
// register for messages from the worker
worker.on('message', function (message, handle) {
master.workerMessageHandler(message, handle, worker);
});
});
// when a worker starts listening
cluster.on('listening', function (worker, address) {
verbose('worker %d listening on %s:%d', worker.process.pid, address.address, address.port);
if (master.count == config.n) {
debug('%d workers are now listening', config.n);
}
});
// when a worker disconnects
cluster.on('disconnect', function (worker) {
verbose('worker %d disconnect', worker.process.pid);
if (master.disconnectTimers[worker.id]) {
clearTimeout(master.disconnectTimers[worker.id]);
delete master.disconnectTimers[worker.id];
}
master.isRunning(worker, function(running) {
if (running) {
disconnectTimers[worker.id] = setTimeout(function () {
disconnectTimeoutHandler(worker, cluster);
}, config.timeouts.stop);
}
});
});
// when a worker exits
cluster.on('exit', function (worker, code, signal) {
verbose('worker %d exit', worker.process.pid);
if (disconnectTimers[worker.id]) {
clearTimeout(disconnectTimers[worker.id]);
delete disconnectTimers[worker.id];
}
if (worker.suicide) {
debug('worker %d committed suicide', worker.process.pid);
}
debug('worker %d Exit Code: %d', worker.process.pid, code);
if (signal) {
debug('worker %d Exit Signal: %s', worker.process.pid, signal);
}
if (worker.suicide && master.suicideOverrides[worker.id]) {
worker.suicide = false;
delete master.suicideOverrides[worker.id];
}
if (!worker.suicide) {
info('worker %d exited. Restarting....', worker.process.pid);
cluster.fork();
}
});
/**
* Called when worker takes too long to fork
*
* @private
* @param worker
* @param cluster
*/
function forkTimeoutHandler(worker, cluster) {
verbose('worker %d is stuck in fork', worker.process.pid);
if (!cluster.workers[worker.id]) {
return;
}
// something is wrong with this worker. Kill it!
master.suicideOverrides[worker.id] = worker.id;
master.isRunning(worker, function(running) {
if (!running) {
return;
}
try {
debug('sending SIGKILL to worker %d', worker.process.pid);
process.kill(worker.process.pid, 'SIGKILL');
} catch (e) {
// this can happen. don't crash!!
}
});
}
/**
* Called when worker is taking too long to disconnect
*
* @private
* @param worker
* @param cluster
*/
function disconnectTimeoutHandler(worker, cluster) {
verbose('worker %d is stuck in disconnect', worker.process.pid);
// if this is not a suicide we need to preserve that as worker.kill() will make this a suicide
if (!worker.suicide) {
master.suicideOverrides[worker.id] = worker.id;
}
master.isRunning(worker, function(running) {
if (!running) {
return;
}
try {
debug('sending SIGKILL to worker %d', worker.process.pid);
process.kill(worker.process.pid, 'SIGKILL');
} catch (e) {
// this can happen. don't crash!!
}
});
}
})();</pre>
</article>
</section>
</div>
<div class="clearfix"></div>
<footer>
<span class="copyright">
Sazze, Inc Copyright © 2012-2013
</span>
<br />
<span class="jsdoc-message">
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.0-alpha9</a>
on Thu Sep 11 2014 11:45:56 GMT-0700 (PDT) using the <a href="https://github.com/terryweiss/docstrap">DocStrap template</a>.
</span>
</footer>
</div>
<br clear="both">
</div>
</div>
<script src="scripts/sunlight.js"></script>
<script src="scripts/sunlight.javascript.js"></script>
<script src="scripts/sunlight-plugin.doclinks.js"></script>
<script src="scripts/sunlight-plugin.linenumbers.js"></script>
<script src="scripts/sunlight-plugin.menu.js"></script>
<script src="scripts/jquery.min.js"></script>
<script src="scripts/jquery.scrollTo.js"></script>
<script src="scripts/jquery.localScroll.js"></script>
<script src="scripts/bootstrap-dropdown.js"></script>
<script src="scripts/toc.js"></script>
<script> Sunlight.highlightAll({lineNumbers:true, showMenu: true, enableDoclinks :true}); </script>
<script>
$( function () {
$( "#toc" ).toc( {
selectors : "h1,h2,h3,h4",
showAndHide : false,
scrollTo : 60
} );
$( "#toc>ul" ).addClass( "nav nav-pills nav-stacked" );
$( "#main span[id^='toc']" ).addClass( "toc-shim" );
} );
</script>
</body>
</html>