sazze/node-pm

View on GitHub
docs/clusterEvents.js.html

Summary

Maintainability
Test Coverage
<!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 &lt;ksmithson@sazze.com>
 * @author Craig Thayer &lt;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 &amp;&amp; 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>