From 124dfc5ba20c694c7f8b16fe91e9606250e186f2 Mon Sep 17 00:00:00 2001 From: huzhou Date: Sun, 1 Sep 2013 23:33:41 -0700 Subject: [PATCH 001/182] cluster3 --- LICENSE.md | 14 - Makefile | 30 -- README.md | 258 ---------- TODO.md | 22 - examples/express/express-server.js | 70 --- examples/express/shutdown.js | 20 - examples/express/stop.js | 18 - lib/cache-common.js | 74 +++ lib/cache-mgr.js | 196 ++++++++ lib/cache-usr.js | 344 ++++++++++++++ lib/cluster-emitter.js | 158 ++++++ lib/component-status.js | 335 ------------- lib/ecv.js | 170 ------- lib/index.js | 241 +++------- lib/master.js | 423 +++++++++++++++++ lib/misc.js | 50 -- lib/monitor-app.js | 28 ++ lib/monitor.js | 157 ------ lib/process.js | 633 ------------------------- lib/utils.js | 109 +++++ lib/worker.js | 165 +++++++ package.json | 29 +- ports | 1 - public/css/mon.css | 75 --- public/scripts/jquery.sparkline.min.js | 94 ---- public/scripts/mon-client.js | 79 --- public/views/footer.ejs | 3 - public/views/header.ejs | 19 - public/views/index.ejs | 56 --- public/views/layout.ejs | 99 ---- public/views/logs.ejs | 22 - test/cluster-test.js | 622 ------------------------ test/component-status-test.js | 103 ---- test/lib/cache-test.js | 30 ++ test/lib/cluster-test.js | 25 + test/lib/server.js | 94 ---- test/lib/shutdown.js | 19 - test/lib/stop.js | 19 - test/lib/wsserver.js | 135 ------ test/wscluster-test.js | 234 --------- 40 files changed, 1620 insertions(+), 3653 deletions(-) delete mode 100644 LICENSE.md delete mode 100644 Makefile delete mode 100644 README.md delete mode 100644 TODO.md delete mode 100644 examples/express/express-server.js delete mode 100644 examples/express/shutdown.js delete mode 100644 examples/express/stop.js create mode 100644 lib/cache-common.js create mode 100644 lib/cache-mgr.js create mode 100644 lib/cache-usr.js create mode 100644 lib/cluster-emitter.js delete mode 100644 lib/component-status.js delete mode 100644 lib/ecv.js create mode 100644 lib/master.js delete mode 100644 lib/misc.js create mode 100644 lib/monitor-app.js delete mode 100644 lib/monitor.js delete mode 100644 lib/process.js create mode 100644 lib/utils.js create mode 100644 lib/worker.js delete mode 100644 ports delete mode 100644 public/css/mon.css delete mode 100644 public/scripts/jquery.sparkline.min.js delete mode 100644 public/scripts/mon-client.js delete mode 100644 public/views/footer.ejs delete mode 100644 public/views/header.ejs delete mode 100644 public/views/index.ejs delete mode 100644 public/views/layout.ejs delete mode 100644 public/views/logs.ejs delete mode 100644 test/cluster-test.js delete mode 100644 test/component-status-test.js create mode 100644 test/lib/cache-test.js create mode 100644 test/lib/cluster-test.js delete mode 100644 test/lib/server.js delete mode 100644 test/lib/shutdown.js delete mode 100644 test/lib/stop.js delete mode 100644 test/lib/wsserver.js delete mode 100644 test/wscluster-test.js diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 0b83ae3..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,14 +0,0 @@ -Copyright 2012 eBay Software Foundation - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - diff --git a/Makefile b/Makefile deleted file mode 100644 index 805684e..0000000 --- a/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -all: clean install test - -clean: - -rm -fr node_modules - -install: - npm install;\ - npm link; - -.PHONY : test -test: - export NODE_PATH=./node_modules;\ - node_modules/nodeunit/bin/nodeunit test/cluster-test.js - -test-debug: - export NODE_PATH=./node_modules;\ - node --debug-brk node_modules/nodeunit/bin/nodeunit test - -test-part: - export NODE_PATH=./node_modules;\ - node_modules/nodeunit/bin/nodeunit test--reporter dot --output ../../reports - -unpublish: - npm --registry $(REGISTRY) unpublish - -publish: - npm --registry $(REGISTRY) publish - -refresh: - npm --registry $(REGISTRY) publish --force diff --git a/README.md b/README.md deleted file mode 100644 index 484095a..0000000 --- a/README.md +++ /dev/null @@ -1,258 +0,0 @@ -## What is cluster2 - -![Travis status](https://secure.travis-ci.org/ql-io/cluster2.png) - -NOTE: For node (<=0.6.x), use cluster2 version 0.3.1 - -cluster2 is a node.js (>= 0.8.x) compatible multi-process management module. This module grew out of -our needs in operationalizing node.js for [ql.io](https://github.com/ql-io/ql.io) at eBay. Built on -node's `cluster`, cluster2 adds several safeguards and utility functions to help support real-world -production scenarios: - -* Scriptable start, shutdown and stop flows -* Worker monitoring for process deaths -* Worker recycling -* Graceful shutdown -* Idle timeouts -* Validation hooks (for other tools to monitor cluster2 apps) -* Events for logging cluster activities -* Exit with error code when the port is busy to fail start scripts -* Disable monitor -* and more coming soon - -## Usage - -### Getting cluster2 - - npm install cluster2 - - -### Start a TCP Server - - var Cluster = require('cluster2'), - net = require('net'); - var server = net.createServer(function (c) { - c.on('end', function () { - console.log('server disconnected'); - }); - c.write('hello\r\n'); - c.pipe(c); - }); - - var c = new Cluster({ - port: 3000, - cluster: true - }); - c.listen(function(cb) { - cb(server); - }); - -### Start a HTTP Server - - var Cluster = require('cluster2'), - http = require('http'); - var server = http.createServer(function (req, res) { - res.writeHead(200); - res.end('hello'); - }); - var c = new Cluster({ - port: 3000 - }); - c.listen(function(cb) { - cb(server); - }); - -### Start an Express Server - - var Cluster = require('cluster2'), - express = require('express'); - var app = express.createServer(); - app.get('/', function(req, res) { - res.send('hello'); - }); - - var c = new Cluster({ - port: 3000, - }); - c.listen(function(cb) { - cb(app); - }); - -### Stop a Server - - var Cluster = require('cluster2'); - var c = new Cluster(); - c.stop(); - -### Gracefully Shutdown a Server - - var Cluster = require('cluster2'); - var c = new Cluster(); - c.shutdown(); - - -## Options - -Cluster2 takes the following options. - -* `cluster`: When `true` starts a number of workers. Use `false` to start the server as a single - process. Defaults to `true`. -* `pids`: A directory to write PID files for master and workers. -* `port`: Port number for the app, defaults to `3000`. -* `host`: Hostname or IP for the app listening, defaults to `0.0.0.0`. -* `monHost`: Hostname or IP for the monitor listening, defaults to `0.0.0.0`. -* `monPort`: Port number for the monitor URL, defaults to `3001`. Go to `http://:3001` to - view application logs (whatever is written to a `/logs` dir), and npm dependencies. -* `ecv`: ECV stands for "extended content verification". This is an object with the following - additional properties: - * `path`: A path to serve a heart beat. See below. - * `monitor`: A URI to check before emitting a valid heart beat signal - * `control`: When true, allows clients to enable or disable the signal. See below. - validator to validate the runtime health of the app. If found unhealthy, emits a disable -* `noWorkers`: Defaults to `os.cpus().length`. -* `timeout`: Idle socket timeout. Automatically ends incoming sockets if found idle for this - duration. Defaults to `30` seconds. -* `connThreshold`: When the number of connections processed exceeds this numbers, recycle the worker - process. This can help recover from slow leaks in your code or dependent modules. - -## Graceful Shutdown - -The purpose of `shutdown()` is to let the server reject taking new connections, handle all pending -requests and end the connecton so that no request dropped. In order to handling `shutdown()`, the -server must handle `close` events as follows. - - var serving = true; - var server = http.createServer(function (req, res) { - if(!serving) { - // Be nice and send a connection: close as otherwise the client may pump more requests - // on the same connection - res.writeHead(200, { - 'connection': 'close' - }); - } - res.writeHead(200); - res.end('hello'); - }); - server.on('close', function() { - serving = false; - }) - var c = new Cluster({ - port: 3000, - cluster: true - }); - -Completion of `shutdown()` does not necessarily mean that all worker processes are dead immediately. -The workers may take a while to complete processing of current requests and exit. The `shutdown()` -flow only guarantees that the server takes no new connections. - -## Cluster2 Events - -Cluster2 is an `EventEmitter` and emits the following events. - -* `died`: Emitted when a worker dies. This event is also emitted during normal `shutdown()` or - `stop()`. -* `forked`: Emitted when a new worker is forked. -* ``: Emitted when a worker receives a signal (such as `SIGKILL`, `SIGTERM` or `SIGINT`). - -Here is an example that logs these events to the disk. - - var Cluster = require('cluster2'), - http = require('http'); - - var server = http.createServer(function (req, res) { - res.writeHead(200); - res.end('hello'); - }); - var c = new Cluster({ - cluster: true, - port: 3000, - host: 'localhost' - }); - c.on('died', function(pid) { - console.log('Worker ' + pid + ' died'); - }); - c.on('forked', function(pid) { - console.log('Worker ' + pid + ' forked'); - }); - c.on('SIGKILL', function() { - console.log('Got SIGKILL'); - }); - c.on('SIGTERM', function(event) { - console.log('Got SIGTERM - shutting down'); - }); - c.on('SIGINT', function() { - console.log('Got SIGINT'); - }); - c.listen(function(cb) { - cb(server); - }); - -## Routing Traffic - -It is fairly common for proxies or load balancers deployed in front of node clusters, and those -proxies to use monitor URLs to detect the health of the cluster. Cluster2 includes a monitor -at `http://:/ecv`. You can change this by setting the `path` property when initializing -the cluster. - -In case you want to take the node cluster out of rotation from the proxy/load balancer, you can do -so by setting `control` to `true` when initializing the cluster. At runtime, you can send a `POST` -request to `http://:/ecv/disable`. Once this is done, further requests to -`http://:/ecv` will get a network error. You can bring the cluster back to rotation by -sending a `POST` request to `http://:/ecv/enable`. - -Since it will be potentially disastrous to let artibrary clients enable/disable traffic, you should -configure your proxy/load balancer to prevent external traffic to `/ecv*`. - -To test this, bring up an example - - node examples/express/express-server.js - -and send a `GET` request to `http://localhost:3000/ecv` and notice the response. - - HTTP/1.1 200 OK - X-Powered-By: Cluster2 - content-type: text/plain - since: Fri May 18 2012 09:49:32 GMT-0700 (PDT) - cache-control: no-cache - Connection: keep-alive - Transfer-Encoding: chunked - - status=AVAILABLE&ServeTraffic=true&ip=127.0.0.1&hostname=somehost&port=3000&time=Fri May 18 2012 09:49:49 GMT-0700 (PDT) - -To flip the monitor into a disabled state, send a `POST` request to `http://localhost:3000/disable`. - - HTTP/1.1 204 No Content - X-Powered-By: Cluster2 - since: Fri May 18 2012 09:54:25 GMT-0700 (PDT) - cache-control: no-cache - Connection: close - -Subsequent `GET` requests to `http://localhost:3000/ecv` will return a response similar to the one -below. - - HTTP/1.1 400 Bad Request - X-Powered-By: Cluster2 - content-type: text/plain - since: Fri May 18 2012 09:54:25 GMT-0700 (PDT) - cache-control: no-cache - Connection: close - Transfer-Encoding: chunked - - status=DISABLED&ServeTraffic=false&ip=127.0.0.1&hostname=somehost&port=3000&time=Fri May 18 2012 09:55:17 GMT-0700 (PDT) - -To flip the monitor back into an enabled state, send a `POST` request to `http://localhost:3000/enable`. - - -NOTE for 0.4.0 version -The major change is to support a general work delegation pattern between workers & master. In a few scenarios, we've seen duplicate work -done by each worker, that could be delegated to master to address and avoid the duplication of effort. And to make it general enough, we -defined the following delegation pattern: -worker -> master : message -message.type is "delegate" -message.delegate defines the actual message type -message.expect is optional, if not given, the delegate work is silently handled by master (e.g. logging remotely); if given, worker will expect a response message whose -type must equal message.expect; if given expect, the following will be enabled: message.matches defines the matching criteria of the response message, message.timeout defines -the max timeout of the delegate work. message.notification allows delegated work to publish changes detected later. -message.origin keeps the orginal message. -In cluster2, after master receives the message from worker, it would turn it into an event message, and find the proper listener to handle such. -The event handler could be config reader, remote logger, resource externalizer e.g. and they might/might not respond to master based on the expect. \ No newline at end of file diff --git a/TODO.md b/TODO.md deleted file mode 100644 index e05820a..0000000 --- a/TODO.md +++ /dev/null @@ -1,22 +0,0 @@ -* Basic cluster -* St art from js -* Start from command line args -* Add `since` header to report uptime -* `app.close()` during SIGTERM -* ECV -* Skip logging when disk is low -* exit story in worker unclear -* ws connection not working in chrome -* Mon test -* Update paas templates -* Graceful shutdown - stop connection listening -* Drain incoming connections on timeout -* Drain incoming connections on shutdown -* Process restart -* Process recycle -* ws connection causing workers to live -* Check for open port and and exit when busy with an error exit code -* Write start/shutdown/stop to log -* Send counters in bulk -* Traffic in and out - continue connection listening but update ecv -* Raise heartbeats thru logEmitter diff --git a/examples/express/express-server.js b/examples/express/express-server.js deleted file mode 100644 index d8c4007..0000000 --- a/examples/express/express-server.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'), - express = require('express'); - -// -// An express server cluster - -var serving = true; -var app = express.createServer(); -var monApp = express.createServer(); - -app.get('/', function(req, res) { - res.send('hello'); - if(!serving) { - req.connection.end(); - } -}); - -monApp.get('/monapp', function(req, res) { - res.send('Hello from Monitor app'); - if(!serving) { - req.connection.end(); - } -}); - -app.on('close', function() { - serving = false; -}) - -var c = new Cluster({ - port: 3000, - cluster: true, - timeout: 500, - ecv: { - path: '/ecv', // Send GET to this for a heartbeat - control: true, // send POST to /ecv/disable to disable the heartbeat, and to /ecv/enable to enable again - monitor: '/', - validator: function() { - return true; - } - } -}); - -c.on('died', function(pid) { - console.log('Worker ' + pid + ' died'); -}); -c.on('forked', function(pid) { - console.log('Worker ' + pid + ' forked'); -}); - -c.listen(function(cb) { - // You need to pass the app. monApp is optional. - // If monApp is not passed, cluster2 creates one for you. - cb(app, monApp); -}); diff --git a/examples/express/shutdown.js b/examples/express/shutdown.js deleted file mode 100644 index a2a080b..0000000 --- a/examples/express/shutdown.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'); -var c = new Cluster(); - -c.shutdown(); \ No newline at end of file diff --git a/examples/express/stop.js b/examples/express/stop.js deleted file mode 100644 index dc8709c..0000000 --- a/examples/express/stop.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var Cluster = require('../../lib/index.js'); -var c = new Cluster(); -c.stop(); \ No newline at end of file diff --git a/lib/cache-common.js b/lib/cache-common.js new file mode 100644 index 0000000..4456ee9 --- /dev/null +++ b/lib/cache-common.js @@ -0,0 +1,74 @@ +'use strict'; + +var util = require('util'); + +var increment = 0, + writer = function(conn){ + + var writerOfConn = conn.writerOfConn || (function(){ + + var buffer = [], + directWriter = { + + 'write': function write(message){ + + if(!conn.write(message + '\r\n')){ + + conn.writerOfConn = bufferWriter; + conn.once('drain', function(){ + + conn.writerOfConn = directWriter; + while(buffer.length && conn.writerOfConn === directWriter){//stop immediately after writer switched again to bufferWriter + + directWriter.write(buffer.shift()); + } + }); + } + } + }, + bufferWriter = { + + 'write': function write(message){ + + buffer.push(message); + } + }; + + return directWriter; + })(); + + return writerOfConn; + }; + +module.exports = { + 'domainPath': './cluster-cache-domain', + 'persistPath': './cluster-cache-persist', + 'status': { + 'success' : '1', + 'failure' : '-1' + }, + 'types': { + 'GET' : 'get', + 'SET' : 'set', + 'DEL' : 'del' + }, + 'serialize': function serialize(object){ + + return JSON.stringify(object); + }, + 'deserialize': function deserialize(string){ + + return JSON.parse(string); + }, + 'write': function(conn, message){ + + return writer(conn).write(message); + }, + 'nextToken': function(){ + + return util.format('%d-%d', process.pid, increment += 1); + }, + 'changeToken': 'chn' +}; + + diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js new file mode 100644 index 0000000..8f48e6b --- /dev/null +++ b/lib/cache-mgr.js @@ -0,0 +1,196 @@ +'use strict'; + +var common = require('./cache-common.js'), + _ = require('underscore'), + os = require('os'), + fs = require('graceful-fs'), + net = require('net'), + util = require('util'); + +var success = common.status.success, + failure = common.status.failure, + GET = common.types.GET, + SET = common.types.SET, + DEL = common.types.DEL, + CHN = common.changeToken, + domain = os.type().toLowerCase().indexOf('windows') >= 0 ? 8888 : '/tmp/cache.socket.' + process.pid, + domainPath = common.domainPath, + persistPath = common.persistPath, + cache = {}, + expirations = {}, + persists = {}, + conns = []; + +var manager = { + + 'domain': domain, + + 'set': function(conn, token, key, value, persist, expire, overwrite){ + + var old = cache[key], + write = old === undefined || overwrite; + + cache[key] = write ? value : cache[key]; + + common.write(conn, common.serialize({ + 'type': SET, + 'token': token, + 'key': key, + 'status': write ? success: failure + })); + + if(write){ + + var notify = common.serialize({ + 'token': CHN, + 'key': key, + 'value': cache[key] + }); + _.each(conns, function(c){ + common.write(c, notify); + }); + + if(persist || persists[key]){ + persists[key] = cache[key]; + } + if(expire){ + expirations[key] = Date.now() + expire; + } + } + }, + + 'get': function(conn, token, key){ + + common.write(conn, common.serialize({ + 'type': GET, + 'token': token, + 'key': key, + 'value': cache[key], + 'status': success + })); + }, + + 'del': function(conn, token, key){ + + var value = cache[key]; + delete cache[key]; + delete cache[key + '/lock'];//locker released too + + delete persists[key];//no harm even if it's not a persisted key + delete expirations[key]; + + common.write(conn, common.serialize({ + 'type': DEL, + 'token': token, + 'key': key, + 'value': value, + 'status': success + })); + + var notify = common.serialize({ + 'token': CHN, + 'key': key, + 'value': cache[key] + }); + _.each(conns, function(c){ + common.write(c, notify); + }); + } +}; + +exports.createServer = net.createServer; + +exports.app = function(conn) { //'connection' listener + + conns.push(conn); + + var buff = ''; + + conn.setEncoding('utf-8'); + conn.counter = 0; + + conn.on('data', function(data){ + + buff += data; + + var packs = buff.split('\r\n'); + + if(packs.length > 1){ + buff = packs.pop();//whatever the last element is, could be empty string, or partial data, wait till next data arrives. + + _.each(packs, function(pack){ + + conn.counter += 1; + + var command = common.deserialize(pack), + token = command.token, + type = command.type, //['set', 'get', 'del', 'persist'] + key = command.key, //cache key + value = command.value, + persist = command.persist, + expire = command.expire, + overwrite = !command.leaveIfNonNull; // cache value + + manager[type].apply(manager, [conn, token, key, value, persist, expire, overwrite]); + }); + }//otherwise keep buffering... + }); + + conn.once('end', function(){ + console.log('connection closed who has received:' + conn.counter); + + conns = _.without(conns, conn); + conn.destroy(); + }); +}; + +exports.port = domain; + +exports.afterServerStarted = function() { //'listening' listener + + console.log('cache manager started'); + + var persistPathExists = fs.existsSync(persistPath); + + if(persistPathExists){ + //to get the cache from something already persisted + cache = common.deserialize(fs.readFileSync(persistPath, {'encoding':'utf-8'}) || '{}'); + } + + //register domain to where all other users and the master process could watch + fs.writeFileSync(domainPath, domain); + + var updateTask = function updateTask(){ + + //expiration monitoring every 10 seconds + var now = Date.now(); + _.each(expirations, function(due, key){ + if(due >= now){ + + delete cache[key]; + delete cache[key + '/lock'];//locker released too + delete persists[key];//no harm even if it's not a persisted key + delete expirations[key]; + + var notify = common.serialize({ + 'token': CHN, + 'key': key, + 'value': cache[key] + }); + _.each(conns, function(c){ + common.write(c, notify); + }); + } + }); + + //persist every 10 seconds + fs.writeFile(persistPath, common.serialize(persists), function(){ + setTimeout(updateTask, 10000); + }); + }; + + updateTask(); + + return manager; +}; + diff --git a/lib/cache-usr.js b/lib/cache-usr.js new file mode 100644 index 0000000..ab7da0f --- /dev/null +++ b/lib/cache-usr.js @@ -0,0 +1,344 @@ +'use strict'; + +var _ = require('underscore'), + net = require('net'), + util = require('util'), + when = require('when'), + timeout = require('when/timeout'), + fs = require('graceful-fs'), + common = require('./cache-common.js'); + +var success = common.status.success, + failure = common.status.failure, + GET = common.types.GET, + SET = common.types.SET, + DEL = common.types.DEL, + CHN = common.changeToken, + nextToken = common.nextToken, + domain = null, + userDeferred = when.defer(), + handlers = { + + }, + changes = { + + }, + anyChange = function(){ + + }, + conn = null, + reconnect = function reconnect(){ + + var options = _.isString(domain) ? {'path': domain} : domain, + connecting = net.connect(options, + function(){ + console.log(options); + connecting.writable = true; + conn = connecting; + if(!userDeferred.hasBeenResolved){ + userDeferred.resolve(user); + userDeferred.hasBeenResolved = true; + } + }), + buff = ''; + + connecting.setEncoding('utf-8'); + connecting.on('data', function(data){ + + buff += data; + + var packs = buff.split('\r\n'); + + if(packs.length > 1){ + + buff = packs.pop(); + + _.each(packs, function(pack){ + + var response = common.deserialize(pack), + token = response.token, + key = response.key, + value = response.value, + status = response.status; + + if(token !== CHN){ + if(!handlers[token]){ + console.log('pid:' +process.pid + '?token:' + token + ';key:' + key); + process.exit(-1); + } + else{ + handlers[token].apply(user, [status, key, value]); + } + } + else{ + _.each(changes[key], function(whenChange){ + whenChange(value); + }); + anyChange(key, value); + } + }); + } + }); + + connecting.once('error', function(){ + connecting.writable = false; + reconnect(); + }); + }; + +var user = { + + 'copy': null, + + 'get': function(key, loader, options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillGet = when.defer(), + handler = function(status, key, value){ + + if(success === status && value){//got the value + + if(user.copy){//copy the value fetched from master cache, this is needed for consistency restore, unmakeCopy then makeCopy etc. + user.copy[key] = value; + } + + tillGet.resolve(value); + } + else if(loader){//must atomically load the value + + var watchOthers = function(changed){ + //unregister itself immediately + user.unwatch(key, watchOthers); + tillGet.resolve(changed); + }; + + user.watch(key, watchOthers); + user.set(key + '/lock', process.pid, { + 'persist': options.persist, + 'expire': options.expire, + 'wait': wait, + 'leaveIfNonNull': true + }) + .then(function(set){ + //only one of the concurrent writers will be given the set===true + if(set){ + user.unwatch(key, watchOthers);//unregister immediately as i'm about to write the value + var loaded = loader(); + user.set(key, loaded, { + 'persist': options.persist, + 'expire': options.expire, + 'wait': wait + }) + .then(function(){ + tillGet.resolve(loaded); + }); + } + }); + } + else{//got nothing + + tillGet.resolve(null); + } + }; + + if(user.copy && user.copy[key] !== undefined){ + console.log('copy hit'); + //local copy hit + tillGet.resolve(user.copy[key]); + } + else{ + //local copy miss, fetch from master cache + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': GET, + 'token': token, + 'key': key + })); + } + + return (wait > 0 ? timeout(wait, tillGet.promise) : tillGet.promise).ensure(function(){ + delete handlers[token]; + }); + + //return tillGet.promise; + }, + + /** + * @param key string + * @param value Object + * @param options { + persist boolean (whether should survice cache-mgr failure) + expire number (time to live, default null, won't expire) + wait number (timeout after wait expired) + leaveIfNonNull boolean (true means the set will backout if the value exists, default as false, which will overwrite the value) + * } + */ + 'set': function(key, value, options){//must guarantee that value has no '\r\n' in it (if it's a string or any complex type) + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillSet = when.defer(), + handler = function(status, key){ + if(success === status){ + + if(user.copy){//user copy enabled + user.copy[key] = value; + } + + tillSet.resolve(true); + } + else{ + tillSet.resolve(false); + } + }; + + //console.log('expecting token:' + token); + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': SET, + 'token': token, + 'key': key, + 'value': value, + 'persist': options.persist, + 'expire': options.expire, + 'leaveIfNonNull': options.leaveIfNonNull + })); + + return (wait > 0 ? timeout(wait, tillSet.promise) : tillSet.promise).ensure(function(){ + delete handlers[token]; + }); + + //return tillSet.promise; + }, + + /** + * @param key string + * @param wait number (timeout after wait expired) + */ + 'del': function(key, options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillDel = when.defer(), + handler = function(status, key, value){ + + if(success === status){ + + if(user.copy){//user copy enabled + delete user.copy[key]; + } + + tillDel.resolve(value); + } + else{ + tillDel.resolve(null); + } + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': DEL, + 'token': token, + 'key': key + })); + + return (wait > 0 ? timeout(wait, tillDel.promise) : tillDel.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + 'watch': function(key, callback){ + + changes[key] = changes[key] || []; + changes[key].push(callback); + }, + + 'unwatch': function(key, callback){ + + changes[key] = changes[key] || []; + changes[key] = _.without(changes[key], callback); + }, + + 'makeCopy': function(){ + + if(user.copy !== null){//don't let repeated makeCopy request wipe out the existing copies + return; + } + + user.copy = {}; + anyChange = function(key, value){ + //console.log('changed'); + if(value !== null){ + user.copy[key] = value; + } + else{ + delete user.copy[key]; + } + }; + }, + + 'unmakeCopy': function(){ + + user.copy = null; + anyChange = function(){ + + }; + }, + + 'switchDomain': function(d){//only in case of cache-mgr down and needs to switch to a new one + + if(d && domain !== d){ + + domain = d; + if(conn){ + conn.writable = false; + conn.end(); + } + reconnect(); + } + } +}; + +//when the cache-mgr is created by a replacement process, the new domain will be written to the same file being watched below +var tillExists = function(path){ + fs.exists(path, function(exists){ + if(exists){ + fs.watchFile(path, + function(){ + fs.readFile(path, { + 'encoding': 'utf-8' + }, + function(err, d){ + console.log('switching domain:' + d); + user.switchDomain(d); + }); + }); + } + else{ + process.nextTick(function(){ + tillExists(path); + }); + } + }); +}; + +exports.user = function(domain){ + + tillExists(common.domainPath); + + user.switchDomain(domain || fs.readFileSync(common.domainPath, {'encoding':'utf-8'})); + + return userDeferred.promise; +}; + diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js new file mode 100644 index 0000000..6644a9b --- /dev/null +++ b/lib/cluster-emitter.js @@ -0,0 +1,158 @@ +//cluster-emitter is a different EventEmitter which allows all messages send between master & slaves, with an additional parameters as 'target' +//the rest of the api should be the same as EventEmitter, so 'on', 'once', 'removeListener', 'removeAllListeners', 'emit' +'use strict'; + +var cluster = require('cluster'), + _ = require('underscore'); + +var masterEmitter = { + + get workers(){ + return cluster.workers; + }, + + 'handlers': { + + }, + + 'on': function(event, handler){ + + var _this = this; + _this.handlers[event] = _this.handlers[event] || []; + _this.handlers[event].push(handler); + + _.each(_this.workers, function(worker){ + if(!worker.clusterEventHandler){ + worker.clusterEventHandler = function(message){ + _.invoke(_this.handlers[message.type] || [], 'apply', null, message.params); + }; + + worker.on('message', worker.clusterEventHandler); + } + }); + + if(_this.handlers[event].length === 1){ + process.on(event, function(){ + _.invoke(emitter.handlers[event] || [], 'apply', null, arguments); + }); + } + }, + + 'once': function(event, handler){ + + var _this = this, + handleOnce = function handleOnce(){ + handler.apply(null, arguments); + _this.removeListener(event, handleOnce); + }; + _this.on(event, handleOnce); + }, + + 'emit': function(){ + var _this = this, + args = _.toArray(arguments), + event = args.shift(), + targets = args.shift() || _.map(_this.workers, function(worker){return worker.process.pid;}).concat(['self']); + + _.each(_.filter(_this.workers, function(worker){ + _.contains(targets, worker.process.pid); + }), + function(worker){ + try{ + worker.send({ + 'type': event, + 'params': args + }); + } + catch(error){ + console.log('[cluster2] master sending to worker failed'); + } + }); + + if(_.contains(targets, 'master') || _.contains(targets, 'self')){ + process.emit.apply(process, arguments); + } + }, + + 'removeListener': function(event, handler){ + + var _this = this; + _this.handlers[event] = _.without(_this.handlers[event] || [], handler); + + if(_this.handlers[event].length === 0){ + process.removeAllListeners(event); + } + } +}; + +var slaveEmitter = { + + 'handlers': {}, + + 'emit': function(){ + + var args = _.toArray(arguments), + event = args.shift(), + targets = args.shift() || ['master', 'self']; + + if(_.contains(targets, 'master')){ + process.send({ + 'type': event, + 'params': args + }); + } + + if(_.contains(targets, 'self')){ + process.emit.apply(process, arguments); + } + }, + + 'on': function(event, handler){ + + var _this = this; + _this.handlers[event] = _this.handlers[event] || []; + _this.handlers[event].push(handler); + + if(_this.handlers[event].length === 1){ + + process.on(event, function(){ + _.invoke(emitter.handlers[event] || [], 'apply', null, arguments); + }); + } + }, + + 'once': function(event, handler){ + var _this = this, + handleOnce = function handleOnce(){ + handler.apply(null, arguments); + _this.removeListener(event, handleOnce); + }; + _this.on(event, handleOnce); + }, + + 'removeListener': function(event, handler){ + + var _this = this; + _this.handlers[event] = _.without(_this.handlers[event] || [], handler); + + if(_this.handlers[event].length === 0){ + process.removeAllListeners(event); + } + } +}; + +if(cluster.isMaster){ + + exports.emitter = masterEmitter; +} +else{ + + var emitter = exports.emitter = slaveEmitter; + + process.on('message', function(message){ + _.each(emitter.handlers[message.type] || [], function(h){ + h.apply(null, message.params); + }); + }); +} + diff --git a/lib/component-status.js b/lib/component-status.js deleted file mode 100644 index be9b086..0000000 --- a/lib/component-status.js +++ /dev/null @@ -1,335 +0,0 @@ -var _ = require('underscore'), - cluster = require('cluster'), - EventEmitter = require('events').EventEmitter, - util = require('util'); - -function DEFAULT_REDUCER(memoize, element) { - - return { - value : memoize ? memoize.value + element : element//whether it's string or number, most of the scenarios could be handled - }; -} - -function AVERAGE_REDUCER(memoize, element) { - - return { - total : memoize ? memoize.total + element : element, - count : memoize ? memoize.count + 1 : 1, - get value(){ - return this.total / this.count; - } - } -} - -function ARRAY_REDUCER(memoize, element) { - - return { - value : memoize ? memoize.value.concat([element]) : [element] - }; -} - -function FIRST_REDUCER(memoize, element) { - - return { - value : memoize ? memoize.value : element - }; -} - -//componentStatus module allows application to #register their component view handlers -//each handler should take a simple JSON object {'component':', 'view':'[JSON|HTML]'} and produce a result -//which has same keys, except for that view should contain the actual view content, as string to be displayed -var ComponentStatus = exports.ComponentStatus = function(emitter){ - - var components = this.components = {}, - workers = this.workers = {}, - reducers = this.reducers = {}; - - this.emitter = emitter; - emitter.on('new-component-status', function(component){ - - //console.log('[cluster2] master component-status:' + JSON.stringify(component)); - components[component.name] = { - 'reducer': component.reducer, - 'count': components[component.name] ? components[component.name].count + 1 : 1 - }; - - workers[component.worker] = workers[component.worker] || []; - workers[component.worker].push(component.name); - }); - - emitter.on('worker-died', function(worker){ - - _.each(workers[worker] || [], function(component){ - components[component].count = components[component].count - 1; - }); - }); - - this.reducer('default', DEFAULT_REDUCER) - .reducer('sum', DEFAULT_REDUCER) - .reducer('concat', DEFAULT_REDUCER) - .reducer('avg', AVERAGE_REDUCER) - .reducer('array', ARRAY_REDUCER) - .reducer('first', FIRST_REDUCER); -}; - -//worker -ComponentStatus.prototype.register = function(name, handler, reducer, updater){ - - var emitter = this.emitter; - emitter.emit('new-component-status', { - 'name' : name, - 'reducer': reducer, - 'worker': process.pid - }); - - emitter.on('get-component-status', function(component, now, options){ - if(_.isEqual(name, component)){ - emitter.emit( - util.format('get-component-status-%s-%d-%s', component, now, options.worker ? process.pid : ''), - handler(options.params)); - } - }); - - if(updater){ - emitter.on('update-component-status', function(component, now, options, value){ - if(_.isEqual(name, component)){ - emitter.emit( - util.format('update-component-status-%s-%d-%s', component, now, options.worker ? process.pid : ''), - updater(options.params, value)); - } - }); - } - - if(cluster.isWorker){ - var components = this.components = this.components || {}; - components[name] = { - 'reducer': reducer, - 'count': components[name] ? components[name].count + 1 : 1 - }; - } - - return this; -}; - -//master -ComponentStatus.prototype.reducer = function(name, handler){ - - this.reducers[name] = handler; - return this; -} - -//master -ComponentStatus.prototype.getComponents = function(){ - - return _.keys(this.components); -}; - -//master -ComponentStatus.prototype.getStatus = function(component, options){ - - options = options || {}; - - var emitter = this.emitter, - params = options.params || [], - worker = options.worker, - done = options.done, - expects = worker ? 1 : this.components[component].count, - reducer = this.reducers[this.components[component].reducer] || DEFAULT_REDUCER, - now = Date.now(), - event = util.format('get-component-status-%s-%d-%s', component, now, worker || ''), - all = [], - collect = function(status){ - all.push(status); - if((expects -= 1) === 0){ - clearTimeout(timeOut); - emitter.removeListener(event, collect); - done(_.reduce(all, reducer, null).value); - } - }, - timeOut = setTimeout(function(){ - emitter.removeListener(event, collect); - var partial = _.reduce(all, reducer, null); - done(partial ? partial.value : null); - }, 3000); - - //console.log('[cluster2] getStatus:' + component + ';event:' + event + ';expects:' + expects); - emitter.on(event, collect); - //console.log('[cluster2] expects:' + event); - emitter.emit('get-component-status', component, now, params); - - return this; -}; - -ComponentStatus.prototype.setStatus = function(component, options, value){ - - options = options || {}; - - var emitter = this.emitter, - params = options.params || [], - worker = options.worker, - done = options.done, - expects = worker ? 1 : this.components[component].count, - reducer = this.reducers[this.components[component].reducer] || DEFAULT_REDUCER, - now = Date.now(), - event = util.format('update-component-status-%s-%d-%s', component, now, worker || ''), - all = [], - collect = function(status){ - all.push(status); - if((expects -= 1) === 0){ - clearTimeout(timeOut); - emitter.removeListener(event, collect); - done(_.reduce(all, reducer, null).value); - } - }, - timeOut = setTimeout(function(){ - emitter.removeListener(event, collect); - var partial = _.reduce(all, reducer, null); - done(partial ? partial.value : null); - }, 3000); - - //console.log('[cluster2] getStatus:' + component + ';event:' + event + ';expects:' + expects); - emitter.on(event, collect); - //console.log('[cluster2] expects:' + event); - emitter.emit('update-component-status', component, now, params, value); - - return this; -}; - -//default single process emitter is the process itself -var emitter = { - - 'handlers': {}, - - 'emit': function(){ - process.emit.apply(process, arguments); - }, - - 'on': function(event, handler){ - if(!emitter.handlers[event]){ - emitter.handlers[event] = []; - process.on(event, function(){ - var params = arguments; - _.each(emitter.handlers[event], function(handler){ - handler.apply(null, params); - }); - }); - } - emitter.handlers[event].push(handler); - }, - - 'removeListener': function(event, handler){ - emitter.handlers[event] = _.without(emitter.handlers[event] || [], handler); - } -}; - -//overwrite the emitter in case the process is the master of a cluster -if(process.cluster && process.cluster.clustered){ - var workers = process.cluster.workers; - emitter = { - 'handlers': { - - }, - - 'emit': function(){ - var args = _.toArray(arguments), - event = args.shift(); - - //console.log('[cluster2] master emits:' + event + ':\n' + JSON.stringify(args) + ':\nto workers:' + _.keys(workers).length); - _.each(_.values(workers), function(worker){ - try{ - worker.send({ - type: event, - params: args - }); - } - catch(error){ - console.log('[cluster2] master sending to worker failed'); - } - }); - - process.emit.apply(process, arguments); - }, - - 'on': function(event, handler){ - - emitter.handlers[event] = emitter.handlers[event] || []; - emitter.handlers[event].push(handler); - - _.each(_.values(workers), function(worker){ - if(!worker.clusterEventHandler){ - worker.clusterEventHandler = function(message){ - _.invoke(emitter.handlers[message.type] || [], 'apply', null, message.params); - }; - - worker.on('message', worker.clusterEventHandler); - } - }); - - if(emitter.handlers[event].length === 1){ - process.on(event, function(){ - _.invoke(emitter.handlers[event] || [], 'apply', null, arguments); - }); - } - }, - - 'removeListener': function(event, handler){ - - emitter.handlers[event] = _.without(emitter.handlers[event] || [], handler); - - if(emitter.handlers[event].length === 0){ - process.removeAllListeners(event); - } - } - }; - - process.cluster.emitter.on('listening', function(pid){ - //console.log('[cluster2] master found new worker, and will hook up with activated listener:' + pid); - var worker = workers[pid]; - if(!worker.clusterEventHandler){ - worker.clusterEventHandler = function(message){ - _.invoke(emitter.handlers[message.type] || [], 'apply', null, message.params); - }; - - worker.on('message', worker.clusterEventHandler); - } - }); - - process.cluster.emitter.on('died', function(pid){ - //bugfix of slow vi, as some worker died, and we didn't reduce the expectations. - process.emit.apply(process, ['worker-died', pid]); - }); -} - -if(cluster.isWorker){ - emitter = { - 'handlers': {}, - - 'emit': function(){ - - var args = _.toArray(arguments), - event = args.shift(); - - process.send({ - type: event, - params: args - }); - }, - - 'on': function(event, handler){ - this.handlers[event] = this.handlers[event] || []; - this.handlers[event].push(handler); - }, - - 'removeListener': function(event, handler){ - this.handlers[event] = _.without(this.handlers[event] || [], handler); - } - }; - - process.on('message', function(message){ - _.each(emitter.handlers[message.type] || [], function(h){ - h.apply(null, message.params); - }); - }); -} - -exports.componentStatus = new ComponentStatus(emitter); diff --git a/lib/ecv.js b/lib/ecv.js deleted file mode 100644 index 556e3a2..0000000 --- a/lib/ecv.js +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -"use strict"; - -var http = require('http'), - _ = require('underscore'), - os = require('os'); - -/** - * The ECV check sends a "/tables" request to the running server. Anything other than a valid JSON response is - * treated as an error. - */ -var hostname = os.hostname(); - -exports.enable = function(apps, options, emitter, validator) { - var path = options.ecv.path || '/ecv'; - var monitor = options.ecv.monitor || undefined; - var control = options.ecv.control || false; - var root = path || '/ecv'; - var disabled; - - _.each(apps, function (app) { - if (!_.isFunction(app.app.get)) { // this looks to be tcp server ... ecv is app's responsibility! - return; - } - app.app.get(root, function (req, res) { - var tosend = { - date:new Date, - port:_.isArray(options.port) ? options.port[0] : options.port - }; - if (app.disabled) { - // Drop the ball - away(req, res, tosend); - return; - } - var coptions = { - host:'localhost', - port:_.isArray(options.port) ? options.port[0] : options.port, - path:monitor || '/', - method:'GET', - headers:{ - host:'localhost', - connection:'close', - accept:'application/json' - } - }; - var creq = http.request(coptions, function (cres) { - cres.setEncoding('utf8'); - var data = ''; - cres.on('data', function (chunk) { - data = data + chunk; - }); - - cres.on('end', function () { - if (cres.statusCode >= 300) { - // Not happy - unhappy(req, res, tosend); - } - else { - try { - if (validator) { - validator.apply(this, [res.status, res.headers, data]); - } - happy(req, res, tosend); - } - catch (e) { - // Not happy - unhappy(req, res, tosend); - } - } - }); - }); - creq.on('error', function (err) { - unhappy(req, res, tosend.date); - }); - creq.end(); - }); - - if (control === true) { - app.app.post(root + '/disable', function (req, res) { - app.disabled = true; - emitter.emit('warning', { - message:'Disable request received' - }); - if (process.send) { - process.send({ - command:'disable' - }); - } - res.writeHead(204, { - 'since':new Date(Date.now() - process.uptime() * 1000), - 'cache-control':'no-cache', - 'X-Powered-By':'Cluster2', - 'Connection':'close' - }); - res.end() - }); - - app.app.post(root + '/enable', function (req, res) { - app.disabled = false; - emitter.emit('warning', { - message:'Enable request received' - }); - if (process.send) { - process.send({ - command:'enable' - }); - } - res.writeHead(204); - res.end() - }); - - process.on('message', function (message) { - if (message && message.command) { - app.disabled = message.command === 'disable'; - } - }); - } - }); -}; - -function happy(req, res, tosend) { - res.writeHead(200, { - 'content-type': 'text/plain', - 'since': new Date(Date.now() - process.uptime()*1000), - 'cache-control': 'no-cache', - 'X-Powered-By': 'Cluster2', - 'Connection': 'close' - }); - res.write('status=AVAILABLE&ServeTraffic=true&ip='+ req.connection.address()['address'] +'&hostname='+ hostname +'&port=' + tosend.port+ '&time=' + tosend.date.toString()); - res.end(); -} - -function unhappy(req, res, tosend) { - res.writeHead(500, { - 'content-type': 'text/plain', - 'since': new Date(Date.now() - process.uptime()*1000), - 'cache-control': 'no-cache', - 'X-Powered-By': 'Cluster2', - 'Connection': 'close' - }); - res.write('status=WARNING&ServeTraffic=false&ip='+ req.connection.address()['address'] +'&hostname='+ hostname +'&port=' + tosend.port + '&time=' + tosend.date.toString()); - res.end(); -} - -function away(req, res, tosend) { - res.writeHead(400, { - 'content-type': 'text/plain', - 'since': new Date(Date.now() - process.uptime()*1000), - 'cache-control': 'no-cache', - 'X-Powered-By': 'Cluster2', - 'Connection': 'close' - }); - res.write('status=DISABLED&ServeTraffic=false&ip='+ req.connection.address()['address'] +'&hostname='+ hostname +'&port=' + tosend.port + '&time=' + tosend.date.toString()); - res.end(); -} diff --git a/lib/index.js b/lib/index.js index 15d6d64..54fe215 100644 --- a/lib/index.js +++ b/lib/index.js @@ -16,15 +16,12 @@ 'use strict'; -var Process = require('./process.js'), - ecv = require('./ecv.js'), - _ = require('underscore'), +var Master = require('./master.js').Master, + readMasterPid = require('./utils.js').readMasterPid, + when = require('when'), assert = require('assert'), os = require('os'), - util = require('util'), - net = require('net'), - events = require('events'), - Q = require('q'); + _ = require('underscore'); // Trap all uncaught exception here. process.on('uncaughtException', function (error) { @@ -32,197 +29,69 @@ process.on('uncaughtException', function (error) { console.error(error.stack || error); }); -exports.version = require('../package.json').version; -exports.defaultOptions = { - cluster: true, - port: 3000, - monPort: 3001, - ecv: { - path: '/ecv' - }, - monPath: '/', - noWorkers: os.cpus().length -}; - var Cluster = module.exports = function Cluster(options) { - // Extend from EventEmitter - events.EventEmitter.call(this); + + var emitter = require('./cluster-emitter.js').emitter; + + this.options = { + 'emitter': emitter, + 'noWorkers': os.cpus().length, + 'monCreateServer': require('http').createServer, + 'monApp': require('./monitor-app.js').monApp, + 'monPort': 8081, + 'createServer': require('http').createServer, + 'app': null,//must be provided by the options + 'port': 8080, + 'warmUp': function(){ + + }, + 'markOld': null, //should be a function determine if worker is old or not + 'stopTimeout': 60000,//1 min + 'debugPort': 8090 + }; - this.options = {}; - _.extend(this.options, exports.defaultOptions); _.extend(this.options, options); + assert.ok(this.options.monCreateServer); + assert.ok(this.options.monApp); + assert.ok(this.options.monPort); + assert.ok(this.options.createServer); + assert.ok(this.options.app); + assert.ok(this.options.port); assert.notEqual(this.options.port, this.options.monPort, "monitor port & application port cannot use the same!"); -} -util.inherits(Cluster, events.EventEmitter); + _.extend(this, { + 'on': _.bind(emitter.on, emitter), + 'once': _.bind(emitter.once, emitter), + 'removeListener': _.bind(emitter.removeListener, emitter), + 'emit': _.bind(emitter.emit, emitter) + }); +}; /** - * Start the cluster + * @return promise of Master Server starts + * + * listen will create the Master process, and delegate to its#listen + * it gives back a promise for the master's server to be started (monitoring application) */ -Cluster.prototype.listen = function(createApp, cb) { - - var self = this, - options = self.options; - - assert.ok(_.isFunction(createApp), 'createApp must be a function'); - - if(options.cluster) { - var master = new Process({ - pids: process.cwd() + '/pids', - logs: process.cwd() + '/logs', - port: options.port, - host: options.host || '0.0.0.0', - monPort: options.monPort, - monHost: options.monHost || '0.0.0.0', - monPath: options.monPath, - ecv: options.ecv, - noWorkers: options.noWorkers, - timeout: options.timeout || 30 * 1000, // idle socket timeout - connThreshold: options.connThreshold || 10000, // recycle workers after this many connections - heartbeatInterval: options.heartbeatInterval, - emitter: self - }); - - if(options.stop) { - master.stop() - } - else if(options.shutdown) { - master.shutdown(); - } - else { - initApp(function (app, monApp) { - master.listen(app, monApp, function () { - if(options.ecv) { - ecv.enable(app, options, self, function (data) { - return true; - }); - } - if(cb) { - cb(app, monApp); - } - }); - }); - } - } - else { - // Temp Fix to unblock tech talk demo - var ports = _.isArray(options.port) ? options.port : [options.port]; - if (ports.length > 1) { - console.log('Provide a single port for non-cluster mode. Exiting.'); - process.exit(-1); - } - - createApp.call(null, function (app, monApp) { - //adding monApp to none-cluster mode - var Monitor = require('./monitor.js'), - monitor = new Monitor({ - monitor: options.monitor || monApp, - stats: self.stats, - host: options.monHost, - port: options.monPort, - path: options.monPath - }); - - monitor.listen(options.monPort, options.host); - - app.listen(ports[0], options.host, function () { - if (options.ecv) { - //bugfix by huzhou@ebay.com, in cluster=false mode, ecv failed because of wrong params, should use array of 'app':app object - ecv.enable([{'app':app}], options, self, function (data) { - return true; - }); - } - if (cb) { - cb(app, monitor); - } - }); - - //register the master worker itself, as it doesn't go through master process creation - var componentStatus = self.componentStatusResolved = require('./component-status.js').componentStatus; - componentStatus.register('worker', function(){ - return 'm' + process.pid; - }, 'array'); - - self.emit('component-status-initialized', componentStatus); - }); - } - - function initApp(cb) { - createApp.call(null, function (app, monApp) { - // If the port is already occupied, this will exit to prevent node workers from multiple - // masters hanging around together - var ports = _.isArray(app) - ? _.reduce(app, - function(ports, anApp){ - return ports.concat(anApp.port && anApp.app - ? _.isArray(anApp.port) ? anApp.port : [anApp.port] - : []); - }, - []) - : _.isArray(options.port) ? options.port : [options.port]; - - exitIfBusyPort(options.host, ports, ports.length - 1, function(){ - cb(_.filter(_.isArray(app) ? app : [{app: app, port: options.port}], - function(app){ - return app.app && app.port; - }), monApp); - }); - }); - } +Cluster.prototype.listen = function() { - function exitIfBusyPort(host, port, index, cb) { - if(index < 0) { - return cb(); - } - var server = net.createServer(); - server.on('error', function (e) { - if(e.code === 'EADDRINUSE') { - console.error('Port is use ..' + port[index]); - process.exit(-1); - } - }); - server.listen(port[index], host, function() { //'listening' listener - exitIfBusyPort(host, port, index-1, function(){ - server.close(); - cb(); - }) - }); - } - - return self; + return new Master(process, this.options).listen(); }; -Cluster.prototype.componentStatus = function(){ - - if(!this.componentStatusPromise){ - - var componentStatusDeferred = Q.defer(); - this.componentStatusPromise = componentStatusDeferred.promise; - - if(!this.componentStatusResolved){ - this.once('component-status-initialized', function(componentStatus){ - componentStatusDeferred.resolve(componentStatus); - }); - } - else{ - componentStatusDeferred.resolve(this.componentStatusResolved); - } - } - - return this.componentStatusPromise; -}; +/** + * asynchronously shutdown the master process and let Master finishes its workers on behalf of the cluster + * the master's pid is persisted under ./pids with the pattern of 'master.pid' + */ +Cluster.prototype.shutdown = function () { -Cluster.prototype.stop = function () { - var master = new Process({ - pids: process.cwd() + '/pids' - }); - master.stop(); -}; + var masterPid = readMasterPid(); + + process.kill(masterPid, 'SIGINT'); -Cluster.prototype.shutdown = function () { - var master = new Process({ - pids: process.cwd() + '/pids' - }); - master.shutdown(); + //in case the graceful shutdown doesn't complete, send the TERM signal instead. + setTimeout(function(){ + process.kill(masterPid, 'SIGTERM'); + }, + this.stopTimeout); }; diff --git a/lib/master.js b/lib/master.js new file mode 100644 index 0000000..225c431 --- /dev/null +++ b/lib/master.js @@ -0,0 +1,423 @@ +var _ = require('underscore'), + when = require('when'), + timeout = require('when/timeout'), + cluster = require('cluster'), + assert = require('assert'), + util = require('util'), + execFile = require('child_process').execFile, + Worker = require('./worker.js').Worker, + exitIfBusyPort = require('./utils.js').exitIfBusyPort, + writePid = require('./utils.js').writePid, + getNodeInspectorPath = require('./utils.js').getNodeInspectorPath, + enable = require('./ecv.js').enable; + +var masterDeferred = when.defer(), + masterPromise = exports.master = masterDeferred.promise; + +var Master = exports.Master = function(proc, options){ + + var _this = this.initialize(proc, options); + + masterDeferred.resolve(_this); + + return _this; +}; + +Master.prototype.initialize = function(proc, options){ + + var _this = this; + + writePid(process.pid); + + if(cluster.isMaster) { + + _.extend(_this, { + 'pid': proc.pid, + 'process': proc, + 'emitter': options.emitter, + 'createServer': options.monCreateServer, + 'app': options.monApp, + 'port': options.monPort, + 'warmUp': function(){ + + _this.fork(_this.options, { + 'CACHE_MANAGER': true + }); + + enable(options.monApp, { + 'control': true, + 'disabled': true + }, + options.emitter); + + _.each(_.range(0, _this.noWorkers), function(ith){ + return _this.fork(_this.options); + }); + + //wait for all slaves to be ready, and then enable ECV as the last step + _this.markUp(); + }, + 'noWorkers': options.noWorkers, + 'markOld': options.markOld || function(heartbeat){ + + var thisTPS = heartbeat.durations.dividedBy(heartbeat.transactions), + historicTPS = heartbeat.totalDurations.dividedBy(heartbeat.totalTransactions); + + //over 5% increase? + if(thisTPS > historicTPS && (thisTPS - historicTPS) * 20 > historicTPS){ + //verify if it's due to GC + var gc = heartbeat.gc; + if(gc.usage > 0.9){ + return true; + } + } + return false; + }, + 'stopTimeout': options.stopTimeout, + 'debugPort': options.debugPort, + 'options': options, + 'slaves': { + + }, + 'status': require('./cluster-status.js').componentStatus + }); + + cluster.on('fork', function(worker){ + _this.slaves[worker.process.pid] = new Slave(_this, worker, options, worker.process.env); + }); + + cluster.on('online', function(worker){ + _this.slaves[worker.process.pid].whenOnline(); + }); + + cluster.on('listening', function(worker){ + _this.slaves[worker.process.pid].whenListening(); + }); + + cluster.on('exit', function(worker){ + _this.slaves[worker.process.pid].whenExit(); + }); + + _this.emitter.on('heartbeat', function(heartbeat){ + _this.slaves[heartbeat.pid].whenHeartbeat(heartbeat); + }); + + process.once('SIGINT', _.bind(_this.whenStop, _this)); + process.once('SIGTERM', _.bind(_this.whenExit, _this)); + + assert.ok(_this.createServer); + assert.ok(_this.app); + assert.ok(_this.port); + + exitIfBusyPort('localhost', _this.port); + exitIfBusyPort('localhost', _this.options.port); + + return _this; + } + else if(proc.env.CACHE_MANAGER){ + + var manager = require('./cache-mgr.js'); + _.extend(options, { + 'createServer': manager.createServer, + 'app': manager.app, + 'port': manager.port, + 'warmUp': manager.afterServerStarted + }); + + return new Worker(proc, options); + } + else{ + + _.extend(options, { + 'debug': process.env.debug + }); + + return new Worker(proc, options); + } +}; + +Master.prototype.listen = function(){ + + var _this = this, + createServer = _this.createServer, + monApp = _this.app, + monPort = _this.port, + warmUp = _this.warmUp, + wait = _this.timeout; + + assert.ok(createServer); + assert.ok(monApp); + assert.ok(monPort); + + var deferred = when.defer(), + server = createServer(monApp).listen(monPort, function(){ + deferred.resolve({ + 'server': server, + 'app': monApp, + 'port': monPort, + 'master': _this, + 'worker': null + }); + }); + + return (wait > 0 ? timeout(_this.timeout, deferred.promise) : deferred.promise) + .then(function(resolve){ + + warmUp(); + return resolve; + }); +}; + +Master.prototype.debug = function debug(pid){ + + var _this = this, + slavesCount = 0; + + _this.markDown(); + + //debug fresh + _.each(_.filter(_this.slaves, function(slave){ + return !slave.cacheManager && pid !== slave.pid; + }), + function(slave){ + slavesCount += 1; + slave.disconnect(); + }); + + //send signal to the slave + if(!pid){ + _this.fork(_this.options, { + 'debug': true + }); + } + else{ + var debugging = _this.slaves[pid]; + debugging.debug(); + + _this.emitter.once('debug-finished', function(){ + debugging.disconnect(); + }); + } + + var inspectorPath = getNodeInspectorPath(); + assert.ok(inspectorPath); + + var inspector = execFile(inspectorPath, ['--web-port=' + _this.debugPort]); + _this.emitter.once('debug-finished', function(){//u'll hear back from the debug app about this + + inspector.kill('SIGTERM'); + + //restore the workers + _.each(_.range(0, slavesCount), function(ith){ + _this.fork(_this.options); + }); + + //mark up ecv now + _this.markUp(); + }); +}; + +Master.prototype.markDown = function markUp(){ + //mark down ecv + _this.emitter.emit('warning', ['self'], { + 'command': 'disable' + }); +}; + +Master.prototype.markUp = function markUp(){ + //mark down ecv + _this.emitter.emit('warning', ['self'], { + 'command': 'enable' + }); +}; + +Master.prototype.fork = function(options, env){ + + return cluster.fork(env); +}; + +Master.prototype.status = function status(){ + + return this.status; +}; + +Master.prototype.whenStop = function whenStop(){ + + var _this = this, + cycle = 1000, + threshold = Date.now() + _this.stopTimeout, + gracefully = function(){ + + if(_.keys(_this.slaves).length === 0){ + process.exit(0); + } + + if(Date.now() >= threshold){ + process.exit(-1); + } + else{ + setTimeout(gracefully, cycle); + } + };//check every second + + _.each(_this.slaves, function(slave){ + + slave.disconnect(); + }); + + gracefully();//shutdown gracefully +}; + +Master.prototype.whenExit = function whenExit(){ + + _.each(_this.slaves, function(slave){ + + slave.disconnect(); + }); + + process.exit(-1);//shutdown bruteforcely +}; + +/** + * Slave is an image of the worker at the Master's runtime, to simplify the state machine + */ +var Slave = exports.Slave = function(master, worker, options, env){ + + var _this = this; + + _this.cacheManager = env.CACHE_MANAGER; + _this.debug = env.debug; + _this.pid = worker.process.pid; + _this.worker = worker; + + _this.forkedState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenOnline': function(){ + + if(_this.debug){ + //we could enable debugging here + master.emitter.once('debug-started', function(){ + _this.emitter.emit('run', [_this.pid]); + }); + + master.emitter.once('debug-finished', function(){ + _this.disconnect(); + }); + + _this.debug(); + } + }, + + 'whenListening': function(){ + + _this.state = _this.activeState; + + master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); + }, + + 'whenHeartbeat': function(){ + //no interest + }, + + 'whenExit': function(){ + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + } + }; + + _this.activeState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenHeartbeat': function(heartbeat){ + //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a slave should + //enter an old state from active + + if(master.markOld(heartbeat)){ + + _this.activeState = _this.oldState; + + var successor = master.fork(options, env); + //when successor is in place, the old worker could be discontinued finally + master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + + master.emitter.emit('disconnect', ['master', worker.pid]); + }); + } + }, + + 'whenExit': function(){ + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + } + }; + + _this.oldState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenExit': function(){ + + _this.state = _this.diedState; + } + }; + + _this.diedState = { + + 'disconnect': function(){ + //already disconnected + }, + + 'whenExit': function(){ + //already exit + } + }; + + _this.state = _this.forkedState; +}; + +Slave.prototype.debug = function(){ + + this.worker.process.kill('SIGUSR1');//make it debug ready +}; + +Slave.prototype.disconnect = function(){ + + return this.state.disconnect(); +}; + +Slave.prototype.whenOnline = function(){ + + return this.state.whenOnline(); +}; + +Slave.prototype.whenListening = function(){ + + return this.state.whenListening(); +}; + +Slave.prototype.whenHeartbeat = function(heartbeat){ + + return this.state.whenHeartbeat(heartbeat); +}; + +Slave.prototype.whenExit = function(){ + + return this.state.whenExit(); +}; + diff --git a/lib/misc.js b/lib/misc.js deleted file mode 100644 index d41dc3a..0000000 --- a/lib/misc.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var fs = require('fs'); - -// Utility to ensure that certain directories exist -exports.ensureDir = function(dir, clean) { - try { - fs.readdirSync(dir); - if(clean) { - var paths = fs.readdirSync(dir); - paths.forEach(function(filename) { - try { - fs.unlink(dir + '/' + filename); - } - catch(e) {} - }); - } - } - catch(e) { - fs.mkdirSync(dir, 0755); - } -} - -exports.forMemoryNum = function(memory) { - var strMemory; - if(memory < 1024) { - strMemory = memory + ' Bytes'; - } - if(memory < 1024 * 1024) { - strMemory = (memory / 1024).toFixed(2) + ' KB'; - } - else { - strMemory = (memory / (1024 * 1024)).toFixed(2) + ' MB'; - } - return strMemory; -} diff --git a/lib/monitor-app.js b/lib/monitor-app.js new file mode 100644 index 0000000..3d55c9b --- /dev/null +++ b/lib/monitor-app.js @@ -0,0 +1,28 @@ +'use strict'; + +var express = require('express'), + path = require('path'); + +var monApp = express(), + masterPromise = require('./master.js').master; + +//the monitor app should support the following: + +//debug + +monApp.use('/scripts', express.static(path.join(__dirname, './public/scripts'))); +monApp.use('/stylesheets', express.static(path.join(__dirname, './public/stylesheets'))); +monApp.engine('.ejs', require('ejs').__express); +monApp.set('views', path.join(__dirname, './public/views')); +monApp.set('view engine', 'ejs'); + +monApp.get('/debug', function(req, res){ + + res.send('debugging on its way', 200); +}); + +//status + +//workers + +exports.monApp = monApp; \ No newline at end of file diff --git a/lib/monitor.js b/lib/monitor.js deleted file mode 100644 index 27e3b8c..0000000 --- a/lib/monitor.js +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var misc = require('./misc.js'), - express = require('express'), - ejs = require('ejs'), - fs = require('fs'), - util = require('util'), - npm = require('npm'), - os = require('os'), - _ = require('underscore'); - -// Monitor -var Monitor = module.exports = function Monitor(options) { - this.options = options || {port: 8081, stats: {}, path: '/'}; - this.stats = this.options.stats; - - var app = options.monitor; - - if(!app){ - app = express.createServer(); - - var self = this; - app.set('views', __dirname + '/../public/views'); - app.use(express.static(__dirname + '/../public')); - app.set('view engine', 'html'); - - app.get(this.options.path, function (req, res) { - var accept = (req.headers || {}).accept || ''; - if(accept.search('json') > 0) { - res.contentType('application/json'); - res.send(JSON.stringify(getStats(self.stats, req.connection))); - } - else { - res.render('index.ejs', getStats(self.stats, req.connection)); - } - }); - - app.get(/^\/logs?(?:\/(\d+)(?:\.\.(\d+))?)?/, function (req, res) { - var root, paths, logs, stats; - var file = process.cwd() + req.url; - if(req.url === '/logs') { - root = process.cwd() + '/logs'; - paths = fs.readdirSync(root); - logs = []; - paths.forEach(function (filename) { - stats = fs.statSync(root + '/' + filename); - logs.push({ - filename: filename, - stats: stats - }) - }); - var data = getStats(self.stats, req.connection); - data.logs = logs; - res.render('logs.ejs', data); - } - else { - var stat = fs.statSync(file); - res.writeHead(200, { - 'Content-Type': 'text/plain', - 'Content-Length': stat.size - }); - var readStream = fs.createReadStream(file); - util.pump(readStream, res, function (e) { - if(e) { - console.error(e.stack || e); - } - res.end(); - }); - } - }); - - app.get('/deps', function(req, res) { - npm.load({}, function() { - npm.commands.ls([], true, function(e, data) { - res.writeHead(200, { - 'Content-Type': 'application/json' - }); - - var seen = []; - var out = JSON.stringify(data, function (k, o) { - if(typeof o === "object") { - if(-1 !== seen.indexOf(o)) return '[Circular]'; - seen.push(o); - } - return o; - }, 2); - res.end(out); - }); - }); - }); - - app.get('/ComponentStatus(/[^/]+)?', function(req, res){ - - //when component = empty, this will list all the component ids and links associated with them. - - //otherwise, we'll collect the component status from all workers - var component = req.query.component, //should come from param - view = req.query.view || 'html',//should come from param - worker = req.query.worker, - componentStatus = require("./component-status.js").componentStatus; - - if(component){ - componentStatus.getStatus(component, { - 'params': req.query, - 'worker': worker, - 'done': function(result){ - res.send(JSON.stringify(result), 200); - } - }); - } - else{ - res.send(JSON.stringify(componentStatus.getComponents()), 200); - } - }); - } - - return app; -}; - -function getStats(master, socket) { - master.hostname = os.hostname(); - master.os = os.type() + ' ' + os.release(); - master.averageLoad = os.loadavg().map( - function (n) { - return n.toFixed(2); - }).join(' '); - master.coresUsed = master.noWorkers + ' of ' + os.cpus().length; - master.memoryUsageAtBoot = misc.forMemoryNum(master.freemem) + ' of ' + - misc.forMemoryNum(master.totalmem); - master.totalMem = os.totalmem().toFixed(3); - master.currentMemoryUsage = (os.totalmem() - os.freemem()) / 1024000; - master.hostCpu = (_.reduce(os.cpus(), function (memo, cpu) { - return memo + (cpu.times.user / - (cpu.times.user + cpu.times.nice + - cpu.times.sys + cpu.times.idle + cpu.times.irq)); - }, 0) * 100 / os.cpus().length).toFixed(2); - - if(socket) { - master.address = socket.address(); - } - - return {master: master}; -} diff --git a/lib/process.js b/lib/process.js deleted file mode 100644 index 7c143e2..0000000 --- a/lib/process.js +++ /dev/null @@ -1,633 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var misc = require('./misc.js'), - ecv = require('./ecv.js'), - Monitor = require('./monitor.js'), - _ = require('underscore'), - assert = require('assert'), - cluster = require('cluster'), - EventEmitter = require('events').EventEmitter, - os = require('os'), - fs = require('fs'), - Q = require('q'), - util = require('util'), - getrusage = require('getrusage'), - memwatch = require('memwatch'); - -var debug = process.env['cluster2']; -function log() { - if(debug) { - console.log(JSON.stringify(arguments)); - } -} - -// Master process -var Process = module.exports = function Process(options) { - this.options = options || {}; - this.emitter = this.options.emitter || new EventEmitter(); - var self = this; - - // Stats - this.stats = { - workers: {}, - noWorkers: 0, - workersKilled: 0 - }; - - this._heartbeats = []; - - this.killall = function(signal) { - log('killall called with signal ', signal); - var that = this, fullname; - fs.readdir(that.options.pids, function(err, paths) { - var count = paths.length; - if(count === 0) { - return; - } - var mf = _.find(paths, function(path) { - return /master\./.test(path); - }); - paths.forEach(function(filename) { - fullname = that.options.pids + '/' + filename; - if(/worker\./.test(filename)) { - that.kill(fullname, signal, function() { - count = count - 1; - if(count === 1 && mf) { - log('Sending ', signal, ' to the master'); - that.kill(that.options.pids + '/' + mf, signal); - } - }); - } - }); - }) - }; - - this.kill = function(fullname, signal, f) { - log('sending ', signal, ' to ', fullname); - fs.readFile(fullname, 'ascii', function(err, data) { - var pid = parseInt(data); - if(pid === process.pid) { - log('Unlinking ', fullname); - fs.unlinkSync(fullname); - process.exit(0); - } - else { - try { - process.kill(pid, signal); - } - catch(e) { - log(e.stack || e); - } - } - fs.unlink(fullname, function(err) { - log('Unlinking ', fullname); - if(err) { - console.error('Unable to delete ' + fullname); - } - if(f) { - assert.ok('function' === typeof f); - f(); - } - }); - }); - }; - - this.emitter.on('SIGINT', function() { - if(cluster.isMaster) { - self.killall(('SIGINT')); - clearInterval(self._heartbeatScheduler); - } - }); - this.emitter.on('SIGTERM', function() { - if(cluster.isMaster) { - self.killall('SIGTERM'); - clearInterval(self._heartbeatScheduler); - } - }); - this.emitter.on('SIGKILL', function() { - if(cluster.isMaster) { - self.killall('SIGKILL'); - clearInterval(self._heartbeatScheduler); - } - }); - - this.createWorker = function () { - var worker = cluster.fork().process; - var self = this; - - fs.writeFileSync(util.format('%s/worker.%d.pid', this.options.pids, worker.pid), worker.pid); - - self.emitter.emit('forked', worker.pid); - - // Collect counters from workers - worker.on('message', function (message) { - if(message.type === 'counter') { - var name = message.name; - if(!self.stats.workers[message.pid]) { - self.stats.workers[message.pid] = {}; - } - var pidStats = self.stats.workers[message.pid]; - if(!pidStats[name]) { - pidStats[name] = 0 - } - pidStats[name]++; - self.emitter.emit("listening", message.pid); - } - if(message.type === "heartbeat"){ - - if(message.pid != process.pid){ - self._heartbeats.push(message);//must append to the tail - } - - self.lastTime = self.lastTime = Date.now(); - self._heartbeatScheduler = self._heartbeatScheduler || setInterval(function () { - - var count = self._heartbeats.length, - threads = {}, - aggr = {}; - - _.each(_.range(0, count), function(aggregated){ - - var heartbeat = self._heartbeats.shift(); - - _.each(heartbeat, function(val, key){ - aggr[key] = (aggr[key] || 0) + val; - }); - - threads[heartbeat.pid] = heartbeat.pid; - }); - - //emit the aggregated heartbeat message - self.emitter.emit('heartbeat', { - 'pid': process.pid, - 'usertime': aggr.usertime / count,//avg - 'systime': aggr.systime / count,//avg - 'uptime': aggr.uptime / count,//avg - 'totalmem': aggr.totalmem / count,//avg - 'freemem': aggr.freemem / count,//avg - 'totalConnections': aggr.totalConnections,//total - 'pendingConnections': aggr.pendingConnections,//total - 'timedoutConnections': aggr.timedoutConnections,//total - 'fullGCs': aggr.fullGCs,//total - 'incrementalGCs': aggr.incrementalGCs,//total - 'heapCompactions': aggr.heapCompactions,//total - 'totalTransactions': aggr.totalTransactions,//total - 'totalDuration': aggr.totalDuration,//total - 'threads': _.keys(threads).length, - 'interval': Date.now() - self.lastTime - }); - - self.lastTime = Date.now(); - - }, self.options.heartbeatInterval || 60000); - } - else if(message.type === "delegate"){//delegate is a proposed work pattern between master & workers, there're jobs workers would like to delegate to master - //and master would use messaging to interact with the actual handler module, and send the result back to all workers; besides, such handler might notify - //the master whenever there're some change of the results to publish to all workers in the future. - var delegate = message.delegate, - expect = message.expect; - - if(expect){//there're jobs which expects immediate responses, in case of those, onExpect handler is created, timeout might be applied - var deferred = Q.defer(), - origin = message, - matches = message.matches, - targets = message.targets, - isExpected = function(origin, response){ - return _.reduce(matches, function(memoize, match){ - return memoize && _.isEqual(origin[match], response[match]); - }, - true); - }, - onExpect = function(message){ - if(isExpected(origin, message)){ - self.emitter.removeListener(expect, onExpect); - deferred.resolve(message); - } - }, - send = function(message){ - message.type = expect; - if(targets){ - var workers = _.reduce(self.workers, function(memoize, worker){ - memoize[worker.pid] = worker; - return memoize; - }, {}); - _.each(_.compact(targets), function(target){ - var targetWorker = self.workers[target]; - if(targetWorker){ - targetWorker.send(message); - } - }); - } - else{ - self.notifyWorkers(message); - } - }, - timeOut = setTimeout(function(){ - log('[cluster] reject timeout:' + JSON.stringify(message)); - deferred.reject(new Error("timeout")); - }, message.timeOut || 10000); - - self.emitter.on(expect, onExpect); - - deferred.promise - .then(function(message){ - clearTimeout(timeOut); - send(message); - }) - .fail(function(error){ - log('[cluster] fail error:' + error); - message.error = error; - send(message); - }) - .fin(function(){ - if(message.notification){//this is for future update notifications, and registered afterwards. - if(!self._notifications){ - self._notifications = {}; - } - if(!self._notifications[expect]){//make sure notifications won't be repeatedly registered. - self._notifications[expect] = true; - self.emitter.on(expect, function(message){ - send(message); - }); - } - } - }) - .done(); - } - - self.emitter.emit(delegate, message); - } - }); - - this.stats.noWorkers++; - - worker.on('message', function(message) { - if(message && message.command) { - self.notifyWorkers(message); - } - }); - - return worker; - } - - this.notifyWorkers = function(message) { - _.each(self.workers, function(worker, pid) { - try{ - worker.send(message); - } - catch(error){ - log('[cluster2] cannot send message to worker:' + pid); - } - }); - } -} - -Process.prototype.listen = function() { - - process.on('uncaughtException', function(err) { - // handle the error safely - log('[fatal] ' + err); - }); - - var exit = process.exit; - process.exit = function(){ - log('[cluster2] exit unexpectedly' + new Error().stack); - exit.apply(process, arguments); - }; - - var self = this, apps, monApp, cb; - - if(arguments.length === 3) { - apps = arguments[0]; - monApp = arguments[1]; - cb = arguments[2]; - } - else if (arguments.length === 2) { - apps = arguments[0]; - cb = arguments[1]; - } - if(cluster.isMaster) { - - this.stats.pid = process.pid; - this.stats.start = new Date(); - this.stats.totalmem = os.totalmem(); - this.stats.freemem = os.freemem(); - this.stats.workers = this.workers = []; - - //before monitor app starts - process.cluster = { - clustered: true, - emitter: self.emitter, - workers: self.workers - }; - //register the master worker itself - var componentStatus = self.componentStatusResolved = require('./component-status.js').componentStatus; - componentStatus.register('worker', function(){ - return 'm' + process.pid; - }, 'array'); - - self.emitter.emit('component-status-initialized', componentStatus); - - // Monitor to serve log files and other stats - typically on an internal port - var monitor = new Monitor({ - monitor: monApp, - stats: self.stats, - host: self.options.monHost, - port: self.options.monPort, - path: self.options.monPath - }); - - monitor.once('listening', function() { - misc.ensureDir(process.cwd() + '/pids', true); // Ensure pids dir - misc.ensureDir(process.cwd() + '/logs'); // Ensure logs dir - - fs.writeFileSync(util.format('%s/master.%d.pdf', self.options.pids, self.stats.pid), self.stats.pid); - log('Master ', process.pid, ' started'); - - // Fork workers - for(var i = 0; i < self.options.noWorkers; i++) { - var worker = self.createWorker(); - self.workers[worker.pid + ''] = worker; - } - - var deathWatcher = function (worker, code, signal) { - worker = worker.process; - log('[cluster2] death watch activated, worker:' + worker.pid + '\tcode:' + code + '\tsignal:' + signal + '\texit:' + worker.exitCode); - if(code === 0) { - self.stats.noWorkers--; - return; - } - - self.emitter.emit('died', worker.pid); - self.stats.workersKilled++; - self.stats.noWorkers--; - //bugfix by huzhou@ebay.com, worker & replacement name collision - var replacement = self.createWorker(); - self.workers[replacement.pid + ''] = replacement; - delete self.workers[worker.pid + '']; - delete self.stats.workers[worker.pid]; - - log('[cluster2] updated worker list:' + _.keys(self.workers)); - }; - cluster.on('exit', deathWatcher); - - process.on('SIGINT', function() { - cluster.removeListener('exit', deathWatcher); - self.emitter.emit('SIGINT'); - }); - - process.on('SIGTERM', function() { - log(process.pid, ' got SIGTERM'); - self.emitter.emit('SIGTERM', { - pid: process.pid, - type: 'master' - }); - var interval = setInterval(function() { - if(self.stats.noWorkers === 0) { - clearInterval(interval); - process.exit(0); - } - }, 100); - }); - - _.each(apps, function(app){ - app.app.on('connection', function(conn) { - log('master conn listener'); - }); - }); - - cb.call(null); - }); - - monitor.on('error', function (e) { - if(e.code === 'EADDRINUSE') { - console.error('Address in use ...'); - process.exit(-1); - } - }); - var monHost = this.options.monHost || '0.0.0.0'; - monitor.listen(this.options.monPort, monHost).once("listening", function(){ - //redundant for express2, absolutely needed for express3 and above - monitor.emit("listening"); - }); - } - else { - - var listening = false, conns = 0, totalConns = 0, timedoutConns = 0, noAppClosed = 0; - process.on('SIGINT', function() { - self.emitter.emit('SIGINT', { - pid: process.pid, - type: 'worker' - }); - process.exit(); - }); - process.on('SIGTERM', function() { - log(process.pid + ' got SIGTERM'); - - // Don't accept connections - _.each(apps, function(app){ - if(app.listening){ - try { - app.app.close(); - } - catch(e) {} - } - }); - self.emitter.emit('SIGTERM', { - pid: process.pid, - type: 'worker' - }); - // Once all pending connections are closed, exit. - var internal = setInterval(function() { - if(conns === 0) { - clearInterval(internal); - process.exit(0); - } - }, 100); - }); - - // Set time out on idle sockets - function setTimeout(conn) { - conns++; - totalConns++; - conn.setTimeout(self.options.timeout, - function () { - timedoutConns++; - self.emitter.emit('warning', { - message: 'Client socket timed out' - }); - conn.destroy(); - } - ); - conn.on('close', function() { - conns--; - }) - } - - _.each(apps, function(app){ - var notifyInitialized = _.once(function(){ - - var componentStatus = self.componentStatusResolved = require('./component-status.js').componentStatus; - componentStatus.register('worker', function(){ - return process.pid; - }, 'array'); - - self.emitter.emit('component-status-initialized', componentStatus); - }); - - app.app.once('listening', function() { - app.listening = true; - process.send({ - type:"counter", - name:process.pid, - pid:process.pid - }); - - notifyInitialized(); - }); - - // Workers are net.Servers - var ports = _.isArray(app.port) ? app.port : [app.port]; - var host = self.options.host ? self.options.host : '0.0.0.0'; - var servers = _.map(ports, function(port) { - log('Worker ', process.pid, ' listening to ', port); - return app.app.listen(port, host); - }); - - _.each(servers, function(server){ - server.once("listening", function() { - if(self.options.ecv) { - ecv.enable(apps, self.options, self.emitter, function(data) { - return true; - }); - } - cb(); - //redundant for express2, absolutely needed for express3 and above - app.app.emit('listening'); - }); - server.on('connection', setTimeout); - }); - }); - - // Recycle self when no of connections connection threshold - var threshold = self.options.connThreshold; - var recycle = setInterval(function() { - if(totalConns > threshold) { - log('[cluster2] exit because of connection threshold:' + threshold + ':' + totalConns); - clearInterval(recycle); - _.each(apps, function(app){ - if(app.listening){ - try { - app.app.close(); - } - catch(e) {} - } - }); - self.emitter.emit('SIGTERM', { - pid: process.pid, - type: 'worker' - }); - // Once all pending connections are closed, exit. - var internal = setInterval(function() { - if(conns === 0) { - clearInterval(internal); - process.exit(-1); - } - }, 100); - } - }, 100); - - var memStats = { - 'num_full_gc': 0, - 'num_inc_gc': 0, - 'heap_compactions': 0 - }; - memwatch.on('stats', function(stats){ - _.extend(memStats, stats || {}); - }); - - var txStats = { - 'count': 0, - 'totalDuration': 0 - } - - self.emitter.on('rootTransaction', function(tx){ - txStats.count += 1; - txStats.totalDuration += tx.duration; - }); - - // Heartbeat - make sure to clear this on 'close' - var heartbeat = setInterval(function () { - - var heartbeat = { - 'pid': process.pid, - 'usertime': getrusage.getcputime(), - 'systime': getrusage.getsystemtime(), - 'uptime': Math.round(process.uptime()), - 'totalmem': os.totalmem(), - 'freemem': os.freemem(), - 'totalConnections': totalConns, - 'pendingConnections': conns, - 'timedoutConnections': timedoutConns, - 'fullGCs': memStats['num_full_gc'], - 'incrementalGCs': memStats['num_inc_gc'], - 'heapCompactions': memStats['heap_compactions'], - 'totalTransactions': txStats.count, - 'totalDuration': txStats.totalDuration - }; - - self.emitter.emit('heartbeat', heartbeat); - var toMaster = { - type:"heartbeat" - }; - _.extend(toMaster, heartbeat); - - process.send(toMaster); - - memStats.num_full_gc = 0; - memStats.num_inc_gc = 0; - memStats.heap_compactions = 0; - txStats.count = 0; - txStats.totalDuration = 0; - - }, self.options.heartbeatInterval || 60000); - - _.each(apps, function(app){ - app.app.on('close', function() { - noAppClosed++; - if(noAppClosed >= noAppClosed.length){ - clearInterval(heartbeat); - clearInterval(recycle); - } - }) - }); - } - - process.on('exit', function () { - log(process.pid, ' is about to exit.'); - }); -}; - -Process.prototype.stop = function() { - this.emitter.emit('SIGKILL'); -}; - -Process.prototype.shutdown = function() { - log('Shutdown request received - emitting SIGTERM'); - this.emitter.emit('SIGTERM'); -}; - diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 0000000..3fd272a --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,109 @@ +var net = require('net'), + when = require('when'), + timeout = require('when/timeout'), + cluster = require('cluster'), + fs = require('graceful-fs'), + path = require('path'), + util = require('util'); + +exports.exitIfBusyPort = function exitIfBusyPort(host, port) { + + var deferred = when.defer(), + server = net.createServer(); + + server.once('error', function (e) { + if(e.code === 'EADDRINUSE') { + console.error('Port is use ..' + port); + deferred.resolved(true) + } + }); + + server.listen(port, host, function() { //'listening' listener + server.close(); + deferred.resolved(false); + }); + + return timeout(3000, deferred.promise); +}; + +exports.ensureDir = function ensureDir(dir, clean) { + try { + fs.readdirSync(dir); + if(clean) { + var paths = fs.readdirSync(dir); + paths.forEach(function(filename) { + try { + fs.unlink(dir + '/' + filename); + } + catch(e) { + + } + }); + } + } + catch(e) { + fs.mkdirSync(dir, 0755); + } +}; + +exports.writePid = function writePid(pid, dir) { + + pid = pid || process.pid; + dir = dir || path.join(process.cwd(), '/pids'); + + ensureDir(dir); + + var persist = util.format('%s.%d.pid', cluster.isMaster ? 'master' : 'worker', pid); + + fs.writeFileSync(persist, pid, { + 'encoding': 'utf-8' + }); +}; + +exports.readPids = function readPids(dir) { + + dir = dir || path.join(process.cwd(), '/pids'); + ensureDir(dir); + + return _.map(fs.readdirSync(dir), function(filename){ + + return fs.readSync(path.join(dir, filename), { + 'encoding': 'utf-8' + }); + }); +}; + +exports.readMasterPid = function readMasterPid(dir) { + + dir = dir || path.join(process.cwd(), '/pids'); + ensureDir(dir); + + return fs.readSync( + path.join(dir, + _.filter(fs.readdirSync(dir), function(filename){ + return /master\./.test(filename); + })[0]), + { + 'encoding': 'utf-8' + }); +}; + +exports.getNodeInspectorPath = function getNodeInspectorPath(){ + + var here = path.join(__dirname, '..'),//see if it's under cluster's node_modules + find = function(dir){ + + if(fs.existsSync(path.join(dir, './node_modules/node-inspector'))){ + return path.join(dir, './node_modules/node-inspector/bin/inspector.js'); + } + + if(dir === process.cwd()){ + return null; + } + + return find(path.join(dir, '..')); + }; + + return find(here); +}; + diff --git a/lib/worker.js b/lib/worker.js new file mode 100644 index 0000000..bf7484e --- /dev/null +++ b/lib/worker.js @@ -0,0 +1,165 @@ +var _ = require('underscore'), + when = require('when'), + timeout = require('when/timeout'), + usage = require('usage'), + BigNumber = require('bignumber.js'), + gc = require('nodefly-gcinfo'), + assert = require('assert'); + +var Worker = exports.Worker = function(proc, options){ + + var _this = this, + emitter = _this.emitter = options.emitter; + + _.extend(_this, { + 'pid': proc.pid, + 'process': proc, + 'options': options, + 'createServer': options.createServer, + 'app': options.app, + 'port': options.port, + 'warmUp': options.warmUp, + 'debug': options.debug, + 'timeout': options.timeout || 5000, + 'liveConnections': 0, + 'totalConnections': 0, + 'transactions': 1, + 'durations': 0, + 'totalTransactions': new BigNumber(1),//avoid zero division + 'totalDurations': new BigNumber(0), + 'heartbeatInterval': options.heartbeatInterval || 3000, + 'status': require('./cluster-status.js').componentStatus + }); + + gc.onGC(_.bind(_this.whenGC, _this)); + process.once('SIGINT', _.bind(_this.whenStop, _this)); + process.once('SIGTERM', _.bind(_this.whenExit, _this)); + + _this.whenHeartbeat(); +}; + +Worker.prototype.listen = function(){ + + var _this = this, + createServer = _this.createServer, + app = _this.app, + port = _this.port, + warmUp = _this.warmUp, + debug = _this.debug, + wait = _this.timeout; + + assert.ok(createServer); + assert.ok(app); + assert.ok(port); + assert.ok(warmUp); + + var deferred = when.defer(), + run = function(){ + server = createServer(app).listen(port, function(){ + + server.on('connection', function(conn){ + _this.whenConnected(conn); + }); + + if(_.isFunction(app.use)){//tps information + app.use(function(req, res, next){ + + var begin = Date.now(); + res.once('finish', function(){ + _this.transactions += 1; + _this.durations += Date.now() - begin; + }); + + next(); + }); + } + + deferred.resolve({ + 'server': server, + 'app': app, + 'port': port, + 'master': null, + 'worker': _this + }); + }); + }; + + if(!debug){ + run(); + } + else{ + _this.emitter.once('run', run); + } + + return (wait > 0 ? timeout(_this.timeout, deferred.promise) : deferred.promise) + .then(function(resolve){ + + warmUp(); + + _this.emitter.emit(util.format('worker-%d-warmup'), ['master']); + + return resolve; + }); +}; + +Worker.prototype.status = function status(){ + + return this.status; +}; + +Worker.prototype.whenConnected = function whenConnected(conn) { + + var _this = this; + + _this.liveConnections += 1; + _this.totalConnections += 1; + + conn.setTimeout(_this.timeout, _.bind(conn.destroy, conn)); + + conn.once('close', function() { + _this.liveConnections -= 1; + }); +}; + +Worker.prototype.whenHeartbeat = function(){ + + //heartbeat to the master + var _this = this, + emitter = _this.emitter; + + usage.lookup(_this.pid, function(error, result){ + + emitter.emit('heartbeat', ['self', 'master'], { + 'pid': process.pid, + 'cpu': result.cpu, + 'memory': result.memory, + 'liveConnections': _this.liveConnections, + 'totalConnections': _this.totalConnections, + 'transactions': _this.transactions, + 'durations': _this.durations, + 'totalTransactions': _this.totalTransactions.plus(_this.transactions), + 'totalDurations': _this.totalDurations.plus(_this.durations), + 'gc': _this.gc || {} + }); + }); + + setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); +}; + +Worker.prototype.whenGC = function(info){ + + var _this = this; + + _this.gc = info; + + emitter.emit('gc', ['self', 'master'], info); +}; + +Worker.prototype.whenStop = function(){ + +}; + +Worker.prototype.whenExit = function(){ + + process.exit(-1); +}; diff --git a/package.json b/package.json index 29acef8..531fba8 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,28 @@ { - "author": "ql.io", + "author": "cubejs", "contributors": [{ - "name": "Subbu Allamaraju", - "email": "subbu@ebaysf.com" + "name": "Roy Zhou", + "email": "huzhou@ebay.com" }], - "name": "cluster2", - "version": "0.4.7", - "repository": { - "type": "git", - "url": "https://github.com/ql-io/cluster2" - }, + "name": "cluster3", + "version": "0.1.0", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10.0" }, "main": "lib/index.js", "dependencies": { "underscore": "~1.4.4", - "express": "~2.5.11", + "when": "~2.3.0", + "express": "~3.1.0", + "usage": "~0.3.8", + "node-inspector": "~0.3.0", + "graceful-fs": "~2.0.0", + "nodefly-gcinfo": "~0.0.15", "ejs": "~0.8.4", - "npm": "~1.3.0", - "q": "~0.9.6", - "memwatch": "~0.2.2", - "getrusage": "~0.3.3" + "bignumber.js": "~1.1.1" }, "devDependencies": { "websocket": "~1.0.8", - "nodeunit": "~0.8.0", "request": "~2.21.0", "mocha": "~1.11.0", "should": "~1.2.2" diff --git a/ports b/ports deleted file mode 100644 index 8d5b888..0000000 --- a/ports +++ /dev/null @@ -1 +0,0 @@ -3080 \ No newline at end of file diff --git a/public/css/mon.css b/public/css/mon.css deleted file mode 100644 index 71be738..0000000 --- a/public/css/mon.css +++ /dev/null @@ -1,75 +0,0 @@ -body { - margin-left: 2%; - width: 95%; - font-family: 'Droid Sans', 'Helvetica', 'Arial', sans-serif; - color: #333333; - counter-reset: count-h1; -} - -/*table.header {*/ - /*float: right;*/ - /*font-size: 8pt;*/ - /*text-align: right;*/ -/*}*/ - -.header, .footer { - font-size: 8pt; -} - -div.header { - text-align: right; - font-size: 8pt; -} - -table { - font-size: 10pt; - border-spacing: 2px; -} - -table.master { - width: 90% -} - -table.worker { - width: 90% -} - -td { - padding: 2px; -} - -/*.odd {*/ - /*background: #E8EDFF;*/ -/*}*/ - -.range { - font-size: 8pt; -} - -.range-max { - margin-top: 8px; -} - -.range-min { - margin-bottom: 12px; -} - -table.in-flight { - border: 1px solid #d3d3d3; - border-collapse:collapse; - width: 400px; -} - -table.in-flight td { - border: 1px solid #d3d3d3; - vertical-align: top; - overflow-x: hidden; -} - -table.logs { - width: 100%; -} - -table.logs thead { - font-weight: bold; -} \ No newline at end of file diff --git a/public/scripts/jquery.sparkline.min.js b/public/scripts/jquery.sparkline.min.js deleted file mode 100644 index 628efd2..0000000 --- a/public/scripts/jquery.sparkline.min.js +++ /dev/null @@ -1,94 +0,0 @@ -/* jquery.sparkline 1.6 - http://omnipotent.net/jquery.sparkline/ -** Licensed under the New BSD License - see above site for details */ - -(function($){var defaults={common:{type:'line',lineColor:'#00f',fillColor:'#cdf',defaultPixelsPerValue:3,width:'auto',height:'auto',composite:false,tagValuesAttribute:'values',tagOptionsPrefix:'spark',enableTagOptions:false},line:{spotColor:'#f80',spotRadius:1.5,minSpotColor:'#f80',maxSpotColor:'#f80',lineWidth:1,normalRangeMin:undefined,normalRangeMax:undefined,normalRangeColor:'#ccc',drawNormalOnTop:false,chartRangeMin:undefined,chartRangeMax:undefined,chartRangeMinX:undefined,chartRangeMaxX:undefined},bar:{barColor:'#00f',negBarColor:'#f44',zeroColor:undefined,nullColor:undefined,zeroAxis:undefined,barWidth:4,barSpacing:1,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false,colorMap:undefined},tristate:{barWidth:4,barSpacing:1,posBarColor:'#6f6',negBarColor:'#f44',zeroBarColor:'#999',colorMap:{}},discrete:{lineHeight:'auto',thresholdColor:undefined,thresholdValue:0,chartRangeMax:undefined,chartRangeMin:undefined,chartRangeClip:false},bullet:{targetColor:'red',targetWidth:3,performanceColor:'blue',rangeColors:['#D3DAFE','#A8B6FF','#7F94FF'],base:undefined},pie:{sliceColors:['#f00','#0f0','#00f']},box:{raw:false,boxLineColor:'black',boxFillColor:'#cdf',whiskerColor:'black',outlierLineColor:'#333',outlierFillColor:'white',medianColor:'red',showOutliers:true,outlierIQR:1.5,spotRadius:1.5,target:undefined,targetColor:'#4a2',chartRangeMax:undefined,chartRangeMin:undefined}};var VCanvas_base,VCanvas_canvas,VCanvas_vml;$.fn.simpledraw=function(width,height,use_existing){if(use_existing&&this[0].VCanvas){return this[0].VCanvas;} -if(width===undefined){width=$(this).innerWidth();} -if(height===undefined){height=$(this).innerHeight();} -if($.browser.hasCanvas){return new VCanvas_canvas(width,height,this);}else if($.browser.msie){return new VCanvas_vml(width,height,this);}else{return false;}};var pending=[];$.fn.sparkline=function(uservalues,userOptions){return this.each(function(){var options=new $.fn.sparkline.options(this,userOptions);var render=function(){var values,width,height;if(uservalues==='html'||uservalues===undefined){var vals=this.getAttribute(options.get('tagValuesAttribute'));if(vals===undefined||vals===null){vals=$(this).html();} -values=vals.replace(/(^\s*\s*$)|\s+/g,'').split(',');}else{values=uservalues;} -width=options.get('width')=='auto'?values.length*options.get('defaultPixelsPerValue'):options.get('width');if(options.get('height')=='auto'){if(!options.get('composite')||!this.VCanvas){var tmp=document.createElement('span');tmp.innerHTML='a';$(this).html(tmp);height=$(tmp).innerHeight();$(tmp).remove();}}else{height=options.get('height');} -$.fn.sparkline[options.get('type')].call(this,values,options,width,height);};if(($(this).html()&&$(this).is(':hidden'))||($.fn.jquery<"1.3.0"&&$(this).parents().is(':hidden'))||!$(this).parents('body').length){pending.push([this,render]);}else{render.call(this);}});};$.fn.sparkline.defaults=defaults;$.sparkline_display_visible=function(){for(var i=pending.length-1;i>=0;i--){var el=pending[i][0];if($(el).is(':visible')&&!$(el).parents().is(':hidden')){pending[i][1].call(el);pending.splice(i,1);}}};var UNSET_OPTION={};var normalizeValue=function(val){switch(val){case'undefined':val=undefined;break;case'null':val=null;break;case'true':val=true;break;case'false':val=false;break;default:var nf=parseFloat(val);if(val==nf){val=nf;}} -return val;};$.fn.sparkline.options=function(tag,userOptions){var extendedOptions;this.userOptions=userOptions=userOptions||{};this.tag=tag;this.tagValCache={};var defaults=$.fn.sparkline.defaults;var base=defaults.common;this.tagOptionsPrefix=userOptions.enableTagOptions&&(userOptions.tagOptionsPrefix||base.tagOptionsPrefix);var tagOptionType=this.getTagSetting('type');if(tagOptionType===UNSET_OPTION){extendedOptions=defaults[userOptions.type||base.type];}else{extendedOptions=defaults[tagOptionType];} -this.mergedOptions=$.extend({},base,extendedOptions,userOptions);};$.fn.sparkline.options.prototype.getTagSetting=function(key){var val,i,prefix=this.tagOptionsPrefix;if(prefix===false||prefix===undefined){return UNSET_OPTION;} -if(this.tagValCache.hasOwnProperty(key)){val=this.tagValCache.key;}else{val=this.tag.getAttribute(prefix+key);if(val===undefined||val===null){val=UNSET_OPTION;}else if(val.substr(0,1)=='['){val=val.substr(1,val.length-2).split(',');for(i=val.length;i--;){val[i]=normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g,''));}}else if(val.substr(0,1)=='{'){var pairs=val.substr(1,val.length-2).split(',');val={};for(i=pairs.length;i--;){var keyval=pairs[i].split(':',2);val[keyval[0].replace(/(^\s*)|(\s*$)/g,'')]=normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g,''));}}else{val=normalizeValue(val);} -this.tagValCache.key=val;} -return val;};$.fn.sparkline.options.prototype.get=function(key){var tagOption=this.getTagSetting(key);if(tagOption!==UNSET_OPTION){return tagOption;} -return this.mergedOptions[key];};$.fn.sparkline.line=function(values,options,width,height){var xvalues=[],yvalues=[],yminmax=[];for(var i=0;imaxy){maxy=normalRangeMax;}} -if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')maxy)){maxy=options.get('chartRangeMax');} -if(options.get('chartRangeMinX')!==undefined&&(options.get('chartRangeClipX')||options.get('chartRangeMinX')maxx)){maxx=options.get('chartRangeMaxX');} -var rangex=maxx-minx===0?1:maxx-minx;var rangey=maxy-miny===0?1:maxy-miny;var vl=yvalues.length-1;if(vl<1){this.innerHTML='';return;} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_width=target.pixel_width;var canvas_height=target.pixel_height;var canvas_top=0;var canvas_left=0;var spotRadius=options.get('spotRadius');if(spotRadius&&(canvas_width<(spotRadius*4)||canvas_height<(spotRadius*4))){spotRadius=0;} -if(spotRadius){if(options.get('minSpotColor')||(options.get('spotColor')&&yvalues[vl]==miny)){canvas_height-=Math.ceil(spotRadius);} -if(options.get('maxSpotColor')||(options.get('spotColor')&&yvalues[vl]==maxy)){canvas_height-=Math.ceil(spotRadius);canvas_top+=Math.ceil(spotRadius);} -if(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[0]==miny||yvalues[0]==maxy)){canvas_left+=Math.ceil(spotRadius);canvas_width-=Math.ceil(spotRadius);} -if(options.get('spotColor')||(options.get('minSpotColor')||options.get('maxSpotColor')&&(yvalues[vl]==miny||yvalues[vl]==maxy))){canvas_width-=Math.ceil(spotRadius);}} -canvas_height--;var drawNormalRange=function(){if(normalRangeMin!==undefined){var ytop=canvas_top+Math.round(canvas_height-(canvas_height*((normalRangeMax-miny)/rangey)));var height=Math.round((canvas_height*(normalRangeMax-normalRangeMin))/rangey);target.drawRect(canvas_left,ytop,canvas_width,height,undefined,options.get('normalRangeColor'));}};if(!options.get('drawNormalOnTop')){drawNormalRange();} -var path=[];var paths=[path];var x,y,vlen=yvalues.length;for(i=0;imaxy){y=maxy;} -if(!path.length){path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+canvas_height]);} -path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)),canvas_top+Math.round(canvas_height-(canvas_height*((y-miny)/rangey)))]);}} -var lineshapes=[];var fillshapes=[];var plen=paths.length;for(i=0;i2){path[0]=[path[0][0],path[1][1]];} -lineshapes.push(path);} -plen=fillshapes.length;for(i=0;imax)){max=options.get('chartRangeMax');} -var zeroAxis=options.get('zeroAxis');if(zeroAxis===undefined){zeroAxis=min<0;} -var range=max-min===0?1:max-min;var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var color,canvas_height=target.pixel_height,yzero=min<0&&zeroAxis?canvas_height-Math.round(canvas_height*(Math.abs(min)/range))-1:canvas_height-1;for(i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,val=values[i];if(val===null){if(options.get('nullColor')){color=options.get('nullColor');val=(zeroAxis&&min<0)?0:min;height=1;y=(zeroAxis&&min<0)?yzero:canvas_height-height;}else{continue;}}else{if(valmax){val=max;} -color=(val<0)?options.get('negBarColor'):options.get('barColor');if(zeroAxis&&min<0){height=Math.round(canvas_height*((Math.abs(val)/range)))+1;y=(val<0)?yzero:yzero-height;}else{height=Math.round(canvas_height*((val-min)/range))+1;y=canvas_height-height;} -if(val===0&&options.get('zeroColor')!==undefined){color=options.get('zeroColor');} -if(colorMapByValue&&colorMapByValue[val]){color=colorMapByValue[val];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} -if(color===null){continue;}} -target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.tristate=function(values,options,width,height){values=$.map(values,Number);width=(values.length*options.get('barWidth'))+((values.length-1)*options.get('barSpacing'));var colorMapByIndex,colorMapByValue;if($.isArray(options.get('colorMap'))){colorMapByIndex=options.get('colorMap');colorMapByValue=null;}else{colorMapByIndex=null;colorMapByValue=options.get('colorMap');} -var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,half_height=Math.round(canvas_height/2);for(var i=values.length;i--;){var x=i*(options.get('barWidth')+options.get('barSpacing')),y,color;if(values[i]<0){y=half_height;height=half_height-1;color=options.get('negBarColor');}else if(values[i]>0){y=0;height=half_height-1;color=options.get('posBarColor');}else{y=half_height-1;height=2;color=options.get('zeroBarColor');} -if(colorMapByValue&&colorMapByValue[values[i]]){color=colorMapByValue[values[i]];}else if(colorMapByIndex&&colorMapByIndex.length>i){color=colorMapByIndex[i];} -if(color===null){continue;} -target.drawRect(x,y,options.get('barWidth')-1,height-1,color,color);}}else{this.innerHTML='';}};$.fn.sparkline.discrete=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?values.length*2:width;var interval=Math.floor(width/values.length);var target=$(this).simpledraw(width,height,options.get('composite'));if(target){var canvas_height=target.pixel_height,line_height=options.get('lineHeight')=='auto'?Math.round(canvas_height*0.3):options.get('lineHeight'),pheight=canvas_height-line_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('chartRangeMin')!==undefined&&(options.get('chartRangeClip')||options.get('chartRangeMin')max)){max=options.get('chartRangeMax');} -var range=max-min;for(var i=values.length;i--;){var val=values[i];if(valmax){val=max;} -var x=(i*interval),ytop=Math.round(pheight-pheight*((val-min)/range));target.drawLine(x,ytop,x,ytop+line_height,(options.get('thresholdColor')&&val1){var canvas_width=target.pixel_width-Math.ceil(options.get('targetWidth')/2),canvas_height=target.pixel_height,min=Math.min.apply(Math,values),max=Math.max.apply(Math,values);if(options.get('base')===undefined){min=min<0?min:0;}else{min=options.get('base');} -var range=max-min;for(var i=2,vlen=values.length;i1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height,radius=Math.floor(Math.min(canvas_width,canvas_height)/2),total=0,next=0,circle=2*Math.PI;for(var i=values.length;i--;){total+=values[i];} -if(options.get('offset')){next+=(2*Math.PI)*(options.get('offset')/360);} -var vlen=values.length;for(i=0;i0){end=next+(circle*(values[i]/total));} -target.drawPieSlice(radius,radius,radius,start,end,undefined,options.get('sliceColors')[i%options.get('sliceColors').length]);next=end;}}};var quartile=function(values,q){if(q==2){var vl2=Math.floor(values.length/2);return values.length%2?values[vl2]:(values[vl2]+values[vl2+1])/2;}else{var vl4=Math.floor(values.length/4);return values.length%2?(values[vl4*q]+values[vl4*q+1])/2:values[vl4*q];}};$.fn.sparkline.box=function(values,options,width,height){values=$.map(values,Number);width=options.get('width')=='auto'?'4.0em':width;var minvalue=options.get('chartRangeMin')===undefined?Math.min.apply(Math,values):options.get('chartRangeMin'),maxvalue=options.get('chartRangeMax')===undefined?Math.max.apply(Math,values):options.get('chartRangeMax'),target=$(this).simpledraw(width,height,options.get('composite')),vlen=values.length,lwhisker,loutlier,q1,q2,q3,rwhisker,routlier;if(target&&values.length>1){var canvas_width=target.pixel_width,canvas_height=target.pixel_height;if(options.get('raw')){if(options.get('showOutliers')&&values.length>5){loutlier=values[0];lwhisker=values[1];q1=values[2];q2=values[3];q3=values[4];rwhisker=values[5];routlier=values[6];}else{lwhisker=values[0];q1=values[1];q2=values[2];q3=values[3];rwhisker=values[4];}}else{values.sort(function(a,b){return a-b;});q1=quartile(values,1);q2=quartile(values,2);q3=quartile(values,3);var iqr=q3-q1;if(options.get('showOutliers')){lwhisker=undefined;rwhisker=undefined;for(var i=0;iq1-(iqr*options.get('outlierIQR'))){lwhisker=values[i];} -if(values[i]rwhisker){target.drawCircle((routlier-minvalue)*unitsize+canvas_left,canvas_height/2,options.get('spotRadius'),options.get('outlierLineColor'),options.get('outlierFillColor'));}} -target.drawRect(Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q3-q1)*unitsize),Math.round(canvas_height*0.8),options.get('boxLineColor'),options.get('boxFillColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q1-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((lwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),Math.round((q3-minvalue)*unitsize+canvas_left),Math.round(canvas_height/2),options.get('lineColor'));target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height/4),Math.round((rwhisker-minvalue)*unitsize+canvas_left),Math.round(canvas_height-canvas_height/4),options.get('whiskerColor'));target.drawLine(Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.1),Math.round((q2-minvalue)*unitsize+canvas_left),Math.round(canvas_height*0.9),options.get('medianColor'));if(options.get('target')){var size=Math.ceil(options.get('spotRadius'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)-size),Math.round((options.get('target')-minvalue)*unitsize+canvas_left),Math.round((canvas_height/2)+size),options.get('targetColor'));target.drawLine(Math.round((options.get('target')-minvalue)*unitsize+canvas_left-size),Math.round(canvas_height/2),Math.round((options.get('target')-minvalue)*unitsize+canvas_left+size),Math.round(canvas_height/2),options.get('targetColor'));}}else{this.innerHTML='';}};if($.browser.msie&&!document.namespaces.v){document.namespaces.add('v','urn:schemas-microsoft-com:vml','#default#VML');} -if($.browser.hasCanvas===undefined){var t=document.createElement('canvas');$.browser.hasCanvas=t.getContext!==undefined;} -VCanvas_base=function(width,height,target){};VCanvas_base.prototype={init:function(width,height,target){this.width=width;this.height=height;this.target=target;if(target[0]){target=target[0];} -target.VCanvas=this;},drawShape:function(path,lineColor,fillColor,lineWidth){alert('drawShape not implemented');},drawLine:function(x1,y1,x2,y2,lineColor,lineWidth){return this.drawShape([[x1,y1],[x2,y2]],lineColor,lineWidth);},drawCircle:function(x,y,radius,lineColor,fillColor){alert('drawCircle not implemented');},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){alert('drawPieSlice not implemented');},drawRect:function(x,y,width,height,lineColor,fillColor){alert('drawRect not implemented');},getElement:function(){return this.canvas;},_insert:function(el,target){$(target).html(el);}};VCanvas_canvas=function(width,height,target){return this.init(width,height,target);};VCanvas_canvas.prototype=$.extend(new VCanvas_base(),{_super:VCanvas_base.prototype,init:function(width,height,target){this._super.init(width,height,target);this.canvas=document.createElement('canvas');if(target[0]){target=target[0];} -target.VCanvas=this;$(this.canvas).css({display:'inline-block',width:width,height:height,verticalAlign:'top'});this._insert(this.canvas,target);this.pixel_height=$(this.canvas).height();this.pixel_width=$(this.canvas).width();this.canvas.width=this.pixel_width;this.canvas.height=this.pixel_height;$(this.canvas).css({width:this.pixel_width,height:this.pixel_height});},_getContext:function(lineColor,fillColor,lineWidth){var context=this.canvas.getContext('2d');if(lineColor!==undefined){context.strokeStyle=lineColor;} -context.lineWidth=lineWidth===undefined?1:lineWidth;if(fillColor!==undefined){context.fillStyle=fillColor;} -return context;},drawShape:function(path,lineColor,fillColor,lineWidth){var context=this._getContext(lineColor,fillColor,lineWidth);context.beginPath();context.moveTo(path[0][0]+0.5,path[0][1]+0.5);for(var i=1,plen=path.length;i';this.canvas.insertAdjacentHTML('beforeEnd',groupel);this.group=$(this.canvas).children()[0];},drawShape:function(path,lineColor,fillColor,lineWidth){var vpath=[];for(var i=0,plen=path.length;i'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawCircle:function(x,y,radius,lineColor,fillColor){x-=radius+1;y-=radius+1;var stroke=lineColor===undefined?' stroked="false" ':' strokeWeight="1" strokeColor="'+lineColor+'" ';var fill=fillColor===undefined?' filled="false"':' fillColor="'+fillColor+'" filled="true" ';var vel='';this.group.insertAdjacentHTML('beforeEnd',vel);},drawPieSlice:function(x,y,radius,startAngle,endAngle,lineColor,fillColor){if(startAngle==endAngle){return;} -if((endAngle-startAngle)==(2*Math.PI)){startAngle=0.0;endAngle=(2*Math.PI);} -var startx=x+Math.round(Math.cos(startAngle)*radius);var starty=y+Math.round(Math.sin(startAngle)*radius);var endx=x+Math.round(Math.cos(endAngle)*radius);var endy=y+Math.round(Math.sin(endAngle)*radius);if(startx==endx&&starty==endy&&(endAngle-startAngle)'+' ';this.group.insertAdjacentHTML('beforeEnd',vel);},drawRect:function(x,y,width,height,lineColor,fillColor){return this.drawShape([[x,y],[x,y+height],[x+width,y+height],[x+width,y],[x,y]],lineColor,fillColor);}});})(jQuery); diff --git a/public/scripts/mon-client.js b/public/scripts/mon-client.js deleted file mode 100644 index 07f8736..0000000 --- a/public/scripts/mon-client.js +++ /dev/null @@ -1,79 +0,0 @@ -$(document).ready(function() { - var wsCtor = window['MozWebSocket'] ? MozWebSocket : WebSocket; - var currentMemoryUsage = [], hostCpu = [], pendingInRequests = [], pendingOutRequests = []; - - var uri = 'ws://' + document.domain; - uri = uri + ':' + (document.location.protocol === 'https:' ? 443 : document.location.port); - var socket = new wsCtor(uri, 'ql.io-mon'); - socket.onmessage = function(e) { - var json; - try { - json = JSON.parse(e.data); - $('#hostCpu').html(json.master.hostCpu); - hostCpu.push(json.master.hostCpu); - if(hostCpu.length > 120) { - hostCpu = hostCpu.slice(1); - } - - $('#currentMemoryUsage').html(json.master.currentMemoryUsage); - currentMemoryUsage.push(json.master.currentMemoryUsage); - if(currentMemoryUsage.length > 120) { - currentMemoryUsage = currentMemoryUsage.slice(1); - } - - var pendingOut = 0, pendingIn = 0; - $('#averageLoad').html(json.master.averageLoad); - $.each(json.master.workers, function(i, worker) { - $('#connectionsTotal' + '-' + i).html(worker.connectionsTotal); - $('#connectionsActive' + '-' + i).html(worker.connectionsActive); - $('#requestsTotal-' + i).html(worker.requestsTotal); - $('#inRequests-' + i).html(worker.inRequests); - $('#outResponses-' + i).html(worker.outResponses); - $('#outRequests-' + i).html(worker.outRequests); - $('#inResponses-' + i).html(worker.inResponses); - $('#activeInRequests-' + i).html(worker.inRequests - worker.outResponses); - $('#activeOutRequests-' + i).html(worker.outRequests - worker.inResponses); - pendingIn = pendingIn + worker.inRequests - worker.outResponses; - pendingOut = pendingOut + worker.outRequests - worker.inResponses; - }); - - $('#inRequests').html(json.master.inRequests); - $('#outResponses').html(json.master.outResponses); - $('#outRequests').html(json.master.outRequests); - $('#inResponses').html(json.master.inResponses); - - pendingInRequests.push(pendingIn); - if(pendingInRequests.length > 120) { - pendingInRequests = pendingInRequests.slice(1); - } - $('#master-in-pending').sparkline(pendingInRequests, { height: 100, width: 800, type:'bar', barColor:'red' }); - $('#master-pending-in-min').html(Math.min.apply(Math, pendingInRequests)); - $('#master-pending-in-max').html(Math.max.apply(Math, pendingInRequests)); - pendingOutRequests.push(pendingOut); - if(pendingOutRequests.length > 120) { - pendingOutRequests = pendingOutRequests.slice(1); - } - $('#master-out-pending').sparkline(pendingOutRequests, { height: 100, width: 800, type:'bar', barColor:'green' }); - $('#master-pending-out-min').html(Math.min.apply(Math, pendingOutRequests)); - $('#master-pending-out-max').html(Math.max.apply(Math, pendingOutRequests)); - } - catch(e) { - alert(e) - } - } - - function forMemoryNum(memory) { - var strMemory; - if(memory < 1024) { - strMemory = memory + ' Bytes'; - } - if(memory < 1024 * 1024) { - strMemory = (memory / 1024).toFixed(2) + ' KB'; - } - else { - strMemory = (memory / (1024 * 1024)).toFixed(2) + ' MB'; - } - return strMemory; - } -}); - diff --git a/public/views/footer.ejs b/public/views/footer.ejs deleted file mode 100644 index 44c205d..0000000 --- a/public/views/footer.ejs +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/public/views/header.ejs b/public/views/header.ejs deleted file mode 100644 index 9eb557f..0000000 --- a/public/views/header.ejs +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/public/views/index.ejs b/public/views/index.ejs deleted file mode 100644 index 9c0bec4..0000000 --- a/public/views/index.ejs +++ /dev/null @@ -1,56 +0,0 @@ -

Master

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Number of workers <%=master.noWorkers %> (<%=master.workersKilled%> killed)
Number of core used <%=master.coresUsed%>
Mem usage at startup <%=master.memoryUsageAtBoot%>
Current total mem usage <%=master.currentMemoryUsage%>
CPU usage <%=master.hostCpu%>%
Average load - <%=master.averageLoad%>
- -

Logs

- -Logs - -

Counters

- -
- - <% for(var pid in master.workers) { %> - - - - - <% for(var name in master.workers[pid]) { %> - - - - - <% } %> - - <% } %> -
Worker <%= pid %>
<%=name%><%=master.workers[pid][name]%>
-
- - diff --git a/public/views/layout.ejs b/public/views/layout.ejs deleted file mode 100644 index 041a422..0000000 --- a/public/views/layout.ejs +++ /dev/null @@ -1,99 +0,0 @@ - - - - Runtime Monitor - - - - - - - - - - - -<%- partial("header") %> - -
-<%- body %> - - -
- - diff --git a/public/views/logs.ejs b/public/views/logs.ejs deleted file mode 100644 index d9a0e38..0000000 --- a/public/views/logs.ejs +++ /dev/null @@ -1,22 +0,0 @@ -

Log Files

- - - - - - - - - - - - <% for(var i = 0; i < logs.length; i++) { %> - - - - - - - <% } %> - -
FileSizeCreatedLast Modifled
<%=logs[i].filename%><%=logs[i].stats.size%><%=logs[i].stats.ctime%><%=logs[i].stats.mtime%>
diff --git a/test/cluster-test.js b/test/cluster-test.js deleted file mode 100644 index 3e2c4ed..0000000 --- a/test/cluster-test.js +++ /dev/null @@ -1,622 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var spawn = require('child_process').spawn, - request = require('request'), - fs = require('fs'), - os = require('os'), - EventEmitter = require('events').EventEmitter, - util = require('util'), - _ = require('underscore'), - Q = require('q'); - -var debug = false; -function log() { - if(debug) { - console.log.apply(null, (arguments || []).join('')); - } -} -var port = 3000, - monPort = 10000 - port; - -module.exports = { - - setUp: function (callback) { - //to ensure that occupying ports won't cause all test cases to fail - fs.exists("./ports", function(exists){ - if(!exists){ - fs.writeFileSync("./ports", port); - } - fs.readFile("./ports", - function(err, data){ - port = parseInt(data, 10) + 1; - if(port >= 5000){ - port = 3000; - } - monPort = 10000 - port; - fs.writeFile("./ports", "" + port, { - encoding : "utf8" - }, - function(){ - callback(); - }); - }); - }); - }, - - 'start and then stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - stop(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, check heartbeat and stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - - var timeOut = setTimeout(function(){ - test.ok(false, "timeout and no heartbeat found"); - stop(emitter); - }, 3000); - - emitter.on('heartbeat', function(heartbeat){ - test.ok(heartbeat.pid); - test.ok(heartbeat.uptime); - test.ok(heartbeat.totalmem); - test.ok(heartbeat.freemem); - - clearTimeout(timeOut); - stop(emitter); - }); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, check ecv and stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - setTimeout(function(){ - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - // Regex to match the expected response. Tricky part is the IPv4 match. - // Very naive exp to check numbers 0 - 255. - // (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? ) -> ( numbers 250 to 255 | numbers 200 to 249 | numbers 0 to 199) - // Same expression for each of the 4 IPs - var hostname = require('os').hostname(); - var re = new RegExp(util.format( - 'status=AVAILABLE&ServeTraffic=true&ip=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)&hostname=%s&port=%d&time=.*', - hostname, - port)); - - test.ok(re.exec(body) !== null, - util.format('expected:status=AVAILABLE&ServeTraffic=true&ip=&hostname=%s&port=%d&time=.*&error=%s&body=%s', hostname, port, error, body)); - - stop(emitter); - }) - }, 1000); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]); - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }) - - emitter.emit('starting'); - }, - - 'start and then shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - shutdown(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - - 'start, send traffic, get responses, and then shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - var respCount = 0; - for(var i = 0; i < 10; i++) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - if(error) { - test.ok(false, 'got error from server') - } - else { - respCount++; - if(respCount === 10) { - return shutdown(emitter); - } - } - }); - } - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, graceful shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - var respCount = 0; - emitter.on('started', function () { - for(var i = 0; i < 2000; i++) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - if(error) { - test.ok(false, 'got error from server') - } - else { - respCount++; - } - }); - } - // Send shutdown while requests are in-flight - shutdown(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - // Ensure that all in-flight requests are handled - test.equals(respCount, 2000); - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, check recycle on threshold, shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - var respCount = 0, errCount = 0; - emitter.on('started', function () { - var paths = fs.readdirSync('./pids'); - - // connThreshold is 10. So, sending 20+ requests without pooling would cause - // recycle - for(var i = 0; i < 100; i++) { - request({ - uri: util.format('http://localhost:%d', port), - headers: { - 'connection': 'close' - } - }, function (error, response, body) { - if(error) { - test.ok(false, error.message || 'got error from server') - } - else { - respCount++; - } - if(respCount === 100) { - // Wait for process recycling to complete - setTimeout(function() { - // Before shutting down, check the pids again - var pathsEnd = fs.readdirSync('./pids'); - test.ok(pathsEnd.length > paths.length, 'Expected more processes'); - shutdown(emitter); - }, 5000); - } - }); - } - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.ok(respCount + errCount, 2000); - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, abrupt stop': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - var respCount = 0, errCount = 0; - emitter.on('started', function () { - for(var i = 0; i < 2000; i++) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - if(error) { - errCount++; - } - else { - respCount++; - } - }); - } - // Send shutdown while requests are in-flight - stop(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - // Ensure that all in-flight requests are handled - test.ok(respCount + errCount, 2000); - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, disable, enable and stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - // Regex to match the expected response. Tricky part is the IPv4 match. - // Very naive exp to check numbers 0 - 255. - // (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? ) -> ( numbers 250 to 255 | numbers 200 to 249 | numbers 0 to 199) - // Same expression for each of the 4 IPs - var hostname = require('os').hostname(); - var re = new RegExp(util.format( - 'status=AVAILABLE&ServeTraffic=true&ip=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)&hostname=%s&port=%d&time=.*', - hostname, - port)); - var result = re.exec(body); - test.ok(result !== null, - util.format('expected:status=AVAILABLE&ServeTraffic=true&ip=&hostname=%s&port=%d&time=.*', hostname, port)); - - request({uri: util.format('http://localhost:%d/ecv/disable', port), method: 'POST'}, function (error, response, body) { - // Wait for signal to propagate to workers - setTimeout(function() { - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - re = new RegExp(util.format( - 'status=DISABLED&ServeTraffic=false&ip=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)&hostname=%s&port=%d&time=.*', - hostname, - port)); - var result = re.exec(body); - test.ok(result !== null, - util.format('expected:status=AVAILABLE&ServeTraffic=false&ip=&hostname=%s&port=%d&time=.*', hostname, port)); - request({uri: util.format('http://localhost:%d/ecv/enable', port), method: 'POST'}, function (error, response, body) { - if(error) { - test.ok(false, 'could not enable again'); - } - setTimeout(function() { - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - if(error) { - test.ok(false, 'ecv did not succeed'); - } - stop(emitter); - }); - }, 200); - }); - }); - - }, 200); - }); - }); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }) - - emitter.emit('starting'); - } -} - -// Start the cluster -function start(emitter) { - log('Starting'); - var env = {}; - _.extend(env, process.env); - _.extend(env, { - port:port, - monPort:monPort - }); - var start = spawn('node', ['test/lib/server.js'], { - env: env, - stdio: ['pipe', 1, 2, 'ipc']//enable piped stdout, and ipc for messaging - }); - start.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - return start; -} - -function stop(emitter) { - log('Stopping'); - var stop = spawn('node', ['test/lib/stop.js']); - stop.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - stop.stdout.setEncoding('utf8'); - stop.stdout.on('data', function (data) { - log(data); - }); - emitter.emit('stopping'); -} - -function shutdown(emitter) { - log('Shutting down'); - var shutdown = spawn('node', ['test/lib/shutdown.js']); - shutdown.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - shutdown.stdout.setEncoding('utf8'); - shutdown.stdout.on('data', function (data) { - log(data); - }); - emitter.emit('stopping'); -} - -/* -function waitForStart(child, emitter, test, current, max) { - current++; - if(current < max) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - log('Waiting for server to start'); - if(error) { - log('Error: ', error.stack || error); - if(error.code === 'ECONNREFUSED') { - setTimeout(function () { - waitForStart.apply(null, [child, emitter, test, current, max]) - }, 100); - } - } - else { - emitter.emit('started'); - } - }); - } - else { - test.ok(false, 'Server did not start. Giving up'); - test.done(); - } -} -*/ - -function waitForStart(child, emitter, test) { - - var deferred = Q.defer(); - var timeOut = setTimeout(function(){ - deferred.reject(new Error("timeout")); - }, 3000); - - var handler = function(message){ - if(message.ready){ - clearTimeout(timeOut); - deferred.resolve(); - child.removeListener("message", handler); - } - if(message.type === 'heartbeat'){ - emitter.emit('heartbeat', message); - } - }; - child.on("message", handler); - - deferred.promise.then(function(){ - emitter.emit("started"); - }) - .fail(function(error){ - test.ok(false, error); - test.done(); - }) - .done(); -} - -function waitForStop(emitter, test, current, max) { - current++; - if(current < max) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - log('Waiting for server to stop'); - if(error) { - emitter.emit('stopped'); - } - else { - setTimeout(function () { - waitForStop.apply(null, [emitter, test, current, max]) - }, 100); - } - }); - } - else { - test.ok(false, 'Server did not start. Giving up'); - test.done(); - } -} - - diff --git a/test/component-status-test.js b/test/component-status-test.js deleted file mode 100644 index f486d70..0000000 --- a/test/component-status-test.js +++ /dev/null @@ -1,103 +0,0 @@ -'use strict'; - -var componentStatus = require('../lib/component-status.js').componentStatus, - should = require('should'); - -describe('component-status', function(){ - - describe('#register', function(){ - - it('should allow registration', function(done){ - - componentStatus.register('health', function(params){ - return 'i am healthy\n'; - }); - - componentStatus.reducer('health', function(memoize, health){ - return { - value : memoize && health - }; - }); - - componentStatus.getComponents().should.include('health'); - - componentStatus.getStatus('health', { - done : function(status){ - status.should.be.ok; - done(); - } - }); - }); - - it('should allow update of status of the updater is given', function(done){ - var trafficEnabled = true; - componentStatus.register('traffic-enabled', - function(params){ - return trafficEnabled; - }, - 'array', - function(params, value){ - trafficEnabled = value; - }); - - componentStatus.getStatus('traffic-enabled', { - 'done': function(status){ - status.should.be.ok; - status[0].should.be.ok; - - componentStatus.setStatus('traffic-enabled', { - 'done': function(){ - - componentStatus.getStatus('traffic-enabled', { - 'done': function(status){ - - status.should.be.ok; - status[0].should.not.be.ok; - - done(); - } - }); - } - }, false); - } - }); - }); - - it('should allow update of status of the updater is given from worker', function(done){ - var trafficEnabled = true; - componentStatus.register('traffic-enabled', - function(params){ - return trafficEnabled; - }, - 'array', - function(params, value){ - trafficEnabled = value; - }); - - componentStatus.getStatus('traffic-enabled', { - 'worker': process.pid, - 'done': function(status){ - status.should.be.ok; - status[0].should.be.ok; - - componentStatus.setStatus('traffic-enabled', { - 'worker': process.pid, - 'done': function(){ - - componentStatus.getStatus('traffic-enabled', { - 'worker': process.pid, - 'done': function(status){ - - status.should.be.ok; - status[0].should.not.be.ok; - - done(); - } - }); - } - }, false); - } - }); - }); - }); -}); \ No newline at end of file diff --git a/test/lib/cache-test.js b/test/lib/cache-test.js new file mode 100644 index 0000000..b5d0099 --- /dev/null +++ b/test/lib/cache-test.js @@ -0,0 +1,30 @@ +'use strict'; + +var promiseOfUsr = require('../../lib/cache-usr.js').user(process.env['domain']), + when = require('when'), + should = require('should'); + +var counter = 0; + +promiseOfUsr.then(function(usr){ + + //usr.makeCopy(); + + for(var i = 0; i < 10000; i += 1){ + + + usr.get('k2', function(){ + return 'v2'; + }) + .then(function(v){ + //should be v2 + v.should.equal('v2'); + counter += 1; + }); + } +}); + +setTimeout(function(){ + console.log('test got:' + counter); + process.exit(0); +}, 3000); \ No newline at end of file diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js new file mode 100644 index 0000000..ab34b15 --- /dev/null +++ b/test/lib/cluster-test.js @@ -0,0 +1,25 @@ +'use strict'; + +var Cluster = require('../../lib/index.js'), + util = require('util'), + express = require('express'), + app = express(); + +app.get('/', function(req, res){ + + require('../../lib/cache-usr.js').user() + .then(function(user){ + + console.log('cache user started'); + + res.send(util.format('hello from:%d', process.pid), 200); + }); +}); + +new Cluster({ + 'noWorkers': 1, + 'createServer': require('http').createServer, + 'app': app, + 'port': 8080 +}) +.listen(); \ No newline at end of file diff --git a/test/lib/server.js b/test/lib/server.js deleted file mode 100644 index 75cb8b1..0000000 --- a/test/lib/server.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'), - express = require('express'); - -var server = express.createServer(); -var serving = true; -server.get('/', function(req, res) { - res.send('hello'); - if(!serving) { - req.connection.end(); - } -}); - -server.on('close', function() { - serving = false; -}) - -var c = new Cluster({ - timeout: 300 * 1000, - port: process.env["port"] || 3000, - monPort: process.env["monPort"] || 10000 - process.env["port"] || 3001, - cluster: true, - noWorkers: process.env["noWorkers"] || 2, - connThreshold: 10, - ecv: { - control: true - }, - heartbeatInterval: 1000 -}); - -c.on('died', function(pid) { - console.log('Worker ' + pid + ' died'); - process.send({ - dead: true - }) -}); - -c.on('forked', function(pid) { - console.log('Worker ' + pid + ' forked'); -}); - -c.on('listening', function(pid){ - console.log('Worker ' + pid + ' listening'); - process.send({ - ready: true - }); -}); - -c.on('SIGKILL', function() { - console.log('Got SIGKILL'); - process.send({ - 'signal':'SIGKILL' - }); -}); - -c.on('SIGTERM', function(event) { - console.log('Got SIGTERM - shutting down'); - console.log(event); - process.send({ - 'signal':'SIGTERM' - }); -}); - -c.on('SIGINT', function() { - console.log('Got SIGINT'); - process.send({ - 'signal':'SIGINT' - }); -}); - -c.on('heartbeat', function(heartbeat){ - - heartbeat.type = 'heartbeat'; - process.send(heartbeat); -}); - -c.listen(function(cb) { - cb(server); -}); diff --git a/test/lib/shutdown.js b/test/lib/shutdown.js deleted file mode 100644 index d122ae0..0000000 --- a/test/lib/shutdown.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'); -var c = new Cluster(); -c.shutdown(); \ No newline at end of file diff --git a/test/lib/stop.js b/test/lib/stop.js deleted file mode 100644 index febe6b9..0000000 --- a/test/lib/stop.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'); -var c = new Cluster(); -c.stop(); \ No newline at end of file diff --git a/test/lib/wsserver.js b/test/lib/wsserver.js deleted file mode 100644 index 4b36154..0000000 --- a/test/lib/wsserver.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'), - WebSocketServer = require('websocket').server, - http = require("http"); - -var server = http.createServer(function(request, response) { - console.log((new Date()) + ' Received request for ' + request.url); - response.writeHead(200); - response.end(); -}); - -var wsServer = new WebSocketServer({ - httpServer: server, - // You should not use autoAcceptConnections for production - // applications, as it defeats all standard cross-origin protection - // facilities built into the protocol and the browser. You should - // *always* verify the connection's origin and decide whether or not - // to accept it. - autoAcceptConnections: false -}); - -function originIsAllowed(origin) { - // put logic here to detect whether the specified origin is allowed. - return true; -} - -wsServer.on('request', function(request) { - if (!originIsAllowed(request.origin)) { - // Make sure we only accept requests from an allowed origin - request.reject(); - console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); - return; - } - - var connection = request.accept('echo-protocol', request.origin); - console.log((new Date()) + ' Connection accepted.'); - connection.on('message', function(message) { - - if (message.type === 'utf8') { - console.log('Process:' + process.pid + ' Received Message: ' + message.utf8Data); - connection.sendUTF(message.utf8Data); - } - else if (message.type === 'binary') { - console.log('Process:' + process.pid + ' Received Binary Message of ' + message.binaryData.length + ' bytes'); - connection.sendBytes(message.binaryData); - } - }); - connection.on('close', function(reasonCode, description) { - console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); - - wsServer.close(); - }); -}); - -server.on('close', function() { - serving = false; -}) - -var c = new Cluster({ - timeout: 300 * 1000, - port: process.env["port"] || 3000, - monPort: process.env["monPort"] || 10000 - process.env["port"] || 3001, - cluster: true, - noWorkers: process.env["noWorkers"] || 2, - connThreshold: 10, - ecv: { - control: true - }, - heartbeatInterval: 1000 -}); - -c.on('died', function(pid) { - console.log('Worker ' + pid + ' died'); - process.send({ - dead: true - }) -}); - -c.on('forked', function(pid) { - console.log('Worker ' + pid + ' forked'); -}); - -c.on('listening', function(pid){ - console.log('Worker ' + pid + ' listening'); - process.send({ - ready: true - }); -}); - -c.on('SIGKILL', function() { - console.log('Got SIGKILL'); - process.send({ - 'signal':'SIGKILL' - }); -}); - -c.on('SIGTERM', function(event) { - console.log('Got SIGTERM - shutting down'); - console.log(event); - process.send({ - 'signal':'SIGTERM' - }); -}); - -c.on('SIGINT', function() { - console.log('Got SIGINT'); - process.send({ - 'signal':'SIGINT' - }); -}); - -c.on('heartbeat', function(heartbeat){ - - heartbeat.type = 'heartbeat'; - process.send(heartbeat); -}); - -c.listen(function(cb) { - cb(server); -}); diff --git a/test/wscluster-test.js b/test/wscluster-test.js deleted file mode 100644 index 33aeb76..0000000 --- a/test/wscluster-test.js +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var spawn = require('child_process').spawn, - request = require('request'), - fs = require('fs'), - os = require('os'), - EventEmitter = require('events').EventEmitter, - util = require('util'), - _ = require('underscore'), - Q = require('q'), - WebSocketClient = require("websocket").client; - -var debug = false; -function log() { - if(debug) { - console.log.apply(null, (arguments || []).join('')); - } -} -var port = 3000, - monPort = 10000 - port; - -module.exports = { - - setUp: function (callback) { - //to ensure that occupying ports won't cause all test cases to fail - fs.exists("./ports", function(exists){ - if(!exists){ - fs.writeFileSync("./ports", port); - } - fs.readFile("./ports", - function(err, data){ - port = parseInt(data, 10) + 1; - if(port >= 5000){ - port = 3000; - } - monPort = 10000 - port; - fs.writeFile("./ports", "" + port, { - encoding : "utf8" - }, - function(){ - callback(); - }); - }); - }); - }, - - tearDown: function(callback){ - callback(); - }, - - 'start and then stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - //create 10 clients and verify that the websocket has been opened and served by different cluster workers. - _.each(_.range(0, 10), function(e){ - var client = new WebSocketClient(); - client.on('connectFailed', function(error) { - console.log('Connect Error: ' + error.toString()); - }); - - client.on('connect', function(connection) { - console.log('WebSocket client connected'); - connection.on('error', function(error) { - console.log("Connection Error: " + error.toString()); - }); - connection.on('close', function() { - console.log('echo-protocol Connection Closed'); - }); - connection.on('message', function(message) { - if (message.type === 'utf8') { - console.log("Received: '" + message.utf8Data + "'"); - } - }); - - var now = new Date().getTime(); - function sendNumber() { - if (connection.connected) { - var number = Math.round(Math.random() * 0xFFFFFF); - connection.sendUTF(number.toString()); - } - if(new Date().getTime() - now < 10000){ - setTimeout(sendNumber, 1000); - } - else{ - stop(emitter); - } - } - sendNumber(); - }); - - client.connect('ws://localhost:' + port + '/', 'echo-protocol'); - }); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - //test.equal(paths.length, 0); - }); - - test.done(); - }); - - emitter.emit('starting'); - } -} - -// Start the cluster -function start(emitter) { - log('Starting'); - var env = {}; - _.extend(env, process.env); - _.extend(env, { - port:port, - monPort:monPort - }); - var start = spawn('node', ['test/lib/wsserver.js'], { - env: env, - stdio: ['pipe', 1, 2, 'ipc']//enable piped stdout, and ipc for messaging - }); - start.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - return start; -} - -function stop(emitter) { - log('Stopping'); - var stop = spawn('node', ['test/lib/stop.js']); - stop.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - stop.stdout.setEncoding('utf8'); - stop.stdout.on('data', function (data) { - log(data); - }); - emitter.emit('stopping'); -} - -function shutdown(emitter) { - log('Shutting down'); - var shutdown = spawn('node', ['test/lib/shutdown.js']); - shutdown.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - shutdown.stdout.setEncoding('utf8'); - shutdown.stdout.on('data', function (data) { - log(data); - }); - emitter.emit('stopping'); -} - -function waitForStart(child, emitter, test) { - - var deferred = Q.defer(); - var timeOut = setTimeout(function(){ - deferred.reject(new Error("timeout")); - }, 3000); - - child.on("message", function(message){ - if(message.ready){ - clearTimeout(timeOut); - deferred.resolve(); - } - if(message.type === 'heartbeat'){ - emitter.emit('heartbeat', message); - } - }); - - deferred.promise.then(function(){ - emitter.emit("started"); - }) - .fail(function(error){ - test.ok(false, error); - test.done(); - }); -} - -function waitForStop(emitter, test, current, max) { - current++; - if(current < max) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - log('Waiting for server to stop'); - if(error) { - emitter.emit('stopped'); - } - else { - setTimeout(function () { - waitForStop.apply(null, [emitter, test, current, max]) - }, 100); - } - }); - } - else { - test.ok(false, 'Server did not start. Giving up'); - test.done(); - } -} - - From 15b70a8225c1d2aedc37e96f4000105d79b3d8ae Mon Sep 17 00:00:00 2001 From: huzhou Date: Mon, 2 Sep 2013 00:04:10 -0700 Subject: [PATCH 002/182] mock mon app --- lib/public/views/index.html | 156 ++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 lib/public/views/index.html diff --git a/lib/public/views/index.html b/lib/public/views/index.html new file mode 100644 index 0000000..f47a68e --- /dev/null +++ b/lib/public/views/index.html @@ -0,0 +1,156 @@ + + + + cluster2 + + + + + + + + + + + + +
+
+

Active Workers

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
# + + + + + + + +
debuggingfalsefalsefalsefalse
cpu10%11%9%10%
memory1024MB896MB975MB1000MB
connections20181921
gc10,511,612,714,6
tps30282931
errors3232
+
+
+ + +
+
+

Active Cache

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
#valuepersistedexpire
key1value1truenull
key2value2false60000ms
+
+
+ + \ No newline at end of file From 8d4bc481bbf7434314bcfde8bdfe051e1fe46f61 Mon Sep 17 00:00:00 2001 From: huzhou Date: Mon, 2 Sep 2013 21:27:56 -0700 Subject: [PATCH 003/182] + ecv + status --- lib/cluster-status.js | 85 +++++++++++++++++++++++++++++++++++++++++++ lib/ecv.js | 85 +++++++++++++++++++++++++++++++++++++++++++ lib/index.js | 10 ++++- lib/master.js | 8 +--- lib/worker.js | 4 +- 5 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 lib/cluster-status.js create mode 100644 lib/ecv.js diff --git a/lib/cluster-status.js b/lib/cluster-status.js new file mode 100644 index 0000000..a27f7a6 --- /dev/null +++ b/lib/cluster-status.js @@ -0,0 +1,85 @@ +'use strict'; + +//status is to allow workers to expose their important state to master, and possibly let monitor app show them clearly in its views + +var emitter = require('./cluster-emitter').emitter, + when = require('when'); + +var registry = {}; + +emitter.on('new-status', function(name, pid, view, update){ + + registry[name] = registry[name] || []; + registry[name].push({ + 'pid': pid + 'view': view, + 'update': update + }); +}); + +emitter.on('del-status', function(name){ + + delete registry[name]; +}) + +exports.status = { + + 'register': function register(name, view, update){ + + emitter.emit('new-status', ['master', 'self'], name, process.pid, view, udpate); + + emitter.on(util.format('get-status-%s', name), function(echo){ + + emitter.emit(echo, ['master', 'self'], view()); + }); + + emitter.on(util.format('set-status-%s', name), function(value, echo){ + + emitter.emit(echo, ['master', 'self'], update(value)); + }); + }, + + 'unregister': function unregister(name){ + + emitter.emit('del-status', ['master', 'self'], name); + + emitter.removeListener(util.format('get-status-%s', name)); + + emitter.removeListener(util.format('set-status-%s', name)); + }, + + 'getStatus': function getStatus(name){ + + return when.all(_.map(registry[name], function(r){ + + var got = when.defer(), + echo = util.format('get-status-%s-%d-%d', name, r.pid, Date.now()); + + emitter.once(echo, function(status){ + got.resolve(status); + }); + + emitter.emit(util.format('get-status-%s', name), [r.pid], echo); + + return got.promise; + })); + }, + + 'setStatue': function setStatus(name, value){ + + return when.all(_.map(registry[name], function(r){ + + var set = when.defer(), + echo = util.format('set-status-%s-%d-%d', name, r.pid, Date.now()); + + emitter.once(echo, function(status){ + set.resolve(status); + }); + + emitter.emit(util.format('set-status-%s', name), [r.pid], value, echo); + + return set.promise; + })); + } +}; + diff --git a/lib/ecv.js b/lib/ecv.js new file mode 100644 index 0000000..24d740c --- /dev/null +++ b/lib/ecv.js @@ -0,0 +1,85 @@ +'use strict'; + +//ecv is redesigned to be a simpler middleware of the monitoring app +//ecv should show a consistent view of the entire cluster +//ecv should have a root path, which is what the ops requests will be +//ecv should have 2 modes, monitor vs. controlled +//monitor mode requires a monitor url, a validator which allows ecv to issue request and let validator checks and decide if the ecv should be positive or negative +//controled mode is simply an on/off switch based on 2 more url routes (enable/disable) +var request = require('request'), + assert = require('assert'); + +exports.enable = function enable(app, options){ + + var mode = options.mode, + root = options.root, + positive = options.positive || function(req, res){ + res.send(200); + }, + negative = options.negative || function(req, res){ + res.send(500); + }; + + assert.ok(mode); + assert.ok(root); + + if('monitor' === mode){ + + var monitor = options.monitor, + validator = options.validator || function(err, res, body){ + + return res.statusCode < 300; + }; + + app.use(function(req, res, next){ + + if(req.url !== root){ + next(); + } + else{ + request.get(monitor, function(err, res, body){ + + (validator(err, res, body) ? positive : negative)(req, res); + }); + } + }); + } + else if('control' === mode){ + + var disable = options.disable, + emitter = options.emitter, + markUp = options.markUp, + markDown = options.markDown; + + emitter.on('warning', function(message){ + + if(message.command === 'disable'){ + disable = true; + } + else if(message.command === 'enable'){ + disable = false; + } + }); + + app.use(function(req, res, next){ + + if(req.url === markUp){ + + disable = false; + emitter.emit('markUp', ['master']); + } + else if(req.url === markDown){ + + disable = true; + emitter.emit('markDown', ['master']); + } + else if(req.url !== root){ + + next(); + } + else{ + (disable ? positive : negative)(req, res); + } + }); + } +}; diff --git a/lib/index.js b/lib/index.js index 54fe215..1e950c0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -47,7 +47,15 @@ var Cluster = module.exports = function Cluster(options) { }, 'markOld': null, //should be a function determine if worker is old or not 'stopTimeout': 60000,//1 min - 'debugPort': 8090 + 'debugPort': 8090, + 'ecv': { + 'root': '/ecv', + 'mode': 'control', + 'disable': true, + 'markUp': '/ecv/enable', + 'markDown': '/ecv/disable', + 'emitter': emitter + } }; _.extend(this.options, options); diff --git a/lib/master.js b/lib/master.js index 225c431..6d24b29 100644 --- a/lib/master.js +++ b/lib/master.js @@ -44,11 +44,7 @@ Master.prototype.initialize = function(proc, options){ 'CACHE_MANAGER': true }); - enable(options.monApp, { - 'control': true, - 'disabled': true - }, - options.emitter); + enable(options.monApp, options.ecv); _.each(_.range(0, _this.noWorkers), function(ith){ return _this.fork(_this.options); @@ -79,7 +75,7 @@ Master.prototype.initialize = function(proc, options){ 'slaves': { }, - 'status': require('./cluster-status.js').componentStatus + 'status': require('./cluster-status.js').status }); cluster.on('fork', function(worker){ diff --git a/lib/worker.js b/lib/worker.js index bf7484e..2b8d801 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -28,7 +28,7 @@ var Worker = exports.Worker = function(proc, options){ 'totalTransactions': new BigNumber(1),//avoid zero division 'totalDurations': new BigNumber(0), 'heartbeatInterval': options.heartbeatInterval || 3000, - 'status': require('./cluster-status.js').componentStatus + 'status': require('./cluster-status.js').status }); gc.onGC(_.bind(_this.whenGC, _this)); @@ -97,7 +97,7 @@ Worker.prototype.listen = function(){ warmUp(); _this.emitter.emit(util.format('worker-%d-warmup'), ['master']); - + return resolve; }); }; From aafac9b1e24b543d076a1cf6ffb58e94661f366f Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 3 Sep 2013 00:54:19 -0700 Subject: [PATCH 004/182] + updates --- lib/cache-mgr.js | 155 ++++++++++++++++++++++----------------------- lib/index.js | 2 +- lib/master.js | 18 +++++- lib/monitor-app.js | 16 +++++ 4 files changed, 110 insertions(+), 81 deletions(-) diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 8f48e6b..63a3fc3 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -2,8 +2,8 @@ var common = require('./cache-common.js'), _ = require('underscore'), - os = require('os'), fs = require('graceful-fs'), + os = require('os'), net = require('net'), util = require('util'); @@ -98,99 +98,98 @@ var manager = { } }; -exports.createServer = net.createServer; - -exports.app = function(conn) { //'connection' listener - - conns.push(conn); +module.exports = { - var buff = ''; + 'createServer': net.createServer, + 'app':function(conn) { //'connection' listener - conn.setEncoding('utf-8'); - conn.counter = 0; + conns.push(conn); - conn.on('data', function(data){ + var buff = ''; - buff += data; + conn.setEncoding('utf-8'); + conn.counter = 0; - var packs = buff.split('\r\n'); + conn.on('data', function(data){ - if(packs.length > 1){ - buff = packs.pop();//whatever the last element is, could be empty string, or partial data, wait till next data arrives. - - _.each(packs, function(pack){ - - conn.counter += 1; + buff += data; - var command = common.deserialize(pack), - token = command.token, - type = command.type, //['set', 'get', 'del', 'persist'] - key = command.key, //cache key - value = command.value, - persist = command.persist, - expire = command.expire, - overwrite = !command.leaveIfNonNull; // cache value + var packs = buff.split('\r\n'); - manager[type].apply(manager, [conn, token, key, value, persist, expire, overwrite]); - }); - }//otherwise keep buffering... - }); + if(packs.length > 1){ + buff = packs.pop();//whatever the last element is, could be empty string, or partial data, wait till next data arrives. + + _.each(packs, function(pack){ + + conn.counter += 1; - conn.once('end', function(){ - console.log('connection closed who has received:' + conn.counter); + var command = common.deserialize(pack), + token = command.token, + type = command.type, //['set', 'get', 'del', 'persist'] + key = command.key, //cache key + value = command.value, + persist = command.persist, + expire = command.expire, + overwrite = !command.leaveIfNonNull; // cache value - conns = _.without(conns, conn); - conn.destroy(); - }); -}; + manager[type].apply(manager, [conn, token, key, value, persist, expire, overwrite]); + }); + }//otherwise keep buffering... + }); -exports.port = domain; + conn.once('end', function(){ + console.log('connection closed who has received:' + conn.counter); -exports.afterServerStarted = function() { //'listening' listener - - console.log('cache manager started'); + conns = _.without(conns, conn); + conn.destroy(); + }); + }, + 'port': domain, + 'afterServerStarted': function() { //'listening' listener - var persistPathExists = fs.existsSync(persistPath); + console.log('cache manager started'); + + var persistPathExists = fs.existsSync(persistPath); - if(persistPathExists){ - //to get the cache from something already persisted - cache = common.deserialize(fs.readFileSync(persistPath, {'encoding':'utf-8'}) || '{}'); - } + if(persistPathExists){ + //to get the cache from something already persisted + cache = common.deserialize(fs.readFileSync(persistPath, {'encoding':'utf-8'}) || '{}'); + } - //register domain to where all other users and the master process could watch - fs.writeFileSync(domainPath, domain); - - var updateTask = function updateTask(){ - - //expiration monitoring every 10 seconds - var now = Date.now(); - _.each(expirations, function(due, key){ - if(due >= now){ - - delete cache[key]; - delete cache[key + '/lock'];//locker released too - delete persists[key];//no harm even if it's not a persisted key - delete expirations[key]; - - var notify = common.serialize({ - 'token': CHN, - 'key': key, - 'value': cache[key] - }); - _.each(conns, function(c){ - common.write(c, notify); - }); - } - }); + //register domain to where all other users and the master process could watch + fs.writeFileSync(domainPath, domain); + + var updateTask = function updateTask(){ + + //expiration monitoring every 10 seconds + var now = Date.now(); + _.each(expirations, function(due, key){ + if(due >= now){ + + delete cache[key]; + delete cache[key + '/lock'];//locker released too + delete persists[key];//no harm even if it's not a persisted key + delete expirations[key]; + + var notify = common.serialize({ + 'token': CHN, + 'key': key, + 'value': cache[key] + }); + _.each(conns, function(c){ + common.write(c, notify); + }); + } + }); - //persist every 10 seconds - fs.writeFile(persistPath, common.serialize(persists), function(){ - setTimeout(updateTask, 10000); - }); - }; + //persist every 10 seconds + fs.writeFile(persistPath, common.serialize(persists), function(){ + setTimeout(updateTask, 10000); + }); + }; - updateTask(); + updateTask(); - return manager; + return manager; + } }; - diff --git a/lib/index.js b/lib/index.js index 1e950c0..aa6258e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -36,7 +36,7 @@ var Cluster = module.exports = function Cluster(options) { this.options = { 'emitter': emitter, 'noWorkers': os.cpus().length, - 'monCreateServer': require('http').createServer, + 'monCreateServer': require('./monitor-app.js').monCreateServer, 'monApp': require('./monitor-app.js').monApp, 'monPort': 8081, 'createServer': require('http').createServer, diff --git a/lib/master.js b/lib/master.js index 6d24b29..50a3355 100644 --- a/lib/master.js +++ b/lib/master.js @@ -198,7 +198,21 @@ Master.prototype.debug = function debug(pid){ var inspectorPath = getNodeInspectorPath(); assert.ok(inspectorPath); - var inspector = execFile(inspectorPath, ['--web-port=' + _this.debugPort]); + var inspector = execFile(inspectorPath, ['--web-port=' + _this.debugPort]), + buff = ''; + + inspector.stdout.on('data', function onData(data){ + + buff += data; + //test util the inspectorUrl is matched, suggesting that the node-inspector is running + var inspectorUrl = buff.match(/.+(http:\/\/0.0.0.0:[\d]+\/debug\?port=[\d]+).+/i); + if(inspectorUrl){ + + inspector.stdout.removeListener('data', onData); + _this.emitter.emit('debug-inspector', ['master'], inspectorUrl); + } + }); + _this.emitter.once('debug-finished', function(){//u'll hear back from the debug app about this inspector.kill('SIGTERM'); @@ -244,7 +258,7 @@ Master.prototype.whenStop = function whenStop(){ threshold = Date.now() + _this.stopTimeout, gracefully = function(){ - if(_.keys(_this.slaves).length === 0){ + if(_.keys(_this.slaves).length === 0){//wait till each live slaves to be disconnected, then exit process.exit(0); } diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 3d55c9b..840783f 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -18,11 +18,27 @@ monApp.set('view engine', 'ejs'); monApp.get('/debug', function(req, res){ + //the debug flow is as the following: + //app view accepts debug request, and we call master#debug to start + //app view shows the debug as preparing till we hear 'debug-inspector' event from the master + //app view shows the inspector's url for user to go to + //if it's debugging live, the worker is still running and debug is started as well + //otherwise the debugging fresh, the worker won't start till user comes back to the app view and 'resume' the debug (after he/she puts all the breakpoints needed) + //user could continue the debug till the app view accepts 'debug-finshed' request and propagate this event to the master + res.send('debugging on its way', 200); }); //status //workers +exports.monCreatServer = function createServer(){ + + var server = require('http').createServer(arguments); + + exports.io = require('socket.io').listen(server); + + return server; +}; exports.monApp = monApp; \ No newline at end of file From 61d7db2f84738271d89f0cb64f28f67f7fa781cd Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 3 Sep 2013 15:17:45 -0700 Subject: [PATCH 005/182] + debug workers features --- lib/cache-usr.js | 37 +++++++---- lib/cluster-emitter.js | 2 +- lib/cluster-status.js | 116 ++++++++++++++++++++--------------- lib/master.js | 2 +- lib/monitor-app.js | 72 +++++++++++++++++++--- lib/public/views/index.html | 116 +++++------------------------------ lib/public/views/workers.ejs | 76 +++++++++++++++++++++++ lib/worker.js | 20 +++++- 8 files changed, 268 insertions(+), 173 deletions(-) create mode 100644 lib/public/views/workers.ejs diff --git a/lib/cache-usr.js b/lib/cache-usr.js index ab7da0f..393d744 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -112,7 +112,13 @@ var user = { var watchOthers = function(changed){ //unregister itself immediately user.unwatch(key, watchOthers); - tillGet.resolve(changed); + + if(changed !== undefined){ + tillGet.resolve(changed); + } + else{ + tillGet.reject(new Error('loader failed')); + } }; user.watch(key, watchOthers); @@ -126,20 +132,29 @@ var user = { //only one of the concurrent writers will be given the set===true if(set){ user.unwatch(key, watchOthers);//unregister immediately as i'm about to write the value - var loaded = loader(); - user.set(key, loaded, { - 'persist': options.persist, - 'expire': options.expire, - 'wait': wait - }) - .then(function(){ - tillGet.resolve(loaded); - }); + try{ + var loaded = loader(); + user.set(key, loaded, { + 'persist': options.persist, + 'expire': options.expire, + 'wait': wait + }) + .then(function(){ + tillGet.resolve(loaded); + }); + } + catch(e){ + //in case loaded fail + when.join(user.set(key + '/lock', null), user.set(key, undefined)) + .ensure(function(){ + tillGet.reject(new Error('loader failed')); + }); + } } }); } else{//got nothing - + tillGet.resolve(null); } }; diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index 6644a9b..e692391 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -69,7 +69,7 @@ var masterEmitter = { } }); - if(_.contains(targets, 'master') || _.contains(targets, 'self')){ + if(_.contains(targets, 'master') || _.contains(targets, 'self') || _.contains(targets, process.pid)){ process.emit.apply(process, arguments); } }, diff --git a/lib/cluster-status.js b/lib/cluster-status.js index a27f7a6..bf1b312 100644 --- a/lib/cluster-status.js +++ b/lib/cluster-status.js @@ -2,84 +2,100 @@ //status is to allow workers to expose their important state to master, and possibly let monitor app show them clearly in its views -var emitter = require('./cluster-emitter').emitter, - when = require('when'); +var when = require('when'), + _ = require('underscore'); -var registry = {}; +exports.status = function(emitter){ -emitter.on('new-status', function(name, pid, view, update){ + var registry = {}; - registry[name] = registry[name] || []; - registry[name].push({ - 'pid': pid - 'view': view, - 'update': update + emitter.on('new-status', function(name, pid, view, update){ + + registry[name] = registry[name] || []; + registry[name].push({ + 'pid': pid + 'view': view, + 'update': update + }); }); -}); -emitter.on('del-status', function(name){ + emitter.on('del-status', function(name){ - delete registry[name]; -}) + delete registry[name]; + }); -exports.status = { + return { - 'register': function register(name, view, update){ + 'register': function register(name, view, update){ - emitter.emit('new-status', ['master', 'self'], name, process.pid, view, udpate); + emitter.emit('new-status', ['master', 'self'], name, process.pid, view, udpate); - emitter.on(util.format('get-status-%s', name), function(echo){ + emitter.on(util.format('get-status-%s', name), function(echo){ - emitter.emit(echo, ['master', 'self'], view()); - }); + emitter.emit(echo, ['master', 'self'], view()); + }); - emitter.on(util.format('set-status-%s', name), function(value, echo){ + emitter.on(util.format('set-status-%s', name), function(value, echo){ - emitter.emit(echo, ['master', 'self'], update(value)); - }); - }, + emitter.emit(echo, ['master', 'self'], update(value)); + }); + }, + + 'unregister': function unregister(name){ + + emitter.emit('del-status', ['master', 'self'], name); - 'unregister': function unregister(name){ + emitter.removeListener(util.format('get-status-%s', name)); - emitter.emit('del-status', ['master', 'self'], name); + emitter.removeListener(util.format('set-status-%s', name)); + }, - emitter.removeListener(util.format('get-status-%s', name)); + 'statuses': function(){ - emitter.removeListener(util.format('set-status-%s', name)); - }, + return _.keys(registry); + }, - 'getStatus': function getStatus(name){ + 'getStatus': function getStatus(name){ - return when.all(_.map(registry[name], function(r){ + return when.all(_.map(registry[name], function(r){ - var got = when.defer(), - echo = util.format('get-status-%s-%d-%d', name, r.pid, Date.now()); + var got = when.defer(), + echo = util.format('get-status-%s-%d-%d', name, r.pid, Date.now()); - emitter.once(echo, function(status){ - got.resolve(status); - }); + emitter.once(echo, function(status){ + got.resolve({ + 'pid': r.pid, + 'name': name, + 'status': status + }); + }); - emitter.emit(util.format('get-status-%s', name), [r.pid], echo); + emitter.emit(util.format('get-status-%s', name), [r.pid], echo); - return got.promise; - })); - }, + return got.promise; + })); + }, - 'setStatue': function setStatus(name, value){ + 'setStatue': function setStatus(name, value){ - return when.all(_.map(registry[name], function(r){ + return when.all(_.map(registry[name], function(r){ - var set = when.defer(), - echo = util.format('set-status-%s-%d-%d', name, r.pid, Date.now()); + var set = when.defer(), + echo = util.format('set-status-%s-%d-%d', name, r.pid, Date.now()); - emitter.once(echo, function(status){ - set.resolve(status); - }); + emitter.once(echo, function(status){ + set.resolve({ + 'pid': r.pid, + 'name': name, + 'status': status + }); + }); - emitter.emit(util.format('set-status-%s', name), [r.pid], value, echo); + emitter.emit(util.format('set-status-%s', name), [r.pid], value, echo); - return set.promise; - })); - } + return set.promise; + })); + } + }; }; diff --git a/lib/master.js b/lib/master.js index 50a3355..591bab4 100644 --- a/lib/master.js +++ b/lib/master.js @@ -75,7 +75,7 @@ Master.prototype.initialize = function(proc, options){ 'slaves': { }, - 'status': require('./cluster-status.js').status + 'status': require('./cluster-status.js').status(options.emitter) }); cluster.on('fork', function(worker){ diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 840783f..fa5ef85 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -1,7 +1,8 @@ 'use strict'; var express = require('express'), - path = require('path'); + path = require('path'), + _ = require('underscore'); var monApp = express(), masterPromise = require('./master.js').master; @@ -16,7 +17,11 @@ monApp.engine('.ejs', require('ejs').__express); monApp.set('views', path.join(__dirname, './public/views')); monApp.set('view engine', 'ejs'); -monApp.get('/debug', function(req, res){ +exports.debugMiddleware = function(req, res, next){ + + if(req.url !== '/debug'){ + next(); + } //the debug flow is as the following: //app view accepts debug request, and we call master#debug to start @@ -26,12 +31,65 @@ monApp.get('/debug', function(req, res){ //otherwise the debugging fresh, the worker won't start till user comes back to the app view and 'resume' the debug (after he/she puts all the breakpoints needed) //user could continue the debug till the app view accepts 'debug-finshed' request and propagate this event to the master - res.send('debugging on its way', 200); -}); + exports.io.sockets.on('connection', function (socket) { + + socket.on('debug', function(pid){ + + masterPromise.then(function(master){ + + socket.once('debug-started', function(){ + + master.emitter.emit('debug-started', 'master'); + }); + + socket.once('debug-finshed', function(){ + + master.emitter.emit('debug-finished', 'master'); + }); + + master.emitter.once('debug-inspector', function(inspectorUrl){ + + socket.emit('debug-inspector', pid, inspectorUrl); + }); + + master.debug(pid); + }); + }); + + function workers(){ + + var payload = { + + 'workers': _.keys(master.slaves), + 'statuses': { + + } + }; + + when.all(_.map(master.status.statues(), function(status){ + return master.status.getStatus(status); + })) + .then(function(statusesOfWorkers){ + + _.each(statusesOfWorkers, function(statusOfWorkers){ + + _.each(statusOfWorkers, function(statusOfWorker){ + + payload.statuses[statusOfWorker.name] = payload.statuses[statusOfWorker.name] || {}; + payload.statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + }); + }); + + socket.emit('workers', payload); + }); + }; + + setTimeout(workers, 1000);//everyone one second + } +}; -//status +monApp.use(debugMiddleware); -//workers exports.monCreatServer = function createServer(){ var server = require('http').createServer(arguments); @@ -41,4 +99,4 @@ exports.monCreatServer = function createServer(){ return server; }; -exports.monApp = monApp; \ No newline at end of file +exports.monApp = monApp; diff --git a/lib/public/views/index.html b/lib/public/views/index.html index f47a68e..196e72a 100644 --- a/lib/public/views/index.html +++ b/lib/public/views/index.html @@ -14,113 +14,16 @@ +

Active Workers

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# - - - - - - - -
debuggingfalsefalsefalsefalse
cpu10%11%9%10%
memory1024MB896MB975MB1000MB
connections20181921
gc10,511,612,714,6
tps30282931
errors3232
+
+
-

Active Cache

@@ -152,5 +55,18 @@

Active Cache

+ + + + \ No newline at end of file diff --git a/lib/public/views/workers.ejs b/lib/public/views/workers.ejs new file mode 100644 index 0000000..50722de --- /dev/null +++ b/lib/public/views/workers.ejs @@ -0,0 +1,76 @@ + + + + + <%for(var w = 0, len = workers.length; w < len; w +=1){ + var worker = workers[w], + pid = worker.pid;%> + + <%}%> + + + + + + <%for(var w = 0, len = workers.length; w < len; w += 1){ + var worker = workers[w], + pid = worker.pid;%> + + <%}%> + + + <%for(var s = 0, len = statuses.length; s < len; s += 1){ + var status = statuses[s];%> + + + + <%for(var w = 0, len = workers.length; w < len; w += 1){ + var worker = workers[w], + pid = worker.pid;%> + + <%}%> + + <%}%> + +
# + +
debuggingfalse
status.namestatus[pid]
+ + \ No newline at end of file diff --git a/lib/worker.js b/lib/worker.js index 2b8d801..7831273 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -28,13 +28,23 @@ var Worker = exports.Worker = function(proc, options){ 'totalTransactions': new BigNumber(1),//avoid zero division 'totalDurations': new BigNumber(0), 'heartbeatInterval': options.heartbeatInterval || 3000, - 'status': require('./cluster-status.js').status + 'status': require('./cluster-status.js').status(emitter), + 'status.os': { + + } }); gc.onGC(_.bind(_this.whenGC, _this)); process.once('SIGINT', _.bind(_this.whenStop, _this)); process.once('SIGTERM', _.bind(_this.whenExit, _this)); + _this.status.register('status.os', + function(){ + return _this['status.os']; + }, + function(status){ + return _this['status.os'] = status; + }); _this.whenHeartbeat(); }; @@ -129,7 +139,7 @@ Worker.prototype.whenHeartbeat = function(){ usage.lookup(_this.pid, function(error, result){ - emitter.emit('heartbeat', ['self', 'master'], { + var heartbeat = { 'pid': process.pid, 'cpu': result.cpu, 'memory': result.memory, @@ -140,7 +150,11 @@ Worker.prototype.whenHeartbeat = function(){ 'totalTransactions': _this.totalTransactions.plus(_this.transactions), 'totalDurations': _this.totalDurations.plus(_this.durations), 'gc': _this.gc || {} - }); + }; + + emitter.emit('heartbeat', ['self', 'master'], heartbeat); + + _this.status.setStatus('status.os', heartbeat); }); setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); From 1d6c80011116c37221821ad9a63fe9ba5d2fd345 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 3 Sep 2013 21:36:05 -0700 Subject: [PATCH 006/182] + emitter bugfixes + status bugfixes + debug view --- lib/cluster-emitter.js | 12 +- lib/cluster-status.js | 8 +- lib/index.js | 2 +- lib/master.js | 305 +++++++++++---------- lib/monitor-app.js | 71 +++-- lib/public/views/{index.html => index.ejs} | 4 +- lib/public/views/workers.ejs | 35 +-- lib/utils.js | 11 +- lib/worker.js | 9 +- package.json | 1 + 10 files changed, 243 insertions(+), 215 deletions(-) rename lib/public/views/{index.html => index.ejs} (97%) diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index e692391..07e14e7 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -55,7 +55,7 @@ var masterEmitter = { targets = args.shift() || _.map(_this.workers, function(worker){return worker.process.pid;}).concat(['self']); _.each(_.filter(_this.workers, function(worker){ - _.contains(targets, worker.process.pid); + return _.contains(targets, worker.process.pid); }), function(worker){ try{ @@ -70,7 +70,9 @@ var masterEmitter = { }); if(_.contains(targets, 'master') || _.contains(targets, 'self') || _.contains(targets, process.pid)){ - process.emit.apply(process, arguments); + + args.unshift(event); + process.emit.apply(process, args); } }, @@ -102,8 +104,9 @@ var slaveEmitter = { }); } - if(_.contains(targets, 'self')){ - process.emit.apply(process, arguments); + if(_.contains(targets, 'self') || _.contains(targets, process.pid)){ + args.unshift(event); + process.emit.apply(process, args); } }, @@ -116,6 +119,7 @@ var slaveEmitter = { if(_this.handlers[event].length === 1){ process.on(event, function(){ + _.invoke(emitter.handlers[event] || [], 'apply', null, arguments); }); } diff --git a/lib/cluster-status.js b/lib/cluster-status.js index bf1b312..70654cf 100644 --- a/lib/cluster-status.js +++ b/lib/cluster-status.js @@ -3,6 +3,7 @@ //status is to allow workers to expose their important state to master, and possibly let monitor app show them clearly in its views var when = require('when'), + util = require('util'), _ = require('underscore'); exports.status = function(emitter){ @@ -13,7 +14,7 @@ exports.status = function(emitter){ registry[name] = registry[name] || []; registry[name].push({ - 'pid': pid + 'pid': pid, 'view': view, 'update': update }); @@ -28,7 +29,7 @@ exports.status = function(emitter){ 'register': function register(name, view, update){ - emitter.emit('new-status', ['master', 'self'], name, process.pid, view, udpate); + emitter.emit('new-status', ['master', 'self'], name, process.pid, view, update); emitter.on(util.format('get-status-%s', name), function(echo){ @@ -63,6 +64,7 @@ exports.status = function(emitter){ echo = util.format('get-status-%s-%d-%d', name, r.pid, Date.now()); emitter.once(echo, function(status){ + got.resolve({ 'pid': r.pid, 'name': name, @@ -76,7 +78,7 @@ exports.status = function(emitter){ })); }, - 'setStatue': function setStatus(name, value){ + 'setStatus': function setStatus(name, value){ return when.all(_.map(registry[name], function(r){ diff --git a/lib/index.js b/lib/index.js index aa6258e..2041fdc 100644 --- a/lib/index.js +++ b/lib/index.js @@ -47,7 +47,7 @@ var Cluster = module.exports = function Cluster(options) { }, 'markOld': null, //should be a function determine if worker is old or not 'stopTimeout': 60000,//1 min - 'debugPort': 8090, + 'debugPort': 8082, 'ecv': { 'root': '/ecv', 'mode': 'control', diff --git a/lib/master.js b/lib/master.js index 591bab4..d90397d 100644 --- a/lib/master.js +++ b/lib/master.js @@ -5,6 +5,7 @@ var _ = require('underscore'), assert = require('assert'), util = require('util'), execFile = require('child_process').execFile, + BigNumber = require('bignumber.js'), Worker = require('./worker.js').Worker, exitIfBusyPort = require('./utils.js').exitIfBusyPort, writePid = require('./utils.js').writePid, @@ -14,6 +15,151 @@ var _ = require('underscore'), var masterDeferred = when.defer(), masterPromise = exports.master = masterDeferred.promise; +/** + * Slave is an image of the worker at the Master's runtime, to simplify the state machine + */ +var Slave = exports.Slave = function Slave(master, worker, options, env){ + + var _this = this; + + console.log('slave built'); + + _this.cacheManager = env.CACHE_MANAGER; + _this.debug = env.debug; + _this.pid = worker.process.pid; + _this.worker = worker; + + _this.forkedState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenOnline': function(){ + + if(_this.debug){ + //we could enable debugging here + master.emitter.once('debug-started', function(){ + _this.emitter.emit('run', [_this.pid]); + }); + + master.emitter.once('debug-finished', function(){ + _this.disconnect(); + }); + + _this.debug(); + } + }, + + 'whenListening': function(){ + + _this.state = _this.activeState; + + master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); + }, + + 'whenHeartbeat': function(){ + //no interest + }, + + 'whenExit': function(){ + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + } + }; + + _this.activeState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenHeartbeat': function(heartbeat){ + //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a slave should + //enter an old state from active + + if(master.markOld(heartbeat)){ + + _this.activeState = _this.oldState; + + var successor = master.fork(options, env); + //when successor is in place, the old worker could be discontinued finally + master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + + master.emitter.emit('disconnect', ['master', worker.pid]); + }); + } + }, + + 'whenExit': function(){ + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + } + }; + + _this.oldState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenExit': function(){ + + _this.state = _this.diedState; + } + }; + + _this.diedState = { + + 'disconnect': function(){ + //already disconnected + }, + + 'whenExit': function(){ + //already exit + } + }; + + _this.state = _this.forkedState; +}; + +Slave.prototype.debug = function(){ + + this.worker.process.kill('SIGUSR1');//make it debug ready +}; + +Slave.prototype.disconnect = function(){ + + return this.state.disconnect(); +}; + +Slave.prototype.whenOnline = function(){ + + return this.state.whenOnline(); +}; + +Slave.prototype.whenListening = function(){ + + return this.state.whenListening(); +}; + +Slave.prototype.whenHeartbeat = function(heartbeat){ + + return this.state.whenHeartbeat(heartbeat); +}; + +Slave.prototype.whenExit = function(){ + + return this.state.whenExit(); +}; + var Master = exports.Master = function(proc, options){ var _this = this.initialize(proc, options); @@ -56,8 +202,8 @@ Master.prototype.initialize = function(proc, options){ 'noWorkers': options.noWorkers, 'markOld': options.markOld || function(heartbeat){ - var thisTPS = heartbeat.durations.dividedBy(heartbeat.transactions), - historicTPS = heartbeat.totalDurations.dividedBy(heartbeat.totalTransactions); + var thisTPS = heartbeat.durations / heartbeat.transactions, + historicTPS = new BigNumber(heartbeat.totalDurations, 16).dividedBy(new BigNumber(heartbeat.totalTransactions, 16)).toPrecision(32); //over 5% increase? if(thisTPS > historicTPS && (thisTPS - historicTPS) * 20 > historicTPS){ @@ -79,7 +225,8 @@ Master.prototype.initialize = function(proc, options){ }); cluster.on('fork', function(worker){ - _this.slaves[worker.process.pid] = new Slave(_this, worker, options, worker.process.env); + _this.slaves[worker.process.pid] = _this.slaves[worker.process.pid] || new Slave(_this, worker, options, worker.process.env || {}); + _this.slaves[worker.process.pid].worker = worker; }); cluster.on('online', function(worker){ @@ -243,12 +390,12 @@ Master.prototype.markUp = function markUp(){ Master.prototype.fork = function(options, env){ - return cluster.fork(env); -}; + var _this = this, + forked = cluster.fork(env); -Master.prototype.status = function status(){ + _this.slaves[forked.process.pid] = new Slave(_this, forked, options, env); - return this.status; + return forked; }; Master.prototype.whenStop = function whenStop(){ @@ -287,147 +434,3 @@ Master.prototype.whenExit = function whenExit(){ process.exit(-1);//shutdown bruteforcely }; - -/** - * Slave is an image of the worker at the Master's runtime, to simplify the state machine - */ -var Slave = exports.Slave = function(master, worker, options, env){ - - var _this = this; - - _this.cacheManager = env.CACHE_MANAGER; - _this.debug = env.debug; - _this.pid = worker.process.pid; - _this.worker = worker; - - _this.forkedState = { - - 'disconnect': function(){ - - worker.disconnect(); - }, - - 'whenOnline': function(){ - - if(_this.debug){ - //we could enable debugging here - master.emitter.once('debug-started', function(){ - _this.emitter.emit('run', [_this.pid]); - }); - - master.emitter.once('debug-finished', function(){ - _this.disconnect(); - }); - - _this.debug(); - } - }, - - 'whenListening': function(){ - - _this.state = _this.activeState; - - master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); - }, - - 'whenHeartbeat': function(){ - //no interest - }, - - 'whenExit': function(){ - - if(!worker.suicide){//accident, must be revived - master.fork(options, env); - } - } - }; - - _this.activeState = { - - 'disconnect': function(){ - - worker.disconnect(); - }, - - 'whenHeartbeat': function(heartbeat){ - //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a slave should - //enter an old state from active - - if(master.markOld(heartbeat)){ - - _this.activeState = _this.oldState; - - var successor = master.fork(options, env); - //when successor is in place, the old worker could be discontinued finally - master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ - - master.emitter.emit('disconnect', ['master', worker.pid]); - }); - } - }, - - 'whenExit': function(){ - - if(!worker.suicide){//accident, must be revived - master.fork(options, env); - } - } - }; - - _this.oldState = { - - 'disconnect': function(){ - - worker.disconnect(); - }, - - 'whenExit': function(){ - - _this.state = _this.diedState; - } - }; - - _this.diedState = { - - 'disconnect': function(){ - //already disconnected - }, - - 'whenExit': function(){ - //already exit - } - }; - - _this.state = _this.forkedState; -}; - -Slave.prototype.debug = function(){ - - this.worker.process.kill('SIGUSR1');//make it debug ready -}; - -Slave.prototype.disconnect = function(){ - - return this.state.disconnect(); -}; - -Slave.prototype.whenOnline = function(){ - - return this.state.whenOnline(); -}; - -Slave.prototype.whenListening = function(){ - - return this.state.whenListening(); -}; - -Slave.prototype.whenHeartbeat = function(heartbeat){ - - return this.state.whenHeartbeat(heartbeat); -}; - -Slave.prototype.whenExit = function(){ - - return this.state.whenExit(); -}; - diff --git a/lib/monitor-app.js b/lib/monitor-app.js index fa5ef85..eb93443 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -1,7 +1,10 @@ 'use strict'; var express = require('express'), + when = require('when'), path = require('path'), + ejs = require('ejs'), + fs = require('graceful-fs'), _ = require('underscore'); var monApp = express(), @@ -17,7 +20,7 @@ monApp.engine('.ejs', require('ejs').__express); monApp.set('views', path.join(__dirname, './public/views')); monApp.set('view engine', 'ejs'); -exports.debugMiddleware = function(req, res, next){ +var debugMiddleware = exports.debugMiddleware = function(req, res, next){ if(req.url !== '/debug'){ next(); @@ -57,46 +60,70 @@ exports.debugMiddleware = function(req, res, next){ }); function workers(){ + + masterPromise.then(function(master){ + var pids = _.keys(master.slaves), + statuses = {}; - var payload = { + var promises = _.map(master.status.statuses(), function(status){ - 'workers': _.keys(master.slaves), - 'statuses': { + return master.status.getStatus(status); + }); - } - }; + when.all(promises) + .then(function(statusesOfWorkers){ - when.all(_.map(master.status.statues(), function(status){ - return master.status.getStatus(status); - })) - .then(function(statusesOfWorkers){ + _.each(statusesOfWorkers, function(statusOfWorkers){ - _.each(statusesOfWorkers, function(statusOfWorkers){ + _.each(statusOfWorkers, function(statusOfWorker){ - _.each(statusOfWorkers, function(statusOfWorker){ + statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; + statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + }); + }); - payload.statuses[statusOfWorker.name] = payload.statuses[statusOfWorker.name] || {}; - payload.statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'statuses': _.map(statuses, function(v, k){ + v.name = k; + return v; + }) + }); + + console.log('html:' + html); + + socket.emit('workers', { + 'view': 'html', + 'html': html + }); }); }); - - socket.emit('workers', payload); }); + setTimeout(workers, 3000);//everyone 3s }; - setTimeout(workers, 1000);//everyone one second - } + workers(); + }); + + res.render('index', { + + }); }; monApp.use(debugMiddleware); -exports.monCreatServer = function createServer(){ +exports.monApp = monApp; + +exports.monCreateServer = function createServer(app){ - var server = require('http').createServer(arguments); + var server = require('http').createServer(app); exports.io = require('socket.io').listen(server); return server; }; - -exports.monApp = monApp; diff --git a/lib/public/views/index.html b/lib/public/views/index.ejs similarity index 97% rename from lib/public/views/index.html rename to lib/public/views/index.ejs index 196e72a..b52c283 100644 --- a/lib/public/views/index.html +++ b/lib/public/views/index.ejs @@ -58,8 +58,8 @@

Active Cache

+<%} +else{%> + \ No newline at end of file + console.log('debug finished'); + socket.emit('debug-finished'); + }); + +<%}%> diff --git a/lib/worker.js b/lib/worker.js index 787becf..727a380 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -35,6 +35,7 @@ var Worker = exports.Worker = function(proc, options){ }); gc.onGC(_.bind(_this.whenGC, _this)); + process.once('disconnect', _.bind(_this.whenStop, _this)); process.once('SIGINT', _.bind(_this.whenStop, _this)); process.once('SIGTERM', _.bind(_this.whenExit, _this)); @@ -152,7 +153,7 @@ Worker.prototype.whenHeartbeat = function(){ _this.status.setStatus('status.os', heartbeat); }); - setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); + _this.heartbeatTimer = setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); }; Worker.prototype.whenGC = function(info){ @@ -166,6 +167,7 @@ Worker.prototype.whenGC = function(info){ Worker.prototype.whenStop = function(){ + clearTimeout(this.heartbeatTimer); }; Worker.prototype.whenExit = function(){ diff --git a/package.json b/package.json index 57f12e9..bd7b160 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "express": "~3.1.0", "socket.io": "~0.9.16", "usage": "~0.3.8", - "node-inspector": "~0.3.0", + "node-inspector": "~0.2.0beta4", "graceful-fs": "~2.0.0", "nodefly-gcinfo": "~0.0.15", "ejs": "~0.8.4", From c915fc50b9a8aff7616a90dc7a113fbad50dd634 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 4 Sep 2013 01:14:14 -0700 Subject: [PATCH 008/182] + status bugfix, indeed an emitter's issue, must replicate the workers' handlers whenever a new worker is given --- lib/cluster-emitter.js | 13 +++++++++++++ lib/public/views/workers.ejs | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index 6fe552e..7a97210 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -8,6 +8,7 @@ var cluster = require('cluster'), var masterEmitter = { get workers(){ + return cluster.workers; }, @@ -22,6 +23,7 @@ var masterEmitter = { _this.handlers[event].push(handler); _.each(_this.workers, function(worker){ + if(!worker.clusterEventHandler){ worker.clusterEventHandler = function(message){ _.invoke(_this.handlers[message.type] || [], 'apply', null, message.params); @@ -148,6 +150,17 @@ var slaveEmitter = { if(cluster.isMaster){ exports.emitter = masterEmitter; + + cluster.on('fork', function(worker){ + + if(!worker.clusterEventHandler){ + worker.clusterEventHandler = function(message){ + _.invoke(masterEmitter.handlers[message.type] || [], 'apply', null, message.params); + }; + + worker.on('message', worker.clusterEventHandler); + } + }); } else{ diff --git a/lib/public/views/workers.ejs b/lib/public/views/workers.ejs index ffb9b4c..80e9b85 100644 --- a/lib/public/views/workers.ejs +++ b/lib/public/views/workers.ejs @@ -74,12 +74,12 @@ else{%> var socket = socket || io.connect('http://localhost'); $('#debug-start-<%=debugging%>').click(function(){ + socket.emit('debug-start'); }); $('#debug-stop-<%=debugging%>').click(function(){ - console.log('debug finished'); socket.emit('debug-finished'); }); From fa34e32182baad7e7fa20ce3525d7a6e19fcce25 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 4 Sep 2013 01:48:12 -0700 Subject: [PATCH 009/182] + worker gracefully exit whenStop + bugfix of monitor app, as a process turns to debug, it fails to getStatus --- lib/monitor-app.js | 99 +++++++++++++++++++++++++++++----------------- lib/worker.js | 14 +++++++ 2 files changed, 76 insertions(+), 37 deletions(-) diff --git a/lib/monitor-app.js b/lib/monitor-app.js index a88df70..8c96c5c 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -39,6 +39,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ var debugging = undefined, inspector = null, state = null, + statuses = {}, debug = function debug(pid){ debugging = pid; @@ -75,52 +76,76 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ socket.once('debug', debug); function workers(){ - + masterPromise.then(function(master){ - var pids = _.keys(master.slaves), - statuses = {}; - - var promises = _.map(master.status.statuses(), function(status){ + var pids = _.keys(master.slaves); - return master.status.getStatus(status); - }); + if(!debugging){ + var promises = _.map(master.status.statuses(), function(status){ + return master.status.getStatus(status); + }); - when.all(promises) - .then(function(statusesOfWorkers){ + when.all(promises) + .then(function(statusesOfWorkers){ - _.each(statusesOfWorkers, function(statusOfWorkers){ + _.each(statusesOfWorkers, function(statusOfWorkers){ - _.each(statusOfWorkers, function(statusOfWorker){ + _.each(statusOfWorkers, function(statusOfWorker){ - statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; - statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; + statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + }); }); - }); - fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'pids': pids, - 'debugging': debugging, - 'inspector': inspector, - 'state': state, - 'statuses': _.map(statuses, function(v, k){ - v.name = k; - return v; - }) - }); - - socket.emit('workers', { - 'view': 'html', - 'html': html - }); + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': _.map(statuses, function(v, k){ + v.name = k; + return v; + }) + }); + + console.log('html:' + html); + socket.emit('workers', { + 'view': 'html', + 'html': html + }); + }); }); - }); - }); - setTimeout(workers, 3000);//everyone 3s + } + else{ + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': _.map(statuses, function(v, k){ + v.name = k; + return v; + }) + }); + + socket.emit('workers', { + 'view': 'html', + 'html': html + }); + }); + } + }); + setTimeout(workers, 5000);//everyone 5s }; workers(); diff --git a/lib/worker.js b/lib/worker.js index 727a380..f3616d4 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -168,6 +168,20 @@ Worker.prototype.whenGC = function(info){ Worker.prototype.whenStop = function(){ clearTimeout(this.heartbeatTimer); + + function gracefully(){ + + if(_this.liveConnections > 0){ + + setTimeout(gracefully, 1000); + } + else{ + + process.exit(0); + } + } + + gracefully(); }; Worker.prototype.whenExit = function(){ From d75fc74993cab8610665c7bb04a1a31650ad2c59 Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 4 Sep 2013 09:43:09 -0700 Subject: [PATCH 010/182] Create README.md --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..08835ba --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +cubejs-cluster2 +=============== + +This is a completely overhaul, not expected to be backward compatible, but the features should cover the most popular while some changes are on their way: + +# simplification + +You'll see that we've simplified the api a great deal, the listen method takes no arguments at all, and all dancing parts could be injected through the construation. +That's based on the adoption of Promise A+ (when.js). +You'll also find redundant features like: multiple app/port support, ecv on workers removed, to keep code clean. + +# debug + +Ever imagined debugging to be simpler? Here's the good news, we've carefully designed the debugging process from the ground up of the new cluster. +With integration with ECV, worker lifecycle management, node-inspector, and bootstrap + websocket debug app (middleware to be exact). You're now +able to debug any running worker a few clicks away, same applies for a newly forked one. + +# robustness + +This is sth we learned given the real experience of a node.js application, workers do get slower, whether that's memory leak, or GC becomes worse, it's easier to prepare +than to avoid. So as a step forward from the previous 'death watch', we're now proactively collecting performance statistics and to decide it a worker could be ended +before it gets slow. From 0a2ebe0e9a19ac01bdb6ab8b9b023dae69997f7f Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 4 Sep 2013 09:50:41 -0700 Subject: [PATCH 011/182] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 08835ba..e06ac7c 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,10 @@ able to debug any running worker a few clicks away, same applies for a newly for This is sth we learned given the real experience of a node.js application, workers do get slower, whether that's memory leak, or GC becomes worse, it's easier to prepare than to avoid. So as a step forward from the previous 'death watch', we're now proactively collecting performance statistics and to decide it a worker could be ended before it gets slow. + +# caching + +This is as exciting as debugging, it allows workers to share computation results, watch over others, in a fast and reliable manner. +We tried work delegation to master once, and found it error-prone and difficult to code against, caching makes things so much simpler, using domain socket, so much faster. +The atomic getOrLoad syntax makes sharing efficient, running cache manager as another worker and persistence support make it disaster recoverable. +It's like having a memcached process, only this is node, and you can debug it too. From 1ca47c6813424a643d07ef7e95317ef0f26a3664 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 4 Sep 2013 13:12:42 -0700 Subject: [PATCH 012/182] + status bugfix when a worker disconnects --- lib/cluster-status.js | 33 ++++++++++++---- lib/master.js | 46 ++++++++++++--------- lib/monitor-app.js | 90 ++++++++++++++++-------------------------- lib/worker.js | 14 +++++-- test/lib/cache-test.js | 3 -- 5 files changed, 97 insertions(+), 89 deletions(-) diff --git a/lib/cluster-status.js b/lib/cluster-status.js index 70654cf..186d44c 100644 --- a/lib/cluster-status.js +++ b/lib/cluster-status.js @@ -3,6 +3,8 @@ //status is to allow workers to expose their important state to master, and possibly let monitor app show them clearly in its views var when = require('when'), + timeout = require('when/timeout'), + cluster = require('cluster'), util = require('util'), _ = require('underscore'); @@ -20,9 +22,26 @@ exports.status = function(emitter){ }); }); - emitter.on('del-status', function(name){ + emitter.on('del-status', function(name, pid){ - delete registry[name]; + registry[name] = _.filter(registry[name], function(r){ + return r.pid !== pid; + }); + }); + + cluster.on('disconnect', function(worker){ + + var pid = worker.process.pid; + + _.each(registry, function(arr, name){ + + registry[name] = _.filter(arr, function(r){ + + return r.pid !== pid; + }); + }); + + console.log('status auto updated after worker:' + JSON.stringify(registry)); }); return { @@ -44,7 +63,7 @@ exports.status = function(emitter){ 'unregister': function unregister(name){ - emitter.emit('del-status', ['master', 'self'], name); + emitter.emit('del-status', ['master', 'self'], name, process.pid); emitter.removeListener(util.format('get-status-%s', name)); @@ -56,7 +75,7 @@ exports.status = function(emitter){ return _.keys(registry); }, - 'getStatus': function getStatus(name){ + 'getStatus': function getStatus(name, wait){ return when.all(_.map(registry[name], function(r){ @@ -74,11 +93,11 @@ exports.status = function(emitter){ emitter.emit(util.format('get-status-%s', name), [r.pid], echo); - return got.promise; + return timeout(got.promise, wait || 1000); })); }, - 'setStatus': function setStatus(name, value){ + 'setStatus': function setStatus(name, value, wait){ return when.all(_.map(registry[name], function(r){ @@ -95,7 +114,7 @@ exports.status = function(emitter){ emitter.emit(util.format('set-status-%s', name), [r.pid], value, echo); - return set.promise; + return timeout(set.promise, wait || 1000); })); } }; diff --git a/lib/master.js b/lib/master.js index 5e03216..36d77cd 100644 --- a/lib/master.js +++ b/lib/master.js @@ -74,6 +74,7 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ 'disconnect': function(){ worker.disconnect(); + worker.suicide = true; }, 'whenHeartbeat': function(heartbeat){ @@ -98,6 +99,8 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ if(!worker.suicide){//accident, must be revived master.fork(options, env); } + //already exit, clean up + delete master.slaves[_this.pid]; } }; @@ -111,6 +114,9 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ 'whenExit': function(){ _this.state = _this.diedState; + + //already exit, clean up + delete master.slaves[_this.pid]; } }; @@ -121,7 +127,8 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ }, 'whenExit': function(){ - //already exit + //already exit, clean up + delete master.slaves[_this.pid]; } }; @@ -151,7 +158,7 @@ Slave.prototype.debug = function(){ // } // }); - this.worker.kill('SIGUSR1');//make it debug ready + this.worker.process.kill('SIGUSR1');//make it debug ready console.log('siguser1:' + this.worker.process.pid); @@ -265,6 +272,7 @@ Master.prototype.initialize = function(proc, options){ }); cluster.on('exit', function(worker){ + console.log('master detects exit of worker:' + worker.process.pid); _this.slaves[worker.process.pid].whenExit(); }); @@ -341,7 +349,9 @@ Master.prototype.listen = function(){ Master.prototype.debug = function debug(pid){ var _this = this, - slavesCount = 0; + noWorkers = _this.noWorkers; + + pid = pid && _.isString(pid) ? parseInt(pid, 10) : null; if(!_this.debugging){ _this.debugging = true; @@ -350,13 +360,13 @@ Master.prototype.debug = function debug(pid){ _this.markDown(); //debug fresh - _.each(_.filter(_this.slaves, function(slave){ - return !slave.cacheManager && pid !== slave.pid; - }), - function(slave){ - slavesCount += 1; + _.each(_this.slaves, function(slave){ + + if(!slave.cacheManager && pid !== slave.pid){ + console.log(util.format('debug fresh, disconnecting:%j vs pid:%j', slave.pid, pid)); slave.disconnect(); - }); + } + }); //send signal to the slave var pending = when.defer(), @@ -368,6 +378,7 @@ Master.prototype.debug = function debug(pid){ pending.resolve(true); } else{ + console.log('debugging:' + pid); var debugging = _this.slaves[pid]; ready = debugging.debug(); @@ -397,19 +408,18 @@ Master.prototype.debug = function debug(pid){ _this.emitter.emit('debug-inspector', ['master'], inspectorUrl[1]); } }); - }); - _this.emitter.once('debug-finished', function(){//u'll hear back from the debug app about this + _this.emitter.once('debug-finished', function(){//u'll hear back from the debug app about this - inspector.kill('SIGTERM'); + inspector.kill('SIGTERM'); + //restore the workers + _.each(_.range(0, noWorkers), function(ith){ + _this.fork(_this.options, {}); + }); - //restore the workers - _.each(_.range(0, slavesCount), function(ith){ - _this.fork(_this.options); + //mark up ecv now + _this.markUp(); }); - - //mark up ecv now - _this.markUp(); }); }; diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 8c96c5c..bee0a93 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -77,73 +77,49 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ function workers(){ - masterPromise.then(function(master){ - var pids = _.keys(master.slaves); + console.log('updates'); - if(!debugging){ - var promises = _.map(master.status.statuses(), function(status){ + masterPromise.then(function(master){ + var pids = _.keys(master.slaves), + promises = _.map(master.status.statuses(), function(status){ return master.status.getStatus(status); }); - when.all(promises) - .then(function(statusesOfWorkers){ + when.all(promises) + .then(function(statusesOfWorkers){ - _.each(statusesOfWorkers, function(statusOfWorkers){ + _.each(statusesOfWorkers, function(statusOfWorkers){ - _.each(statusOfWorkers, function(statusOfWorker){ + _.each(statusOfWorkers, function(statusOfWorker){ - statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; - statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; - }); + statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; + statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; }); + }); - fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'pids': pids, - 'debugging': debugging, - 'inspector': inspector, - 'state': state, - 'statuses': _.map(statuses, function(v, k){ - v.name = k; - return v; - }) - }); - - console.log('html:' + html); - socket.emit('workers', { - 'view': 'html', - 'html': html - }); - }); + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': _.map(statuses, function(v, k){ + v.name = k; + return v; + }) + }); + + //console.log('html:' + html); + socket.emit('workers', { + 'view': 'html', + 'html': html + }); }); - } - else{ - fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'pids': pids, - 'debugging': debugging, - 'inspector': inspector, - 'state': state, - 'statuses': _.map(statuses, function(v, k){ - v.name = k; - return v; - }) - }); - - socket.emit('workers', { - 'view': 'html', - 'html': html - }); - }); - } + }); }); setTimeout(workers, 5000);//everyone 5s }; diff --git a/lib/worker.js b/lib/worker.js index f3616d4..730bc6b 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -35,8 +35,8 @@ var Worker = exports.Worker = function(proc, options){ }); gc.onGC(_.bind(_this.whenGC, _this)); - process.once('disconnect', _.bind(_this.whenStop, _this)); - process.once('SIGINT', _.bind(_this.whenStop, _this)); + process.once('disconnect', _.bind(_this.whenStop, _this, 'disconnect')); + process.once('SIGINT', _.bind(_this.whenStop, _this, 'sigint')); process.once('SIGTERM', _.bind(_this.whenExit, _this)); _this.status.register('status.os', @@ -167,16 +167,22 @@ Worker.prototype.whenGC = function(info){ Worker.prototype.whenStop = function(){ - clearTimeout(this.heartbeatTimer); + var _this = this; + + console.log('stop:' + JSON.stringify(arguments)); + + clearTimeout(_this.heartbeatTimer); function gracefully(){ if(_this.liveConnections > 0){ - setTimeout(gracefully, 1000); + console.log('gracefully pending on liveConnections:' + _this.liveConnections); + setTimeout(gracefully, 500); } else{ + console.log('gracefully shutdown:' + process.pid); process.exit(0); } } diff --git a/test/lib/cache-test.js b/test/lib/cache-test.js index b5d0099..e555b5d 100644 --- a/test/lib/cache-test.js +++ b/test/lib/cache-test.js @@ -8,11 +8,8 @@ var counter = 0; promiseOfUsr.then(function(usr){ - //usr.makeCopy(); - for(var i = 0; i < 10000; i += 1){ - usr.get('k2', function(){ return 'v2'; }) From 92f8284f92e520c5a6ac45b0605d28c1c88087a1 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 4 Sep 2013 23:08:13 -0700 Subject: [PATCH 013/182] + bugfix of duplicate master 'debug-finished' + caching enhancement, supports 'keys'/'all', supports persist/expire queries in 'get' --- lib/cache-common.js | 3 +- lib/cache-mgr.js | 29 ++++++++++++++--- lib/cache-usr.js | 69 ++++++++++++++++++++++++++++++---------- lib/master.js | 19 ++++++----- test/lib/cluster-test.js | 9 ++++-- 5 files changed, 97 insertions(+), 32 deletions(-) diff --git a/lib/cache-common.js b/lib/cache-common.js index 4456ee9..84d340f 100644 --- a/lib/cache-common.js +++ b/lib/cache-common.js @@ -50,7 +50,8 @@ module.exports = { 'types': { 'GET' : 'get', 'SET' : 'set', - 'DEL' : 'del' + 'DEL' : 'del', + 'ALL' : 'all' }, 'serialize': function serialize(object){ diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 63a3fc3..7867d60 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -12,6 +12,7 @@ var success = common.status.success, GET = common.types.GET, SET = common.types.SET, DEL = common.types.DEL, + ALL = common.types.ALL, CHN = common.changeToken, domain = os.type().toLowerCase().indexOf('windows') >= 0 ? 8888 : '/tmp/cache.socket.' + process.pid, domainPath = common.domainPath, @@ -25,6 +26,16 @@ var manager = { 'domain': domain, + 'all': function(conn, token){ + + common.write(conn, common.serialize({ + 'type': ALL, + 'token': token, + 'keys': _.keys(cache), + 'status': write ? success: failure + })); + }, + 'set': function(conn, token, key, value, persist, expire, overwrite){ var old = cache[key], @@ -59,15 +70,24 @@ var manager = { } }, - 'get': function(conn, token, key){ + 'get': function(conn, token, key, value, persist, expire){ - common.write(conn, common.serialize({ + var result = { 'type': GET, 'token': token, 'key': key, - 'value': cache[key], + 'value': cache[key] || value,//default 'status': success - })); + }; + + if(persist){ + result.persist = persists[key]; + } + if(expire){ + result.expire = expirations[key]; + } + + common.write(conn, common.serialize(result)); }, 'del': function(conn, token, key){ @@ -132,6 +152,7 @@ module.exports = { expire = command.expire, overwrite = !command.leaveIfNonNull; // cache value + //console.log(JSON.stringify(command)); manager[type].apply(manager, [conn, token, key, value, persist, expire, overwrite]); }); }//otherwise keep buffering... diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 393d744..ae1f39d 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -10,6 +10,7 @@ var _ = require('underscore'), var success = common.status.success, failure = common.status.failure, + ALL = common.types.ALL, GET = common.types.GET, SET = common.types.SET, DEL = common.types.DEL, @@ -59,16 +60,12 @@ var success = common.status.success, token = response.token, key = response.key, value = response.value, - status = response.status; + status = response.status, + persist = response.persist, + expire = response.expire; if(token !== CHN){ - if(!handlers[token]){ - console.log('pid:' +process.pid + '?token:' + token + ';key:' + key); - process.exit(-1); - } - else{ - handlers[token].apply(user, [status, key, value]); - } + handlers[token].apply(user, [status, key, value, persist, expire]); } else{ _.each(changes[key], function(whenChange){ @@ -90,6 +87,37 @@ var user = { 'copy': null, + 'keys': function(options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillKeys = when.defer(), + handler = function(status, keys){ + + if(success === status){ + + tillKeys.resolve(keys || []); + } + else{ + + tillKeys.reject(new Error('failed to get keys')); + } + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': ALL, + 'token': token + })); + + return (wait > 0 ? timeout(wait, tillKeys.promise) : tillKeys.promise).ensure(function(){ + delete handlers[token]; + }); + }, + 'get': function(key, loader, options){ options = options || {}; @@ -97,15 +125,15 @@ var user = { var token = nextToken(), wait = options.wait, tillGet = when.defer(), - handler = function(status, key, value){ + handler = function(status, key, value, persist, expire){ - if(success === status && value){//got the value + if(success === status && value !== undefined){//got the value if(user.copy){//copy the value fetched from master cache, this is needed for consistency restore, unmakeCopy then makeCopy etc. user.copy[key] = value; } - tillGet.resolve(value); + tillGet.resolve(value, persist, expire); } else if(loader){//must atomically load the value @@ -140,6 +168,7 @@ var user = { 'wait': wait }) .then(function(){ + tillGet.resolve(loaded); }); } @@ -154,13 +183,12 @@ var user = { }); } else{//got nothing - + tillGet.resolve(null); } }; if(user.copy && user.copy[key] !== undefined){ - console.log('copy hit'); //local copy hit tillGet.resolve(user.copy[key]); } @@ -171,7 +199,9 @@ var user = { common.write(conn, common.serialize({ 'type': GET, 'token': token, - 'key': key + 'key': key, + 'persist': options.persist, + 'expire': options.expire })); } @@ -350,10 +380,15 @@ var tillExists = function(path){ exports.user = function(domain){ - tillExists(common.domainPath); + if(!global.userDeferred){//each process needs at most one cache user + + tillExists(common.domainPath); - user.switchDomain(domain || fs.readFileSync(common.domainPath, {'encoding':'utf-8'})); + user.switchDomain(domain || fs.readFileSync(common.domainPath, {'encoding':'utf-8'})); + + global.userDeferred = userDeferred; + } - return userDeferred.promise; + return global.userDeferred.promise; }; diff --git a/lib/master.js b/lib/master.js index 36d77cd..5df1935 100644 --- a/lib/master.js +++ b/lib/master.js @@ -384,7 +384,6 @@ Master.prototype.debug = function debug(pid){ _this.emitter.once('debug-finished', function(){ - _this.debugging = false; debugging.disconnect(); }); } @@ -411,14 +410,18 @@ Master.prototype.debug = function debug(pid){ _this.emitter.once('debug-finished', function(){//u'll hear back from the debug app about this - inspector.kill('SIGTERM'); - //restore the workers - _.each(_.range(0, noWorkers), function(ith){ - _this.fork(_this.options, {}); - }); + if(_this.debugging === true){ + _this.debugging = false; + + inspector.kill('SIGTERM'); + //restore the workers + _.each(_.range(0, noWorkers), function(ith){ + _this.fork(_this.options, {}); + }); - //mark up ecv now - _this.markUp(); + //mark up ecv now + _this.markUp(); + } }); }); }; diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index ab34b15..ca23ee8 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -8,11 +8,16 @@ var Cluster = require('../../lib/index.js'), app.get('/', function(req, res){ require('../../lib/cache-usr.js').user() - .then(function(user){ + .then(function(usr){ console.log('cache user started'); - res.send(util.format('hello from:%d', process.pid), 200); + usr.get('key', function(){ + return 'value'; + }) + .then(function(value){ + res.send(util.format('hello from:%d whose cached value is:%j', process.pid, value), 200); + }); }); }); From a46b8bde046fb84602f3d71ad7dc117f1735873a Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 5 Sep 2013 00:42:22 -0700 Subject: [PATCH 014/182] cache api detailed --- README.md | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e06ac7c..ff54832 100644 --- a/README.md +++ b/README.md @@ -3,27 +3,128 @@ cubejs-cluster2 This is a completely overhaul, not expected to be backward compatible, but the features should cover the most popular while some changes are on their way: -# simplification +## simplification You'll see that we've simplified the api a great deal, the listen method takes no arguments at all, and all dancing parts could be injected through the construation. That's based on the adoption of Promise A+ (when.js). You'll also find redundant features like: multiple app/port support, ecv on workers removed, to keep code clean. -# debug +## debug Ever imagined debugging to be simpler? Here's the good news, we've carefully designed the debugging process from the ground up of the new cluster. With integration with ECV, worker lifecycle management, node-inspector, and bootstrap + websocket debug app (middleware to be exact). You're now able to debug any running worker a few clicks away, same applies for a newly forked one. -# robustness +## robustness This is sth we learned given the real experience of a node.js application, workers do get slower, whether that's memory leak, or GC becomes worse, it's easier to prepare than to avoid. So as a step forward from the previous 'death watch', we're now proactively collecting performance statistics and to decide it a worker could be ended before it gets slow. -# caching +## caching This is as exciting as debugging, it allows workers to share computation results, watch over others, in a fast and reliable manner. We tried work delegation to master once, and found it error-prone and difficult to code against, caching makes things so much simpler, using domain socket, so much faster. The atomic getOrLoad syntax makes sharing efficient, running cache manager as another worker and persistence support make it disaster recoverable. It's like having a memcached process, only this is node, and you can debug it too. + +* **`user`** + +```javascript +require('cluster/cache-user').user().then(function(usr){ +//the usr is the major api cluster application could then interact with +//the usr is the same accross the entire worker process +}); +``` +* **`keys`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.keys({ + 'wait': 100//this is a timeout option +}) +.then(function(keys){ +//the keys resolved is an array of all cached keys from the cache-manager's view +}); +``` +* **`get`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.get('cache-key-1', function(){ + return 'cache-value-loaded-1'; + }, + { + 'persist': false,//default false, otherwise the loaded value will be persisted, if not loaded, the persistence info will be returned + 'expire': 10000,//default null, otherwise it means in how many ms the key/value should be expired if not loaded. + 'wait': 100//this is a timeout option + }) + .then(function(value){ + //the value resolved is anything already cached or the value newly loaded + //note, the loader will be called once and once only, if it failed, the promise of get will be rejected. + }); +``` +* **`set`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.set('cache-key-1', 'cache-value-loaded-1', { + 'persist': false, + 'expire': 10000, + 'leaveIfNotNull': false,//default false, which allows set to overwrite existing values, use true for the atomic getAndLoad + 'wait': 100 +}) +.then(function(happens){ +//the happens resolved is a true/false value indicating if the value has been accepted by the cache manager +}); +``` +* **`del`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.del('cache-key-1', { + 'wait': 100//this is a timeout option +}) +.then(function(value){ +//the old value deleted +}); +``` +* **`watch`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.watch('cache-key-1', function watching(value){ + //this is a callback which will be called anytime the associatd key has an updated value +}); +``` +* **`unwatch`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.unwatch('cache-key-1', watching);//stop watching + +``` +* **`makeCopy`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.makeCopy(); +//this forces the user to keep copy of cache manager whenever a value is loaded, it also watches any change and update the copy automatically +//this option is to make the cache more reliable but could cause consistency problem when the cache manager dies +``` +* **`unmakeCopy`** + +```javascript +var usr;//assume the usr has been assigned as above + +usr.unmakeCopy(); +//the opposite as makeCopy, and the default behavior, no copy is kept locally, all queries go to cache manager +//which maximizes the consistency, but availability will be hurt when the cache manager is in the middle over recovery +``` From 94e5b7af8030d17fb7f3ace7e740b22aacfc3c04 Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 5 Sep 2013 00:46:22 -0700 Subject: [PATCH 015/182] Update README.md --- README.md | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ff54832..a1eea98 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ usr.keys({ 'wait': 100//this is a timeout option }) .then(function(keys){ -//the keys resolved is an array of all cached keys from the cache-manager's view +//the keys resolved is an array of all cached keys:string[] from the cache-manager's view }); ``` * **`get`** @@ -53,7 +53,8 @@ usr.keys({ ```javascript var usr;//assume the usr has been assigned as above -usr.get('cache-key-1', function(){ +usr.get('cache-key-1', //key must be string + function(){ return 'cache-value-loaded-1'; }, { @@ -61,7 +62,7 @@ usr.get('cache-key-1', function(){ 'expire': 10000,//default null, otherwise it means in how many ms the key/value should be expired if not loaded. 'wait': 100//this is a timeout option }) - .then(function(value){ + .then(function(value, persist, expire){ //the value resolved is anything already cached or the value newly loaded //note, the loader will be called once and once only, if it failed, the promise of get will be rejected. }); @@ -71,36 +72,40 @@ usr.get('cache-key-1', function(){ ```javascript var usr;//assume the usr has been assigned as above -usr.set('cache-key-1', 'cache-value-loaded-1', { - 'persist': false, - 'expire': 10000, - 'leaveIfNotNull': false,//default false, which allows set to overwrite existing values, use true for the atomic getAndLoad - 'wait': 100 -}) -.then(function(happens){ -//the happens resolved is a true/false value indicating if the value has been accepted by the cache manager -}); +usr.set('cache-key-1', //key must be string + 'cache-value-loaded-1', //value could be any json object + { + 'persist': false, + 'expire': 10000, + 'leaveIfNotNull': false,//default false, which allows set to overwrite existing values, use true for the atomic getAndLoad + 'wait': 100 + }) + .then(function(happens){ + //the happens resolved is a true/false value indicating if the value has been accepted by the cache manager + }); ``` * **`del`** ```javascript var usr;//assume the usr has been assigned as above -usr.del('cache-key-1', { - 'wait': 100//this is a timeout option -}) -.then(function(value){ -//the old value deleted -}); +usr.del('cache-key-1', //key must be string + { + 'wait': 100//this is a timeout option + }) + .then(function(value){ + //the old value deleted + }); ``` * **`watch`** ```javascript var usr;//assume the usr has been assigned as above -usr.watch('cache-key-1', function watching(value){ - //this is a callback which will be called anytime the associatd key has an updated value -}); +usr.watch('cache-key-1', //key must be string + function watching(value){ + //this is a callback which will be called anytime the associatd key has an updated value + }); ``` * **`unwatch`** From da2eafed0f62157646a7daed8a9bd7c19121f8e8 Mon Sep 17 00:00:00 2001 From: huzhou Date: Thu, 5 Sep 2013 15:37:41 -0700 Subject: [PATCH 016/182] + caches monitor view supported --- lib/cache-common.js | 3 +- lib/cache-mgr.js | 29 +++++--- lib/cache-usr.js | 129 +++++++++++++++++++++++++----------- lib/monitor-app.js | 58 +++++++++++++++- lib/public/views/caches.ejs | 45 +++++++++++++ lib/public/views/index.ejs | 34 +++------- test/lib/cluster-test.js | 30 +++++++-- 7 files changed, 243 insertions(+), 85 deletions(-) create mode 100644 lib/public/views/caches.ejs diff --git a/lib/cache-common.js b/lib/cache-common.js index 84d340f..fc40248 100644 --- a/lib/cache-common.js +++ b/lib/cache-common.js @@ -51,7 +51,8 @@ module.exports = { 'GET' : 'get', 'SET' : 'set', 'DEL' : 'del', - 'ALL' : 'all' + 'ALL' : 'all', + 'INSPECT' : 'ins' }, 'serialize': function serialize(object){ diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 7867d60..769c39a 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -13,6 +13,7 @@ var success = common.status.success, SET = common.types.SET, DEL = common.types.DEL, ALL = common.types.ALL, + INSPECT = common.types.INSPECT, CHN = common.changeToken, domain = os.type().toLowerCase().indexOf('windows') >= 0 ? 8888 : '/tmp/cache.socket.' + process.pid, domainPath = common.domainPath, @@ -32,7 +33,7 @@ var manager = { 'type': ALL, 'token': token, 'keys': _.keys(cache), - 'status': write ? success: failure + 'status': success })); }, @@ -80,12 +81,20 @@ var manager = { 'status': success }; - if(persist){ - result.persist = persists[key]; - } - if(expire){ - result.expire = expirations[key]; - } + common.write(conn, common.serialize(result)); + }, + + 'ins': function(conn, token, key){ + + var result = { + 'type': INSPECT, + 'token': token, + 'key': key, + 'value': cache[key], + 'persist': persists[key], + 'expire': Date.now() - expirations[key], + 'status': success + }; common.write(conn, common.serialize(result)); }, @@ -129,6 +138,7 @@ module.exports = { conn.setEncoding('utf-8'); conn.counter = 0; + conn.setKeepAlive(true); conn.on('data', function(data){ @@ -158,8 +168,9 @@ module.exports = { }//otherwise keep buffering... }); - conn.once('end', function(){ - console.log('connection closed who has received:' + conn.counter); + conn.once('close', function(){ + + console.log('connection closed who has received:' + conn.counter); conns = _.without(conns, conn); conn.destroy(); diff --git a/lib/cache-usr.js b/lib/cache-usr.js index ae1f39d..577ca10 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -14,6 +14,7 @@ var success = common.status.success, GET = common.types.GET, SET = common.types.SET, DEL = common.types.DEL, + INSPECT = common.types.INSPECT, CHN = common.changeToken, nextToken = common.nextToken, domain = null, @@ -24,20 +25,17 @@ var success = common.status.success, changes = { }, - anyChange = function(){ - - }, + anyChanges = [], conn = null, - reconnect = function reconnect(){ + reconnect = function reconnect(error){ var options = _.isString(domain) ? {'path': domain} : domain, connecting = net.connect(options, function(){ - console.log(options); connecting.writable = true; conn = connecting; if(!userDeferred.hasBeenResolved){ - userDeferred.resolve(user); + userDeferred.resolve(process.user = user); userDeferred.hasBeenResolved = true; } }), @@ -59,31 +57,34 @@ var success = common.status.success, var response = common.deserialize(pack), token = response.token, key = response.key, + keys = response.keys, value = response.value, status = response.status, persist = response.persist, expire = response.expire; if(token !== CHN){ - handlers[token].apply(user, [status, key, value, persist, expire]); + handlers[token].apply(user, [status, key || keys, value, persist, expire]); } else{ + //console.log(util.format('process:%d detected change:%s = %j', process.pid, key, value)); _.each(changes[key], function(whenChange){ whenChange(value); }); - anyChange(key, value); + //console.log('calling all anyChanges'); + _.invoke(anyChanges, 'call', null, key, value); } }); } }); - connecting.once('error', function(){ + connecting.once('close', function(error){ connecting.writable = false; - reconnect(); + reconnect(error); }); }; -var user = { +var user = process.user || { 'copy': null, @@ -125,7 +126,7 @@ var user = { var token = nextToken(), wait = options.wait, tillGet = when.defer(), - handler = function(status, key, value, persist, expire){ + handler = function(status, key, value){ if(success === status && value !== undefined){//got the value @@ -133,7 +134,7 @@ var user = { user.copy[key] = value; } - tillGet.resolve(value, persist, expire); + tillGet.resolve(value); } else if(loader){//must atomically load the value @@ -151,8 +152,6 @@ var user = { user.watch(key, watchOthers); user.set(key + '/lock', process.pid, { - 'persist': options.persist, - 'expire': options.expire, 'wait': wait, 'leaveIfNonNull': true }) @@ -161,15 +160,22 @@ var user = { if(set){ user.unwatch(key, watchOthers);//unregister immediately as i'm about to write the value try{ - var loaded = loader(); - user.set(key, loaded, { - 'persist': options.persist, - 'expire': options.expire, - 'wait': wait - }) - .then(function(){ - - tillGet.resolve(loaded); + //promise or value + when(loader(), function(value){ + //success value loaded + user.set(key, value, { + 'persist': options.persist, + 'expire': options.expire, + 'wait': wait + }) + .then(function(){ + + tillGet.resolve(value); + }); + }, + //error handling + function(error){ + tillGet.reject(error); }); } catch(e){ @@ -199,17 +205,48 @@ var user = { common.write(conn, common.serialize({ 'type': GET, 'token': token, - 'key': key, - 'persist': options.persist, - 'expire': options.expire + 'key': key })); } return (wait > 0 ? timeout(wait, tillGet.promise) : tillGet.promise).ensure(function(){ delete handlers[token]; }); + }, + + 'inspect': function(key, options){ + + console.log('[inspect]'); + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillInspect = when.defer(), + handler = function(status, key, value, persist, expire){ + + console.log('accepting inspect:' + key + '; value:' + value + '; persist:' + persist + '; expire' + expire); + + if(success === status && value !== undefined){ + + tillInspect.resolve([value, persist, expire]); + } + else{ + tillInspect.reject(new Error('no value found for key')); + } + }; + + //local copy miss, fetch from master cache + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': INSPECT, + 'token': token, + 'key': key + })); - //return tillGet.promise; + return (wait > 0 ? timeout(wait, tillInspect.promise) : tillInspect.promise).ensure(function(){ + delete handlers[token]; + }); }, /** @@ -305,14 +342,24 @@ var user = { 'watch': function(key, callback){ - changes[key] = changes[key] || []; - changes[key].push(callback); + if(!key){ + anyChanges.push(callback); + } + else{ + changes[key] = changes[key] || []; + changes[key].push(callback); + } }, 'unwatch': function(key, callback){ - changes[key] = changes[key] || []; - changes[key] = _.without(changes[key], callback); + if(!key){ + anyChanges = _.without(anyChanges, callback); + } + else{ + changes[key] = changes[key] || []; + changes[key] = _.without(changes[key], callback); + } }, 'makeCopy': function(){ @@ -322,7 +369,7 @@ var user = { } user.copy = {}; - anyChange = function(key, value){ + user.any = function any(key, value){ //console.log('changed'); if(value !== null){ user.copy[key] = value; @@ -331,14 +378,16 @@ var user = { delete user.copy[key]; } }; + anyChanges.push(user.any); }, 'unmakeCopy': function(){ - user.copy = null; - anyChange = function(){ + if(user.copy !== null){ - }; + user.copy = null; + anyChanges = _.without(anyChanges, user.any); + } }, 'switchDomain': function(d){//only in case of cache-mgr down and needs to switch to a new one @@ -380,15 +429,17 @@ var tillExists = function(path){ exports.user = function(domain){ - if(!global.userDeferred){//each process needs at most one cache user + if(!process.userPromise){//each process needs at most one cache user + + console.log('user created'); tillExists(common.domainPath); user.switchDomain(domain || fs.readFileSync(common.domainPath, {'encoding':'utf-8'})); - global.userDeferred = userDeferred; + process.userPromise = userDeferred.promise; } - return global.userDeferred.promise; + return process.userPromise; }; diff --git a/lib/monitor-app.js b/lib/monitor-app.js index bee0a93..dcbc08a 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -77,8 +77,6 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ function workers(){ - console.log('updates'); - masterPromise.then(function(master){ var pids = _.keys(master.slaves), promises = _.map(master.status.statuses(), function(status){ @@ -121,10 +119,64 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ }); }); }); - setTimeout(workers, 5000);//everyone 5s + setTimeout(workers, 6000);//everyone 6s }; workers(); + + function caches(){ + + masterPromise.then(function(){ + + require('./cache-usr.js').user().then(function(usr){ + + usr.watch(null, function(key, value){ + + console.log('watch raised:' + key); + usr.inspect(key).then(function(status){ + + socket.emit('cache-changed', key, status[0], status[1], status[2]); + }); + }); + + usr.keys().then(function(keys){ + + when.map(keys, function(k){ + + return usr.inspect(k); + }) + .then(function(values){ + + console.log(JSON.stringify(values)); + + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'caches': _.map(keys, function(k, i){ + return { + 'key': k, + 'value': values[i][0], + 'persist': values[i][1], + 'expire': values[i][2] + }; + }) + }); + + socket.emit('caches', { + 'view': 'html', + 'html': html + }); + }); + }); + }); + }); + }); + } + + caches(); }); res.render('index', { diff --git a/lib/public/views/caches.ejs b/lib/public/views/caches.ejs new file mode 100644 index 0000000..5659a86 --- /dev/null +++ b/lib/public/views/caches.ejs @@ -0,0 +1,45 @@ + + + + + + + + + + + <%for(var k = 0, len = caches.length; k < len; k += 1){ + var entry = caches[k];%> + + + + + + + <%}%> + +
#valuepersistedexpire
<%=entry.key%><%=JSON.stringify(entry.value)%><%=entry.persist ? true : false%><%=entry.expire ? entry.expire + 'ms' : ''%>
+ \ No newline at end of file diff --git a/lib/public/views/index.ejs b/lib/public/views/index.ejs index b52c283..60353c3 100644 --- a/lib/public/views/index.ejs +++ b/lib/public/views/index.ejs @@ -14,7 +14,6 @@ -

Active Workers

@@ -28,31 +27,8 @@

Active Cache

-
- - - - - - - - - - - - - - - - - - - - - - - -
#valuepersistedexpire
key1value1truenull
key2value2false60000ms
+
+
@@ -66,6 +42,12 @@ $('#workers-table').html(data.html); } }); + + socket.once('caches', function(data) { + if(data.view === 'html'){ + $('#caches-table').html(data.html); + } + }); diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index ca23ee8..4b64948 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -10,14 +10,30 @@ app.get('/', function(req, res){ require('../../lib/cache-usr.js').user() .then(function(usr){ - console.log('cache user started'); + console.log('user resolved'); + + var key = req.query.key, + val = req.query.value; - usr.get('key', function(){ - return 'value'; - }) - .then(function(value){ - res.send(util.format('hello from:%d whose cached value is:%j', process.pid, value), 200); - }); + if(!key){ + usr.get('key', function(){ + return 'value'; + }, + { + 'persist': true, + 'expire': null + }) + .then(function(value){ + res.send(util.format('hello from:%d whose cached value is:%j', process.pid, value), 200); + }); + } + else{ + console.log('user set:' + key + '=' + val); + usr.set(key, val) + .then(function(){ + res.send(util.format('user set:%s to value:%j', key, val), 200); + }); + } }); }); From ee93427cb01baa81bff2b2076290f106e1af2dee Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 6 Sep 2013 10:57:49 -0700 Subject: [PATCH 017/182] bugfixes --- lib/cache-usr.js | 2 ++ lib/public/views/caches.ejs | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 577ca10..65ddbc9 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -80,6 +80,8 @@ var success = common.status.success, connecting.once('close', function(error){ connecting.writable = false; + connecting.destroy(); + reconnect(error); }); }; diff --git a/lib/public/views/caches.ejs b/lib/public/views/caches.ejs index 5659a86..58f2320 100644 --- a/lib/public/views/caches.ejs +++ b/lib/public/views/caches.ejs @@ -27,11 +27,10 @@ var row = $('#' + key); if(row.length){ - row.html('' + - '' + key + '' + + row.html('' + key + '' + '' + JSON.stringify(value) + '' + - '' + persist ? true : false + '' + - '' + (expire ? expire + 'ms' : '') + ''); + '' + (persist ? true : false) + '' + + '' + (expire ? expire + 'ms' : '') + ''); } else{ $('#caches_body').append('' + From 7d7955bdc618fd0564de127cc35d983d9793ce46 Mon Sep 17 00:00:00 2001 From: huz Date: Tue, 10 Sep 2013 23:00:42 -0700 Subject: [PATCH 018/182] + adding simple logger support + fix monPort occupation check --- lib/cluster-emitter.js | 16 +++++++++++----- lib/ecv.js | 12 ++++++------ lib/index.js | 2 ++ lib/master.js | 24 ++++++++++++------------ lib/utils.js | 16 +++++++++++++++- lib/worker.js | 5 ++--- package.json | 6 ++++-- test/lib/cluster-test.js | 3 ++- 8 files changed, 54 insertions(+), 30 deletions(-) diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index 7a97210..5c5f133 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -7,13 +7,16 @@ var cluster = require('cluster'), var masterEmitter = { + /** + * return active workers + */ get workers(){ return cluster.workers; }, 'handlers': { - + //a map of event handlers }, 'on': function(event, handler){ @@ -24,7 +27,7 @@ var masterEmitter = { _.each(_this.workers, function(worker){ - if(!worker.clusterEventHandler){ + if(!worker.clusterEventHandler){//this is the 1st time a handler is registered, must register it for all workers worker.clusterEventHandler = function(message){ _.invoke(_this.handlers[message.type] || [], 'apply', null, message.params); }; @@ -33,7 +36,7 @@ var masterEmitter = { } }); - if(_this.handlers[event].length === 1){ + if(_this.handlers[event].length === 1){//this is the 1st time a handler is registered, must register it for master process process.on(event, function(){ _.invoke(_this.handlers[event] || [], 'apply', null, arguments); }); @@ -47,6 +50,7 @@ var masterEmitter = { handler.apply(null, arguments); _this.removeListener(event, handleOnce); }; + _this.on(event, handleOnce); }, @@ -54,6 +58,7 @@ var masterEmitter = { var _this = this, args = _.toArray(arguments), event = args.shift(), + //the default target is all active workers and the master itself as 'self' targets = args.shift() || _.map(_this.workers, function(worker){return worker.process.pid;}).concat(['self']); _.each(_.filter(_this.workers, function(worker){ @@ -149,13 +154,14 @@ var slaveEmitter = { if(cluster.isMaster){ - exports.emitter = masterEmitter; + var emitter = exports.emitter = masterEmitter; + //any newly forked worker must get a replication of the known event handlers cluster.on('fork', function(worker){ if(!worker.clusterEventHandler){ worker.clusterEventHandler = function(message){ - _.invoke(masterEmitter.handlers[message.type] || [], 'apply', null, message.params); + _.invoke(emitter.handlers[message.type] || [], 'apply', null, message.params); }; worker.on('message', worker.clusterEventHandler); diff --git a/lib/ecv.js b/lib/ecv.js index 24d740c..36a0c06 100644 --- a/lib/ecv.js +++ b/lib/ecv.js @@ -46,7 +46,7 @@ exports.enable = function enable(app, options){ } else if('control' === mode){ - var disable = options.disable, + var disabled = options.disabled, emitter = options.emitter, markUp = options.markUp, markDown = options.markDown; @@ -54,10 +54,10 @@ exports.enable = function enable(app, options){ emitter.on('warning', function(message){ if(message.command === 'disable'){ - disable = true; + disabled = true; } else if(message.command === 'enable'){ - disable = false; + disabled = false; } }); @@ -65,12 +65,12 @@ exports.enable = function enable(app, options){ if(req.url === markUp){ - disable = false; + disabled = false; emitter.emit('markUp', ['master']); } else if(req.url === markDown){ - disable = true; + disabled = true; emitter.emit('markDown', ['master']); } else if(req.url !== root){ @@ -78,7 +78,7 @@ exports.enable = function enable(app, options){ next(); } else{ - (disable ? positive : negative)(req, res); + (disabled ? positive : negative)(req, res); } }); } diff --git a/lib/index.js b/lib/index.js index 2041fdc..53bb166 100644 --- a/lib/index.js +++ b/lib/index.js @@ -18,6 +18,7 @@ var Master = require('./master.js').Master, readMasterPid = require('./utils.js').readMasterPid, + getLogger = require('./utils.js').getLogger, when = require('when'), assert = require('assert'), os = require('os'), @@ -36,6 +37,7 @@ var Cluster = module.exports = function Cluster(options) { this.options = { 'emitter': emitter, 'noWorkers': os.cpus().length, + 'logger': getLogger(), 'monCreateServer': require('./monitor-app.js').monCreateServer, 'monApp': require('./monitor-app.js').monApp, 'monPort': 8081, diff --git a/lib/master.js b/lib/master.js index 5df1935..6db0ebe 100644 --- a/lib/master.js +++ b/lib/master.js @@ -160,9 +160,10 @@ Slave.prototype.debug = function(){ this.worker.process.kill('SIGUSR1');//make it debug ready - console.log('siguser1:' + this.worker.process.pid); + _this.logger.debug('[debug] master sent signal SIGUSR1 to %d', this.worker.process.pid); setTimeout(function(){ + debugDeferred.resolve(true); }, 5000);//wait for 5s @@ -215,6 +216,7 @@ Master.prototype.initialize = function(proc, options){ 'pid': proc.pid, 'process': proc, 'emitter': options.emitter, + 'logger': options.logger, 'createServer': options.monCreateServer, 'app': options.monApp, 'port': options.monPort, @@ -272,7 +274,7 @@ Master.prototype.initialize = function(proc, options){ }); cluster.on('exit', function(worker){ - console.log('master detects exit of worker:' + worker.process.pid); + _this.logger.info('master detects exit of worker:' + worker.process.pid); _this.slaves[worker.process.pid].whenExit(); }); @@ -288,7 +290,7 @@ Master.prototype.initialize = function(proc, options){ assert.ok(_this.port); exitIfBusyPort('localhost', _this.port); - exitIfBusyPort('localhost', _this.options.port); + exitIfBusyPort('localhost', _this.monPort); return _this; } @@ -329,6 +331,7 @@ Master.prototype.listen = function(){ var deferred = when.defer(), server = createServer(monApp).listen(monPort, function(){ + deferred.resolve({ 'server': server, 'app': monApp, @@ -363,7 +366,7 @@ Master.prototype.debug = function debug(pid){ _.each(_this.slaves, function(slave){ if(!slave.cacheManager && pid !== slave.pid){ - console.log(util.format('debug fresh, disconnecting:%j vs pid:%j', slave.pid, pid)); + _this.logger.info('debug fresh, disconnecting:%j vs pid:%j', slave.pid, pid); slave.disconnect(); } }); @@ -378,7 +381,6 @@ Master.prototype.debug = function debug(pid){ pending.resolve(true); } else{ - console.log('debugging:' + pid); var debugging = _this.slaves[pid]; ready = debugging.debug(); @@ -403,7 +405,7 @@ Master.prototype.debug = function debug(pid){ if(inspectorUrl){ inspector.stdout.removeListener('data', onData); - console.log('master#inspector:' + inspectorUrl[1]); + _this.logger.debug('[debug] master got inspector url:%s', inspectorUrl[1]); _this.emitter.emit('debug-inspector', ['master'], inspectorUrl[1]); } }); @@ -428,20 +430,18 @@ Master.prototype.debug = function debug(pid){ Master.prototype.markDown = function markDown(){ //mark down ecv - /*console.log('down'); + _this.logger.info('[ecv] master marking down'); _this.emitter.emit('warning', ['self'], { 'command': 'disable' - });*/ - console.log('down!'); + }); }; Master.prototype.markUp = function markUp(){ //mark up ecv - /*console.log('up'); + _this.logger.info('[ecv] master marking up'); _this.emitter.emit('warning', ['self'], { 'command': 'enable' - });*/ - console.log('up!'); + }); }; Master.prototype.fork = function(options, env){ diff --git a/lib/utils.js b/lib/utils.js index 6376ab5..9dd493c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -2,6 +2,7 @@ var net = require('net'), when = require('when'), timeout = require('when/timeout'), cluster = require('cluster'), + winston = require('winston'), fs = require('graceful-fs'), path = require('path'), util = require('util'); @@ -13,7 +14,7 @@ exports.exitIfBusyPort = function exitIfBusyPort(host, port) { server.once('error', function (e) { if(e.code === 'EADDRINUSE') { - console.error('Port is use ..' + port); + console.trace('Port is use ..' + port); deferred.resolved(true) } }); @@ -108,3 +109,16 @@ exports.getNodeInspectorPath = function getNodeInspectorPath(){ return find(here); }; +exports.getLogger = function getLogger(){ + return new (winston.Logger)({ + 'transports': [ + new (winston.transports.Console)()/*, + new (winston.transports.File)({ + 'filename': path.join('./log', process.pid + '.log'), + 'maxsize': 4 * 1024 * 1024,//4mb + 'maxFiles': 4//4 files max, 16mb for each process + })*/ + ] + }); +}; + diff --git a/lib/worker.js b/lib/worker.js index 730bc6b..abdecc4 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -14,6 +14,7 @@ var Worker = exports.Worker = function(proc, options){ _.extend(_this, { 'pid': proc.pid, 'process': proc, + 'logger': options.logger, 'options': options, 'createServer': options.createServer, 'app': options.app, @@ -169,15 +170,13 @@ Worker.prototype.whenStop = function(){ var _this = this; - console.log('stop:' + JSON.stringify(arguments)); - clearTimeout(_this.heartbeatTimer); function gracefully(){ if(_this.liveConnections > 0){ - console.log('gracefully pending on liveConnections:' + _this.liveConnections); + console.log('gracefully shutdown pending on liveConnections:' + _this.liveConnections); setTimeout(gracefully, 500); } else{ diff --git a/package.json b/package.json index bd7b160..c329edd 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,11 @@ "dependencies": { "underscore": "~1.4.4", "when": "~2.3.0", + "winston": "~0.7.2", "express": "~3.1.0", "socket.io": "~0.9.16", "usage": "~0.3.8", - "node-inspector": "~0.2.0beta4", + "node-inspector": "~0.2.0-beta4", "graceful-fs": "~2.0.0", "nodefly-gcinfo": "~0.0.15", "ejs": "~0.8.4", @@ -29,7 +30,8 @@ "should": "~1.2.2" }, "scripts": { - "test": "nodeunit test" + "prestart": "rm -rf ./log; mkdir log", + "start": "node ./test/lib/cluster-test.js" }, "optionalDependencies": {} } diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index 4b64948..32f81d0 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -41,6 +41,7 @@ new Cluster({ 'noWorkers': 1, 'createServer': require('http').createServer, 'app': app, - 'port': 8080 + 'port': 8080, + 'monPort': 8082 }) .listen(); \ No newline at end of file From ccf482ca2cf5f0a52ab381980d69367ffce490ce Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 11 Sep 2013 00:25:02 -0700 Subject: [PATCH 019/182] + heuristic design --- lib/master.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/master.js b/lib/master.js index 6db0ebe..4da0b83 100644 --- a/lib/master.js +++ b/lib/master.js @@ -238,6 +238,16 @@ Master.prototype.initialize = function(proc, options){ 'noWorkers': options.noWorkers, 'markOld': options.markOld || function(heartbeat){ + //TODO markOld heuristic + //when a worker has exceeds certain threshold of TPS we start sampling and identify when TPS could reach its plateau + //for each heartbeat, if the TPS goes up, whether CPU/memory/GC goes up/down, we take it as progress to its plateau + //once a plateau is identified, we will compare the upcoming TPS, CPU, memory, GC to determine if it's an old age + //that is when the TPS drop over a given percentage, say 10%, along with CPU, memory, GC growth, that's when we mark + //this worker as old, as its performance degrades possibly related to GC + //the 2nd step could be more conservative, using 2 consecutive occurances of the scenario as the criteria instead of 1. + //this is the current state of the heuristic, should work for most of the cases, and will be interesting to see how generalized it is. + //besides, even if markOld succeeded, we should not immediately start a successor and kill the original, that task must be + //queued to make sure no more than one old worker gets collected at the same time var thisTPS = heartbeat.durations / heartbeat.transactions, historicTPS = new BigNumber(heartbeat.totalDurations, 16).dividedBy(new BigNumber(heartbeat.totalTransactions, 16)).toPrecision(32); From 70731ccc9c6138ed0c0665673ee1c954b226ca8d Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 11 Sep 2013 11:00:46 -0700 Subject: [PATCH 020/182] + updated .gitignore --- .gitignore | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 844abe8..952ac26 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,8 @@ -*.iml -.DS_Store -.idea *.log -temp node_modules pids -reports -target docs logs +log +cluster-cache-domain +cluster-cache-persist From 0154951bffd631e4fbecccef56f509dad1a55380 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 11 Sep 2013 15:49:48 -0700 Subject: [PATCH 021/182] + refactorings + logger enhancement + ecv integrated + debug flow improvement --- lib/cache-common.js | 4 ++- lib/cache-mgr.js | 29 +++++++++++++++---- lib/cache-usr.js | 40 +++++++++++++++----------- lib/cluster-emitter.js | 5 ++-- lib/cluster-status.js | 8 +++++- lib/ecv.js | 23 +++++++++++---- lib/index.js | 12 +++++--- lib/master.js | 62 +++++++++++++++++++++------------------- lib/monitor-app.js | 14 +++++---- lib/utils.js | 22 ++++++++------ lib/worker.js | 13 +++++++-- test/lib/cluster-test.js | 5 ++-- 12 files changed, 152 insertions(+), 85 deletions(-) diff --git a/lib/cache-common.js b/lib/cache-common.js index fc40248..17a296e 100644 --- a/lib/cache-common.js +++ b/lib/cache-common.js @@ -52,7 +52,9 @@ module.exports = { 'SET' : 'set', 'DEL' : 'del', 'ALL' : 'all', - 'INSPECT' : 'ins' + 'INSPECT' : 'ins', + 'PING': 'ping', + 'PONG': 'pong' }, 'serialize': function serialize(object){ diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 769c39a..2c42257 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -14,6 +14,8 @@ var success = common.status.success, DEL = common.types.DEL, ALL = common.types.ALL, INSPECT = common.types.INSPECT, + PING = common.types.PING, + PONG = common.types.PONG, CHN = common.changeToken, domain = os.type().toLowerCase().indexOf('windows') >= 0 ? 8888 : '/tmp/cache.socket.' + process.pid, domainPath = common.domainPath, @@ -21,7 +23,8 @@ var success = common.status.success, cache = {}, expirations = {}, persists = {}, - conns = []; + conns = [], + logger = process.getLogger(__filename); var manager = { @@ -124,6 +127,18 @@ var manager = { _.each(conns, function(c){ common.write(c, notify); }); + }, + + 'ping': function(conn, token){ + + common.write(conn, common.serialize({ + 'type': PING, + 'token': PONG + })); + }, + + 'pong': function(conn, token){ + //nothing } }; @@ -138,7 +153,6 @@ module.exports = { conn.setEncoding('utf-8'); conn.counter = 0; - conn.setKeepAlive(true); conn.on('data', function(data){ @@ -162,24 +176,29 @@ module.exports = { expire = command.expire, overwrite = !command.leaveIfNonNull; // cache value - //console.log(JSON.stringify(command)); manager[type].apply(manager, [conn, token, key, value, persist, expire, overwrite]); }); }//otherwise keep buffering... }); + var keepAlive = setInterval(function(){ + + manager.ping(conn, PONG); + }, 1000);//ping/pong every second + conn.once('close', function(){ - console.log('connection closed who has received:' + conn.counter); + logger.info('connection closed who has received:%d', conn.counter); conns = _.without(conns, conn); conn.destroy(); + clearInterval(keepAlive); }); }, 'port': domain, 'afterServerStarted': function() { //'listening' listener - console.log('cache manager started'); + logger.info('cache manager started'); var persistPathExists = fs.existsSync(persistPath); diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 65ddbc9..3889abe 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -15,8 +15,10 @@ var success = common.status.success, SET = common.types.SET, DEL = common.types.DEL, INSPECT = common.types.INSPECT, + PONG = common.types.PONG, CHN = common.changeToken, nextToken = common.nextToken, + logger = process.getLogger(__filename), domain = null, userDeferred = when.defer(), handlers = { @@ -63,21 +65,30 @@ var success = common.status.success, persist = response.persist, expire = response.expire; - if(token !== CHN){ - handlers[token].apply(user, [status, key || keys, value, persist, expire]); - } - else{ - //console.log(util.format('process:%d detected change:%s = %j', process.pid, key, value)); + if(token === CHN){ _.each(changes[key], function(whenChange){ whenChange(value); }); - //console.log('calling all anyChanges'); + _.invoke(anyChanges, 'call', null, key, value); } + else if(token === PONG){ + common.write(connecting, common.serialize({ + 'type': PONG, + 'token': PONG + })); + } + else{ + handlers[token].apply(user, [status, key || keys, value, persist, expire]); + } }); } }); + connecting.once('end', function(){ + logger.info('ended by cache server'); + }); + connecting.once('close', function(error){ connecting.writable = false; connecting.destroy(); @@ -218,7 +229,6 @@ var user = process.user || { 'inspect': function(key, options){ - console.log('[inspect]'); options = options || {}; var token = nextToken(), @@ -226,8 +236,6 @@ var user = process.user || { tillInspect = when.defer(), handler = function(status, key, value, persist, expire){ - console.log('accepting inspect:' + key + '; value:' + value + '; persist:' + persist + '; expire' + expire); - if(success === status && value !== undefined){ tillInspect.resolve([value, persist, expire]); @@ -282,8 +290,6 @@ var user = process.user || { } }; - //console.log('expecting token:' + token); - handlers[token] = handler; common.write(conn, common.serialize({ @@ -299,8 +305,6 @@ var user = process.user || { return (wait > 0 ? timeout(wait, tillSet.promise) : tillSet.promise).ensure(function(){ delete handlers[token]; }); - - //return tillSet.promise; }, /** @@ -372,7 +376,7 @@ var user = process.user || { user.copy = {}; user.any = function any(key, value){ - //console.log('changed'); + if(value !== null){ user.copy[key] = value; } @@ -403,6 +407,10 @@ var user = process.user || { } reconnect(); } + }, + + 'pong': function(){ + } }; @@ -416,7 +424,7 @@ var tillExists = function(path){ 'encoding': 'utf-8' }, function(err, d){ - console.log('switching domain:' + d); + logger.info('switching domain:%s', d); user.switchDomain(d); }); }); @@ -433,7 +441,7 @@ exports.user = function(domain){ if(!process.userPromise){//each process needs at most one cache user - console.log('user created'); + logger.info('cache user created'); tillExists(common.domainPath); diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index 5c5f133..7bed4e1 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -5,7 +5,8 @@ var cluster = require('cluster'), _ = require('underscore'); -var masterEmitter = { +var logger = process.getLogger(__filename), + masterEmitter = { /** * return active workers @@ -72,7 +73,7 @@ var masterEmitter = { }); } catch(error){ - console.log('[cluster2] master sending to worker failed'); + logger.warn('[cluster2] master sending to worker failed'); } }); diff --git a/lib/cluster-status.js b/lib/cluster-status.js index 186d44c..bedc639 100644 --- a/lib/cluster-status.js +++ b/lib/cluster-status.js @@ -8,6 +8,8 @@ var when = require('when'), util = require('util'), _ = require('underscore'); +var logger = process.getLogger(__filename); + exports.status = function(emitter){ var registry = {}; @@ -20,6 +22,8 @@ exports.status = function(emitter){ 'view': view, 'update': update }); + + logger.info('register status: %s from %d, in process: %d', name, pid, process.pid); }); emitter.on('del-status', function(name, pid){ @@ -27,6 +31,8 @@ exports.status = function(emitter){ registry[name] = _.filter(registry[name], function(r){ return r.pid !== pid; }); + + logger.info('unregister status: %s in process: %d', name, pid); }); cluster.on('disconnect', function(worker){ @@ -41,7 +47,7 @@ exports.status = function(emitter){ }); }); - console.log('status auto updated after worker:' + JSON.stringify(registry)); + logger.debug('status auto updated after worker:%j', registry); }); return { diff --git a/lib/ecv.js b/lib/ecv.js index 36a0c06..c3f8942 100644 --- a/lib/ecv.js +++ b/lib/ecv.js @@ -9,6 +9,8 @@ var request = require('request'), assert = require('assert'); +var logger = process.getLogger(__filename); + exports.enable = function enable(app, options){ var mode = options.mode, @@ -23,6 +25,8 @@ exports.enable = function enable(app, options){ assert.ok(mode); assert.ok(root); + logger.info('ecv enabled in the mode:%s', mode); + if('monitor' === mode){ var monitor = options.monitor, @@ -54,30 +58,37 @@ exports.enable = function enable(app, options){ emitter.on('warning', function(message){ if(message.command === 'disable'){ + disabled = true; + logger.info('ecv disabled'); } else if(message.command === 'enable'){ + disabled = false; + logger.info('ecv enabled'); } }); app.use(function(req, res, next){ - if(req.url === markUp){ - - disabled = false; - emitter.emit('markUp', ['master']); - } - else if(req.url === markDown){ + if(req.url === markDown){ disabled = true; emitter.emit('markDown', ['master']); + logger.info('ecv disabled'); + } + else if(req.url === markUp){ + + disabled = false; + emitter.emit('markUp', ['master']); + logger.info('ecv enabled'); } else if(req.url !== root){ next(); } else{ + //just to tell if ecv is on/off (disabled ? positive : negative)(req, res); } }); diff --git a/lib/index.js b/lib/index.js index 53bb166..7394206 100644 --- a/lib/index.js +++ b/lib/index.js @@ -16,8 +16,7 @@ 'use strict'; -var Master = require('./master.js').Master, - readMasterPid = require('./utils.js').readMasterPid, +var readMasterPid = require('./utils.js').readMasterPid, getLogger = require('./utils.js').getLogger, when = require('when'), assert = require('assert'), @@ -32,12 +31,13 @@ process.on('uncaughtException', function (error) { var Cluster = module.exports = function Cluster(options) { + process.getLogger = options.getLogger || getLogger; + assert.ok(process.getLogger); + var emitter = require('./cluster-emitter.js').emitter; - this.options = { 'emitter': emitter, 'noWorkers': os.cpus().length, - 'logger': getLogger(), 'monCreateServer': require('./monitor-app.js').monCreateServer, 'monApp': require('./monitor-app.js').monApp, 'monPort': 8081, @@ -69,6 +69,8 @@ var Cluster = module.exports = function Cluster(options) { assert.ok(this.options.app); assert.ok(this.options.port); assert.notEqual(this.options.port, this.options.monPort, "monitor port & application port cannot use the same!"); + assert.notEqual(this.options.port, this.options.debugPort, "debug port & application port cannot use the same!"); + assert.notEqual(this.options.monPort, this.options.debugPort, "monitor port & debug port cannot use the same!"); _.extend(this, { 'on': _.bind(emitter.on, emitter), @@ -86,6 +88,8 @@ var Cluster = module.exports = function Cluster(options) { */ Cluster.prototype.listen = function() { + var Master = require('./master.js').Master; + return new Master(process, this.options).listen(); }; diff --git a/lib/master.js b/lib/master.js index 4da0b83..1a21a3f 100644 --- a/lib/master.js +++ b/lib/master.js @@ -22,10 +22,14 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ var _this = this; - _this.cacheManager = env.CACHE_MANAGER; - _this.debugging = env.debug; - _this.pid = worker.process.pid; - _this.worker = worker; + _.extend(_this, { + 'logger': master.logger, + 'emitter': master.emitter, + 'cacheManager': env.CACHE_MANAGER, + 'debugging': env.debug, + 'worker': worker, + 'pid': worker.process.pid + }); _this.forkedState = { @@ -138,34 +142,20 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ Slave.prototype.debug = function(){ //debugger listening on port 5858 - var buff = '', + var _this = this, + buff = '', + pid = _this.pid, + worker = _this.worker, debugDeferred = when.defer(); - // console.log('debug slave:' + this.worker.stdout); - - // this.worker.stdout.on('data', function onData(data){ - - // buff += data.replace(/[\r\n]+/g, ''); - - // console.log(buff); - // if(buff.match(/.+debugger listening on port 5858.*/)){ - - // console.log('ready on 5858'); - // this.worker.stdout.removeListener('data', onData); + _this.emitter.once('debug-port-listening', function(){ - // console.log('promise resolved on 5858'); - // debugDeferred.resolve(true); - // } - // }); - - this.worker.process.kill('SIGUSR1');//make it debug ready - - _this.logger.debug('[debug] master sent signal SIGUSR1 to %d', this.worker.process.pid); - - setTimeout(function(){ + _this.logger.info('[debug] slave: %d received debug-port-listening', pid); + debugDeferred.resolve(pid); + }); - debugDeferred.resolve(true); - }, 5000);//wait for 5s + worker.process.kill('SIGUSR1');//make it debug ready + _this.logger.debug('[debug] master sent signal SIGUSR1 to %d', pid); return debugDeferred.promise; }; @@ -209,14 +199,14 @@ Master.prototype.initialize = function(proc, options){ var _this = this; writePid(process.pid); - + if(cluster.isMaster) { _.extend(_this, { 'pid': proc.pid, 'process': proc, 'emitter': options.emitter, - 'logger': options.logger, + 'logger': process.getLogger(__filename), 'createServer': options.monCreateServer, 'app': options.monApp, 'port': options.monPort, @@ -366,9 +356,14 @@ Master.prototype.debug = function debug(pid){ pid = pid && _.isString(pid) ? parseInt(pid, 10) : null; + _this.logger.info('[debug] master debugging %d, currently busy: %s', pid, _this.debugging); + if(!_this.debugging){ _this.debugging = true; } + else{ + return;//cannot debug more than one worker + } _this.markDown(); @@ -392,6 +387,7 @@ Master.prototype.debug = function debug(pid){ } else{ var debugging = _this.slaves[pid]; + _this.logger.info('[debug] going to debug live:%d status:%s', pid, debugging !== null); ready = debugging.debug(); _this.emitter.once('debug-finished', function(){ @@ -404,6 +400,8 @@ Master.prototype.debug = function debug(pid){ assert.ok(inspectorPath); ready.then(function(){//must wait for the signal to be sent, and child process ready to accept connection on 5858 + + _this.logger.info('[debug] starting node-inspector at:%s', inspectorPath); var inspector = execFile(inspectorPath, ['--web-port=' + _this.debugPort]), buff = ''; @@ -439,6 +437,8 @@ Master.prototype.debug = function debug(pid){ }; Master.prototype.markDown = function markDown(){ + + var _this = this; //mark down ecv _this.logger.info('[ecv] master marking down'); _this.emitter.emit('warning', ['self'], { @@ -447,6 +447,8 @@ Master.prototype.markDown = function markDown(){ }; Master.prototype.markUp = function markUp(){ + + var _this = this; //mark up ecv _this.logger.info('[ecv] master marking up'); _this.emitter.emit('warning', ['self'], { diff --git a/lib/monitor-app.js b/lib/monitor-app.js index dcbc08a..060a586 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -7,7 +7,8 @@ var express = require('express'), fs = require('graceful-fs'), _ = require('underscore'); -var monApp = express(), +var logger = process.getLogger(__filename), + monApp = express(), masterPromise = require('./master.js').master; //the monitor app should support the following: @@ -46,12 +47,15 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ inspector = null; state = null; + logger.info('[debug] %s requested', pid); + masterPromise.then(function(master){ socket.once('debug-started', function(){ state = 'debug-started'; master.emitter.emit('debug-started', ['master']); + logger.info('debug:%s start requested', pid); }); socket.once('debug-finished', function(){ @@ -61,12 +65,14 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ state = 'debug-finshed'; master.emitter.emit('debug-finished', ['master']); + logger.info('[debug] %s finished', pid); socket.once('debug', debug); }); master.emitter.once('debug-inspector', function(inspectorUrl){ inspector = inspectorUrl; + logger.info('[debug] %s inspector ready:%s', pid, inspector); }); master.debug(pid); @@ -111,7 +117,6 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ }) }); - //console.log('html:' + html); socket.emit('workers', { 'view': 'html', 'html': html @@ -132,7 +137,6 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ usr.watch(null, function(key, value){ - console.log('watch raised:' + key); usr.inspect(key).then(function(status){ socket.emit('cache-changed', key, status[0], status[1], status[2]); @@ -147,8 +151,6 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ }) .then(function(values){ - console.log(JSON.stringify(values)); - fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { 'encoding': 'utf-8' }, @@ -194,5 +196,7 @@ exports.monCreateServer = function createServer(app){ exports.io = require('socket.io').listen(server, {'log': false}); + logger.info('monitor server started'); + return server; }; diff --git a/lib/utils.js b/lib/utils.js index 9dd493c..eeaeb61 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -109,16 +109,20 @@ exports.getNodeInspectorPath = function getNodeInspectorPath(){ return find(here); }; -exports.getLogger = function getLogger(){ - return new (winston.Logger)({ - 'transports': [ - new (winston.transports.Console)()/*, - new (winston.transports.File)({ - 'filename': path.join('./log', process.pid + '.log'), +exports.getLogger = function getLogger(category){ + if(!winston.loggers.get(category)){ + winston.loggers.add(category, { + 'console': { + 'colorize': 'true', + 'label': category + }, + 'file': { + 'filename': path.join('./log', process.pid + '.log'), 'maxsize': 4 * 1024 * 1024,//4mb 'maxFiles': 4//4 files max, 16mb for each process - })*/ - ] - }); + } + }); + } + return winston.loggers.get(category); }; diff --git a/lib/worker.js b/lib/worker.js index abdecc4..749ef5f 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -14,7 +14,7 @@ var Worker = exports.Worker = function(proc, options){ _.extend(_this, { 'pid': proc.pid, 'process': proc, - 'logger': options.logger, + 'logger': proc.getLogger(__filename), 'options': options, 'createServer': options.createServer, 'app': options.app, @@ -39,6 +39,11 @@ var Worker = exports.Worker = function(proc, options){ process.once('disconnect', _.bind(_this.whenStop, _this, 'disconnect')); process.once('SIGINT', _.bind(_this.whenStop, _this, 'sigint')); process.once('SIGTERM', _.bind(_this.whenExit, _this)); + process.once('SIGUSR1', function(){ + process.nextTick(function(){ + emitter.emit('debug-port-listening', ['master']); + }); + }); _this.status.register('status.os', function(){ @@ -176,12 +181,12 @@ Worker.prototype.whenStop = function(){ if(_this.liveConnections > 0){ - console.log('gracefully shutdown pending on liveConnections:' + _this.liveConnections); + _this.logger.info('gracefully shutdown: %d pending on liveConnections: %d', process.pid, _this.liveConnections); setTimeout(gracefully, 500); } else{ - console.log('gracefully shutdown:' + process.pid); + _this.logger.info('gracefully shutdown: %d', process.pid); process.exit(0); } } @@ -191,5 +196,7 @@ Worker.prototype.whenStop = function(){ Worker.prototype.whenExit = function(){ + this.logger.warn('forced shutdown: %d', process.pid); + process.exit(-1); }; diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index 32f81d0..a20b656 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -10,8 +10,6 @@ app.get('/', function(req, res){ require('../../lib/cache-usr.js').user() .then(function(usr){ - console.log('user resolved'); - var key = req.query.key, val = req.query.value; @@ -42,6 +40,7 @@ new Cluster({ 'createServer': require('http').createServer, 'app': app, 'port': 8080, - 'monPort': 8082 + 'monPort': 8082, + 'debugPort': 8083 }) .listen(); \ No newline at end of file From bd43553c0bf269f08757a4b9dbf6d288ffdf23d5 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 11 Sep 2013 22:51:51 -0700 Subject: [PATCH 022/182] + designed & implemented the heuristics of #markOld + enhanced the dyingQueue mechanism to guarantee no more than 1 markOld happens at the same time + implemented keepAlive ping/pong message protocol between cache manager & user --- lib/cache-mgr.js | 4 +-- lib/cache-usr.js | 8 ++---- lib/master.js | 73 +++++++++++++++++++++++++++++++++++++----------- lib/utils.js | 21 ++++++++------ lib/worker.js | 26 +++++++++++++---- 5 files changed, 93 insertions(+), 39 deletions(-) diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 2c42257..a9fd491 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -182,9 +182,9 @@ module.exports = { }); var keepAlive = setInterval(function(){ - + //this is to keep the connection open, just to send PING, and receive PONG, and will be extended to validate the health of the connection later manager.ping(conn, PONG); - }, 1000);//ping/pong every second + }, 2000);//ping/pong every second conn.once('close', function(){ diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 3889abe..312c03e 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -72,7 +72,7 @@ var success = common.status.success, _.invoke(anyChanges, 'call', null, key, value); } - else if(token === PONG){ + else if(token === PONG){//just to keep the connection open common.write(connecting, common.serialize({ 'type': PONG, 'token': PONG @@ -84,11 +84,7 @@ var success = common.status.success, }); } }); - - connecting.once('end', function(){ - logger.info('ended by cache server'); - }); - + connecting.once('close', function(error){ connecting.writable = false; connecting.destroy(); diff --git a/lib/master.js b/lib/master.js index 1a21a3f..8a25cad 100644 --- a/lib/master.js +++ b/lib/master.js @@ -87,14 +87,32 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ if(master.markOld(heartbeat)){ - _this.activeState = _this.oldState; + var dieDeferred = when.defer(), + diePromise = null, + die = function(){ - var successor = master.fork(options, env); - //when successor is in place, the old worker could be discontinued finally - master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + _this.activeState = _this.oldState; - master.emitter.emit('disconnect', ['master', worker.pid]); - }); + var successor = master.fork(options, env); + //when successor is in place, the old worker could be discontinued finally + master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + + master.emitter.emit('disconnect', ['master', worker.pid]); + dieDeferred.resolve(worker.pid); + + if(master.dyingQueue === diePromise){//last of dyingQueue resolved, clean up the dyingQueue + master.dyingQueue = null; + } + }); + }; + + if(!master.dyingQueue){//1st in the dying queue, + diePromise = master.dyingQueue = timeout(dieDeferred.promise, 60000);//1 min + die(); + } + else{ + diePromise = master.dyingQueue = timeout(master.dyingQueue, 60000).ensure(die); + } } }, @@ -238,19 +256,42 @@ Master.prototype.initialize = function(proc, options){ //this is the current state of the heuristic, should work for most of the cases, and will be interesting to see how generalized it is. //besides, even if markOld succeeded, we should not immediately start a successor and kill the original, that task must be //queued to make sure no more than one old worker gets collected at the same time - var thisTPS = heartbeat.durations / heartbeat.transactions, - historicTPS = new BigNumber(heartbeat.totalDurations, 16).dividedBy(new BigNumber(heartbeat.totalTransactions, 16)).toPrecision(32); - - //over 5% increase? - if(thisTPS > historicTPS && (thisTPS - historicTPS) * 20 > historicTPS){ - //verify if it's due to GC - var gc = heartbeat.gc; - if(gc.usage > 0.9){ - return true; - } + + var _this = this, + pid = heartbeat.pid, + slave = _this.slaves[pid], + currTPS = heartbeat.durations / heartbeat.transactions; + + if(currTPS <= 2){//TPS too low, no good for sampling as the 1st phase. + return false; + } + + var peak = slave.peak = slave.peak || { + 'tps': currTPS, + 'cpu': heartbeat.cpu, + 'memory': heartbeat.memory, + 'gc.incremental': heartbeat.gc.incremental, + 'gc.full': heartbeat.gc.full + };//remember the peak of each slave + + if(currTPS >= peak.tps){ + peak.tps = Math.max(currTPS.tps, peak.tps); + peak.cpu = Math.max(currTPS.cpu, peak.cpu); + peak.memory = Math.max(currTPS.memory, peak.memory); + peak.gc.incremental = Math.max(currTPS.gc.incremental, peak.gc.incremental); + peak.gc.full = Math.max(currTPS.gc.full, peak.gc.full); } + else if(currTPS < peak.tps * 0.9 //10% tps drop + && heartbeat.cpu > peak.cpu + && heartbeat.memory > peak.memory + && heartbeat.gc.incremental > peak.gc.incremental + && heartbeat.gc.full > peak.gc.full){ + return true; + } + return false; }, + 'dyingQueue': null,//a chain of old workers to be collected, it's a FIFO, which guarantees that no more than one old worker will be collected at any time. 'stopTimeout': options.stopTimeout, 'debugPort': options.debugPort, 'options': options, diff --git a/lib/utils.js b/lib/utils.js index eeaeb61..bc226bc 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -112,15 +112,18 @@ exports.getNodeInspectorPath = function getNodeInspectorPath(){ exports.getLogger = function getLogger(category){ if(!winston.loggers.get(category)){ winston.loggers.add(category, { - 'console': { - 'colorize': 'true', - 'label': category - }, - 'file': { - 'filename': path.join('./log', process.pid + '.log'), - 'maxsize': 4 * 1024 * 1024,//4mb - 'maxFiles': 4//4 files max, 16mb for each process - } + 'transports': [ + new (winston.transports.Console)({ + 'colorize': 'true', + 'label': category + }), + new (winston.transports.File)({ + 'label': category, + 'filename': path.join('./log', process.pid + '.log'), + 'maxsize': 4 * 1024 * 1024,//4mb + 'maxFiles': 4//4 files max, 16mb for each process + }) + ] }); } return winston.loggers.get(category); diff --git a/lib/worker.js b/lib/worker.js index 749ef5f..7cf3971 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -28,10 +28,14 @@ var Worker = exports.Worker = function(proc, options){ 'durations': 0, 'totalTransactions': new BigNumber(1),//avoid zero division 'totalDurations': new BigNumber(0), - 'heartbeatInterval': options.heartbeatInterval || 3000, + 'heartbeatInterval': options.heartbeatInterval || 60000,//1 min, the heartbeat should be too frequent, which could cause false old determining 'status': require('./cluster-status.js').status(emitter), 'status.os': { + }, + 'gc': { + 'incremental': 0, + 'full': 0 } }); @@ -151,24 +155,34 @@ Worker.prototype.whenHeartbeat = function(){ 'durations': _this.durations, 'totalTransactions': _this.totalTransactions.plus(_this.transactions).toString(16), 'totalDurations': _this.totalDurations.plus(_this.durations).toString(16), - 'gc': _this.gc || {} + 'gc': _this.gc }; emitter.emit('heartbeat', ['self', 'master'], heartbeat); - _this.status.setStatus('status.os', heartbeat); + + //cleanup after heartbeat + _this.durations = 0; + _this.transactions = 1; + _this.gc.incremental = 0; + _this.gc.full = 0; }); _this.heartbeatTimer = setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); }; -Worker.prototype.whenGC = function(info){ +Worker.prototype.whenGC = function(usage, type){ var _this = this; - _this.gc = info; + if('kGCTypeMarkSweepCompact' === type){ + _this.gc.full += 1; + } + else{ + _this.gc.incremental += 1; + } - emitter.emit('gc', ['self', 'master'], info); + emitter.emit('gc', ['self', 'master'], usage, type); }; Worker.prototype.whenStop = function(){ From 04b558811c103f9c5365ec9aa3a01e31d538bf8f Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 11 Sep 2013 23:47:14 -0700 Subject: [PATCH 023/182] + event handler dedup + logger fix --- lib/cluster-emitter.js | 7 +++++-- lib/utils.js | 38 ++++++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index 7bed4e1..a350d5e 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -20,11 +20,14 @@ var logger = process.getLogger(__filename), //a map of event handlers }, - 'on': function(event, handler){ + 'on': function(event, handler, duplicateAllowed){ var _this = this; _this.handlers[event] = _this.handlers[event] || []; - _this.handlers[event].push(handler); + + if(!_.contains(_this.handlers, handler) || duplicateAllowed){//avoid duplicates + _this.handlers[event].push(handler); + } _.each(_this.workers, function(worker){ diff --git a/lib/utils.js b/lib/utils.js index bc226bc..5e47330 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -109,23 +109,29 @@ exports.getNodeInspectorPath = function getNodeInspectorPath(){ return find(here); }; +var fileLoggerTransport = new (winston.transports.File)({ + 'filename': path.join('./log', process.pid + '.log'), + 'maxsize': 4 * 1024 * 1024,//4mb + 'maxFiles': 4//4 files max, 16mb for each process + }), + loggers = { + + }; + exports.getLogger = function getLogger(category){ - if(!winston.loggers.get(category)){ - winston.loggers.add(category, { - 'transports': [ - new (winston.transports.Console)({ - 'colorize': 'true', - 'label': category - }), - new (winston.transports.File)({ - 'label': category, - 'filename': path.join('./log', process.pid + '.log'), - 'maxsize': 4 * 1024 * 1024,//4mb - 'maxFiles': 4//4 files max, 16mb for each process - }) - ] - }); + + if(!loggers[category]){ + loggers[category] = new (winston.Logger)({ + 'transports': [ + new (winston.transports.Console)({ + 'colorize': 'true', + 'label': category + }), + fileLoggerTransport + ] + }); } - return winston.loggers.get(category); + + return loggers[category]; }; From 0888756fa7e4357be38c3705060edd16aa587919 Mon Sep 17 00:00:00 2001 From: huzhou Date: Thu, 12 Sep 2013 17:05:05 -0700 Subject: [PATCH 024/182] + refactorings & doc --- lib/index.js | 38 +++++++++++++++++++++++++++++--------- lib/master.js | 9 +++++++-- lib/utils.js | 2 +- lib/worker.js | 5 +++++ test/lib/cluster-test.js | 15 +++++++++++++-- 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/lib/index.js b/lib/index.js index 7394206..f87309f 100644 --- a/lib/index.js +++ b/lib/index.js @@ -23,17 +23,17 @@ var readMasterPid = require('./utils.js').readMasterPid, os = require('os'), _ = require('underscore'); -// Trap all uncaught exception here. -process.on('uncaughtException', function (error) { - // TODO: This has to the log file - console.error(error.stack || error); -}); - -var Cluster = module.exports = function Cluster(options) { +var Cluster = exports.Cluster = function Cluster(options) { - process.getLogger = options.getLogger || getLogger; + exports.getLogger = process.getLogger = options.getLogger || getLogger; assert.ok(process.getLogger); + // Trap all uncaught exception here. + process.on('uncaughtException', function (error) { + + process.getLogger(__filename).error(error.stack || error); + }); + var emitter = require('./cluster-emitter.js').emitter; this.options = { 'emitter': emitter, @@ -81,10 +81,29 @@ var Cluster = module.exports = function Cluster(options) { }; /** - * @return promise of Master Server starts + * @return promise of Server starts * * listen will create the Master process, and delegate to its#listen * it gives back a promise for the master's server to be started (monitoring application) + * + * the resolved promise will always give: + * { + * 'server': server, + * 'app': app, + * 'port': port, + * 'master': master, + * 'worker': worker + * } + * + * if cluster.isMaster === true, the promise will be resolved as monCreateServer, monApp, monPort, master, null + * otherwise, the promise instead will be resolved as createServer, app, port, null, worker + * + * Given the master/worker instance user could get hands on a few more functionalities + * assuming the following: + * var masterOrWorker = resolve.master || resolve.worker; + * masterOrWorker.status;//gives the status registry + * masterOrWorker.emitter;//gives the event emitter in use of the cluster + * masterOrWorker.useCache();//gives the cache user promise, which after resolved would allow users to access cluster caching */ Cluster.prototype.listen = function() { @@ -109,3 +128,4 @@ Cluster.prototype.shutdown = function () { }, this.stopTimeout); }; + diff --git a/lib/master.js b/lib/master.js index 8a25cad..7b9cd95 100644 --- a/lib/master.js +++ b/lib/master.js @@ -57,7 +57,7 @@ var Slave = exports.Slave = function Slave(master, worker, options, env){ 'whenListening': function(){ _this.state = _this.activeState; - + //this is mainly for the old worker to be notified that the successor is ready master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); }, @@ -301,7 +301,7 @@ Master.prototype.initialize = function(proc, options){ 'status': require('./cluster-status.js').status(options.emitter) }); - cluster.on('fork', function(worker){ + cluster.on('fork', function(worker){//interestingly, on fork or #fork could complete in disorder... _this.slaves[worker.process.pid] = _this.slaves[worker.process.pid] || new Slave(_this, worker, options, worker.process.env || {}); _this.slaves[worker.process.pid].worker = worker; }); @@ -390,6 +390,11 @@ Master.prototype.listen = function(){ }); }; +Master.prototype.useCache = function useCache(domain){ + + return require('./cache-usr.js').user(domain); +}; + Master.prototype.debug = function debug(pid){ var _this = this, diff --git a/lib/utils.js b/lib/utils.js index 5e47330..0093c0a 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -35,7 +35,7 @@ exports.ensureDir = function ensureDir(dir, clean) { var paths = fs.readdirSync(dir); paths.forEach(function(filename) { try { - fs.unlink(dir + '/' + filename); + fs.unlink(path.join(dir, filename)); } catch(e) { diff --git a/lib/worker.js b/lib/worker.js index 7cf3971..78a96fa 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -123,6 +123,11 @@ Worker.prototype.listen = function(){ }); }; +Worker.prototype.useCache = function useCache(domain){ + + return require('./cache-usr.js').user(domain); +}; + Worker.prototype.whenConnected = function whenConnected(conn) { var _this = this; diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index a20b656..2827d25 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -1,6 +1,6 @@ 'use strict'; -var Cluster = require('../../lib/index.js'), +var Cluster = require('../../lib/index.js').Cluster, util = require('util'), express = require('express'), app = express(); @@ -43,4 +43,15 @@ new Cluster({ 'monPort': 8082, 'debugPort': 8083 }) -.listen(); \ No newline at end of file +.listen() +.then(function(resolve){ + + var masterOrWorker = resolve.master || resolve.worker; + + masterOrWorker.useCache().then(function(usr){ + + usr.set('init', Date.now()); + }); + + masterOrWorker.status.register('worker', process.pid); +}); From 75759be46746b2355b9e3d897dc442d7d644606c Mon Sep 17 00:00:00 2001 From: huzhou Date: Sat, 14 Sep 2013 00:04:17 -0700 Subject: [PATCH 025/182] + update deps --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c329edd..50e19fc 100644 --- a/package.json +++ b/package.json @@ -12,20 +12,19 @@ "main": "lib/index.js", "dependencies": { "underscore": "~1.4.4", + "usage": "~0.3.8", "when": "~2.3.0", "winston": "~0.7.2", + "graceful-fs": "~2.0.0", + "request": "~2.21.0", "express": "~3.1.0", "socket.io": "~0.9.16", - "usage": "~0.3.8", + "ejs": "~0.8.4", "node-inspector": "~0.2.0-beta4", - "graceful-fs": "~2.0.0", "nodefly-gcinfo": "~0.0.15", - "ejs": "~0.8.4", "bignumber.js": "~1.1.1" }, "devDependencies": { - "websocket": "~1.0.8", - "request": "~2.21.0", "mocha": "~1.11.0", "should": "~1.2.2" }, From 00129886e1d5758ca6b0b0c7a30b1ae6671dbfee Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 14 Sep 2013 00:05:24 -0700 Subject: [PATCH 026/182] + enforce message encoding/decoding to avoid '\r\n' symbols --- lib/cache-common.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cache-common.js b/lib/cache-common.js index 17a296e..8fc5596 100644 --- a/lib/cache-common.js +++ b/lib/cache-common.js @@ -58,11 +58,11 @@ module.exports = { }, 'serialize': function serialize(object){ - return JSON.stringify(object); + return encodeURIComponent(JSON.stringify(object)); }, 'deserialize': function deserialize(string){ - return JSON.parse(string); + return JSON.parse(decodeURIComponent(string)); }, 'write': function(conn, message){ From 6a92267d04205d0999176d7be9732d10895f38b8 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 17 Sep 2013 20:46:00 -0700 Subject: [PATCH 027/182] ~ cluster3 debugging experience improvements --- lib/monitor-app.js | 61 ++++++++++++++++++---------- lib/public/views/index.ejs | 36 ++++++++++++++-- lib/public/views/live-debugging.png | Bin 0 -> 853836 bytes lib/public/views/workers.ejs | 45 ++++++++++++++++---- test/component-status-test.js | 0 test/lib/cluster-test.js | 7 ++-- 6 files changed, 114 insertions(+), 35 deletions(-) create mode 100644 lib/public/views/live-debugging.png delete mode 100644 test/component-status-test.js diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 060a586..9e0f242 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -23,8 +23,14 @@ monApp.set('view engine', 'ejs'); var debugMiddleware = exports.debugMiddleware = function(req, res, next){ + if(req.url === '/help'){ + res.sendfile(path.join(__dirname, './public/views/live-debugging.png')); + return; + } + if(req.url !== '/debug'){ next(); + return; } //the debug flow is as the following: @@ -41,6 +47,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ inspector = null, state = null, statuses = {}, + knownPids = [], debug = function debug(pid){ debugging = pid; @@ -73,6 +80,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ inspector = inspectorUrl; logger.info('[debug] %s inspector ready:%s', pid, inspector); + knownPids = [];//force an update }); master.debug(pid); @@ -101,30 +109,39 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ }); }); - fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'pids': pids, - 'debugging': debugging, - 'inspector': inspector, - 'state': state, - 'statuses': _.map(statuses, function(v, k){ - v.name = k; - return v; - }) - }); - - socket.emit('workers', { - 'view': 'html', - 'html': html - }); - }); + var arrOfStatues = _.map(statuses, function(v, k){ + v.name = k; + return v; + }); + if(!_.isEqual(knownPids, pids)){ + + knownPids = pids;//update pids + + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': arrOfStatues + }); + + socket.emit('workers', { + 'view': 'html', + 'html': html + }); + }); + } + else{ + socket.emit('status-change', pids, arrOfStatues); + } }); }); - setTimeout(workers, 6000);//everyone 6s + setTimeout(workers, 1000);//everyone 1s }; workers(); diff --git a/lib/public/views/index.ejs b/lib/public/views/index.ejs index 60353c3..d996c64 100644 --- a/lib/public/views/index.ejs +++ b/lib/public/views/index.ejs @@ -6,6 +6,19 @@ + @@ -32,8 +45,25 @@
- - + - \ No newline at end of file + diff --git a/lib/public/views/live-debugging.png b/lib/public/views/live-debugging.png new file mode 100644 index 0000000000000000000000000000000000000000..626228bb5a3999e84bda15b84b812dc4983ad0d1 GIT binary patch literal 853836 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

=vVV=JFRdpv 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�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 z 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%0DK|LF)^h>{5jm>OW7l!AFcAd)p znkz+rF8DE59uALeQWRWu!q?z~G=I2!&2c=XL;Iy>Uc>oFpy_V*b^q2DwUgq++h9UL zgPzNgDJNaBY|k$A`b*dF`sXDpZcIpJ+ELs=+RkvLe5UN@&Z1EsmuuS?uE*Z|b8!Av z&+Qb!wylt1ha~%7qw0pQw-4DKiStA#bHQA!Ei8KW%+6lH;rUR40Wlc|6|AUDpe7^)F;CT?-D@T*RM zz6c_z^GdQ)zUGR0xB4s2!?dCxf!iEl(8YpzJ}h+yKJ+ep2ue6Z64=ptX0>FV^pQD+;@bEJ)-? zIq16FA^z7tX$`3PUSP#I&aDdfVpYU!p?gn-JJAGA-MKXjhN%Pg+PLOUsTy(#c}&HZ zHhrR{89m|Res#qq7|K17Ziw2ie&?34PbU*7(BRx6S}a9N+KJ(|(1EeN7N>cseL~;T zE{ZQJS}u8}lVXl|d>-;*An>l;Z1sBK#mMEG{kY;uXh|_B*40UfD{&c+?S4}1m$w(1 zV&FB-jvOvz{LNzki;+b&vJgie-Y(iJGJy8&!LXpn3ac>n?k&5cgdU;R;{>s-v_{+1 z@Ai+2!9|wpkI8O6*Aw(V#XpljZuwmkn{Uganr1bgU0ft@S^8a;)e4*swT-Wso~hnN zJ@IK5GdQo8g1LX|r)|x-b`&MaRe%$u+bYvu`EtjZf%FdNnZejS}nOyjtSqo3j9{A&)sSYI;ZiS z-O=pjd#YrFxPPXQ?%ta}ptl&y`0YS`QTnHFBehU6+6iz-IRy$Z84nTO0{PZu%?}uy zYtpyYR^_Fzzbb1MC0G=Kb@<24_i*cr#BwW|@QaLOhx&>D_Is-re>_osDeA9B z-l3oZEK`oTMxwv3M>t&mu~{a~m|H5RyoqB~IeR9%wGz4SK_V-hjjX-SCZEvAqNT>+ z7ajGzb5kUYRS+a59pBA?L2ADK$>65D-6t^>lyrSe%C>ln#=aemuJc|Gl@;QY1g%h)lGYO4=2E-x5@w_!ABH)7jozbDH)=3oSq?PC#m+g3OCn0Z-r}}Eagqw&&UiwVS!-*Pd4Zgxd z8$Y45X<)7cn6o_Yu+{~b7e=6JnH{)d)2(M#_A7O-6M|ikGU;c3jh+ZTRMyS*LxvjO z>6%NTRrj)9#boh1{8_1X-?Cy$m|Ieh!|P5|OYORVN$kgXBV9P3RN$ za_^E|^XMhC9P>PALB6x}v|d?T(8(sxteceaN`E5!)j%xHUA?B3x<0+X#owLpl8Ob^ z#ocy3`iylZ{#wI%G_!QlFIGC4(LDd5Xevk5R--IPSI3-ha>Z}h=duFFrSs<#r0Pg< z2k36kK^0DkPQAq^i>Z#r)6XBfWjNoHnOZ@0!FFB7I~F6#3lb}Ihzg>0^{ATxM z_I43ND$#D~aYLz<8pQ#zxzI$8ZA78%vA6RBM_4oFE9qyqd z5Y5!sdZ^XX{ZHZk-vYZZ1c8mo0|}Mi4ooz>T27m35%X5a33B@f1b{=xh8kF%wtvHE zp&3GE{AES$8|(c`T6js$>1-hxD;81&3MeIx8()|$!dLuiER50T*K|VXywC$LxldSB zgwH<6OOj-esZD2d(3f?Ns)foJ>n_9md6efP&p}vZZP9i5Gi_O5XSh;;eGZvLL!ZkP zQ#of|US?WU^_O^PZC-rA{qKDV0X*}m&UH~kgTp~u&wO%lq?j4aZfm-`#vv(Te8q6t zzgIrs1bwI$L3~sh#-mLsyI(BelyzahT2gFpW){RjoZnGz8F9||^M}jqCh;g^GuO}8 zaMmz6nuNBNE3Cv7BPCZ86{etV{-amKKxFsImn;3YwrG+uRzcG55mvm#O)LXMZ&NaP z>G$=;26gb>2~v*e6yN#HR<(m$gL4??QlRuVds&4IcEqf?&y#|SI(BAW6c-)nu*q|N zE3uhTM5JMvXZ&cg(@E0d?m*qYAJr+kE)||(Ix2B=?Mg7e4WXp<9l@LIU%5v<#sNkml znU1!g0(PtDAPaBH{oV?8VxqgBcR{z9TaIU)_}Yv=>vJlqWiK?; zueRN@ae@^;rqcQnq5fM459(;Hey_`TN^%$}Bg~VIVn%EP$s_Rc+QFO?ZKuSuKjE7My~;N#gu zb;=7*+Z!PXo`(Ih{`gQlf7I$#UN^m8-f*>h+*1S};P1vrH_h_#QuZ)i`2dV3in>K^ z=K<14%#_+0Z1Fy`W@~=Py0%b?db#}5QLJkDVg-y9)x^o+iHd1*r>m5IWzTvGJ}(D{ zgu}hXPRngh5R$XU%J4~5icJmLLKDn+bwN+mB)9!5sHAUKRkESn`;`^nN!>Ky3x{ul z$IS)^@V!q_*8%rzedpig+fL!DvEFyR@<%PDo@)PX6@fTBg<(=Mvl>9D?&u)0ehq|# z$A)h1T9XvGMC}ha^BDKSW@z^P0v*7|p%VA0<){+3?492Dzi?7T6_V>Lfg*vfgH~7C zQOBV)p8I{vZI^xY+L10dUDoOooC4WsSnTmz6nSk6^D>s_qL}3OB~9dEy@kM}pVIh# zIr^}@SBX`MxY{k0k8PF~B^n}4wsnXFVzlKJVr3;wghpwQKgb2BOei1Y7T@l?Gfoy0 zwm`lxRcUe5@HY&zbB+&%vo`E`WTlQW#^|3igMxxsrp6}Ru?2e(B?&!Y1sJxYMZYMg z+G)EkQohE1*GWSk^Zs21ZuzOKymG1xbAGB0VT%m8*U8z-Oz-l?ZhxtL^ToOYS}It2 zqNfqJx>ItBilUKCuyl`3xjoBL3|Ty1`%mQSI&Z$O8>~S^psM#jYM{-EC%#RPhdYtT zM0XBkL;f*xPK2s&owK^(bAFmi_j4Xly`$so`Sp>uBW~(*E%_J67-0FUqMOhQ;^U%Bt zj{wV{Zy98f>9W8gm0%vgK-{2rI7^q8Ix6po`8*W%v!>&NjyY*9uXd9&`6SBssI7ux zRArwfp+3JxjJDc&El2Tnw~4ENFDu4+B519g#w;_eW?m1AT8e8hmgPlO#| zM@POwy7o5e=~q%It7?V>81(pY2<1VebAS}X&rDj zrAe7G>2?M+XcLX-9#a(cUo&I9-+pH6hC_`i&wZJQV09e$$SB>QEPv>dg)AgPTH1xRw{R%H@-*I=1 zm8n4+SZ(-wd}@SkS}@Z`KVAjK8fw;RqOS1;9wEn~-DOF7oNYI2 zlg{3z?On2bb-3pK^;7shy~ZI@Y}>);N^t~DA$me^U6DCrnSrH<5LjsNeGX7vj+ae$ ze#{-~5lm>TcjPS@&qIkpzJ5bxKdNX{wa$-MKZ}Od zuBZb(CHN;=ogbX)3=BM%)sA@{R}UcZoeQPx&tL;t;GaUJ5>9@3EZUQM z=KWJ&+E6wgV&o~9%h$z5EG!->T267Xv5Di?PpW-@o8tES%}9^m{f_a>AH%mlgZG^j z6xkI0UvYXzUkZvKtHFDk2<9(zgL@tB?ckTCcqwGsK0RBcHP1w8ZAdHmQ6;S-DC#+h zR+{CxO+lL_UEfe0SVjAV4k(pp7Zk{U!g=A^M&R-hBP2TNf)CIp-c zuUKy&i+Z~d6Hw)GVRi)}6px;^oZvhtFaDk+mC8#JF6;!+Z9=Fd zXbuh}%AU-%Th)9;`4XXGLcV}`1{H9ZH4q)wmU6>w;#+nT#ATFE+V#=f)J{Jpsiy;e zz93Nq;uW^wwebtl3Srz!nd2(A6|JTJvK#G4g>2xT4nlJefw*^>k$+G9RbOBmJ$U9r zGQ$!bwz6NZi{zHM-Eid=xWhxz)0dm)tWJQivXcjU7E3^`Ni>{5BJwcUPve9@KWb6uGX!^C^^7#sN(CYIL$W`7c<40sA@o#ww_b@De^oA&A$s zKkDhM!w*=8)H7*MX8r>$a30{+ewAr&7RJ>h&C_f;SZ-CIQT})20hAFWXgnv=UihXk zm}^x(QA8-z__naXk$7!i6WC=WrChUs;oCk>5G~?(>pgj-Q!Xm%?JBE*Qu0U7=+CF9 zE=_E%iUUzlifgrc*ZA(W?oP2kpTy-(RccaeiW&@;Xh-`oNQH+Lowk)U!oxR5Ob7Hs z55CV?=|-^bMc{a7yOww^zzjL6Abnh;7LgMpR&j@l#UlSG=~zE$EjxnrEHN`8ZrE(J ze;)8T_Cizd9ssgx%wo_LMc$mI43hi$y7ae{(DmC8P)@o!GR$A|e~kLXgK-T~uu-YP~ppKC7^A zBHOsFFg;vUTP7o3n`=82Zp3MR-3F!4Mcu-IDQ4{#TP%c8MKKkb-)HiT^fn8GX%Y7` zQ#4Zd>5ml}(aDIFQ6a@gVnB^idp)F3(5dm#=msN*X-i2W5~PKt?Jp(%?{g86$YuVi{BTE^B6>k;$S4<+Pkvw=2_a7@HM>Ge-U1ZTe+S z{ty3j8hZ!uyI+O@#i_e$RaQTBi<4`)0v+HGSjzC*p*4KCi1lk7W{|2e-^}8p)vVy# z&j}K^&P8q-Z}*&DlvtBw7yS#F=t^|*Uw<ke!PKNvteZ>0PV+`Danq zVFZ_S=;PD^erDD`Y`0xLMAkDdw2gO)^Syi^v=_SC;i)UuaVbV?DP{IE7qVb5?RW=(&)839A9&dgM# zXhv174d66&n%zBf89o%ji?BSAQD)Zm%pXPjH#&uwGl>!`bA ziIQ%jVj_OwMkcZ5`@xwSyhxim<*tA<5B%4m<;H+i0^4KX{%7N1F&LngRA9dKHgyH9R+U)zkO z8^rwy`-GD*Rkse@p6$Yq#>hN0s|k}kS;>frz*qm%l<3BStOr*(E3A0ZGipbg|NfTB zHTGb?m2%CX%Xu|dD`~3%CSz2J=7{91hknXB#!bmk_?vkE|LVL4IU86H@?KbVAm@JA zmlX8e&ke26u9YCLwwrB`pw;{@GU?PH@7&7r+B_1NbJ{d(;k&NRozt%|gY{)+3KAwY z738C1VZq12Su6>$-gz&P|Lxc}nka}(f^raA(H=nZ{HG#c5KZx71Rkg+(cO2)(tW?| zji2uFdB%r(f`0~Qkf?KC-59AX9M6=I$Y#8lCcDII(!{uLIEQOBnMsc(GVo}#A_Q~UKSIL2ovRBBC;3J_WGhHHB5Ozfzg#+?IWKKrh7zNF)7p0H1zejvlo9NShqFYArs0s~xitl-i zdmd`NmuKr5@ii7fhmc6#4=8BD*p+i77X0~0o>Oue3r||r$j1bWaeBj!o7&39?hd~{ zlC(r?6Thdb#?Q7*rMJTof_dW87rt0e+Cki#jlr*@3>TbtPhCyt40Z>KxkDLz|0>;L z_iMEGn7>G7afr`(nKasj*lMnohNhOTG6KQ@*S3_>w{@yS;On2qoqXS{uj-qY`|2dt zSYM>N(#e?(r#j9fgrNATU%Qr>&%J+@l<^ojp2Oy z`97F>^~GrJe_+qUC8GaW?6t_yjcl@xO*Ref1O3nKlI{Dkbkm6U?Zf0YfNg%4@gJBS zDI9g2zbM21)ieWnj1ZJ_&D4L7Lo>_;Dii@MvlIah=$%58wg9J`?TpV*zQBp(%PUZ` zY`E8y(f?NqV3tNjkG!Ic@UKeuj&XiTf$ZVfi#~MHw7L7oX%UPB&w1Lm91Ezn%A4)p zru*UycDFCS#X)K(k?;z!2MBUUL?lK{T#p|oT9GC{bh-Je$!+fwwt7$yCMo%&23Z;Q z5;di$*KZzkW|M#M+@(xeZM{65{oSASIyW)nE%B+9`8$%nU!S7HSr&=|3gVSy5dq=t zeK9AE$4mNXA~s1PBYz#Pc$W}A(kH!Gxx!D(;l3M)+{K#ZR-2!)-AfPR4SvLauDHK$ zcv=QGmLaN9$bU%?6qM^FPkwl{tXOkAbM$kmYT%Az!+Tj2`qa1=o}S&jbxCd!t^Js9 z{vsMgrA4Dkrc7_Ul_}cXi3E2cY%&^v$D6URNGFXMP4kr~vy32zT)0QMK$I0a7(^u* zwf1-nqYV$*GR4J9Hz-LH9*@UtJO_Be{nwXHov*}QhJ@>mvf2u z2a|Pn>(O7firbyM)EBnTeDs^1t?Q^yQZBhTerzqzSLL^lHZVI9lqcBVRkF(KagOIRC>7x`^hq{2FrO zW4|-Nv^XT*q&^iZviWa)dKg_V? zx{^9xgIIxnE_d)b0;=0k4-&5(AWo@Ag7=^ZnDM?Z4Xi)TH8fH-D!%Nx1=+(r{2n3a zu$g=6`E|>gbNk<{#QQPel=$53=`;%tXTvGn&dLSW$NAkr2e63egJSvCQ-s@$D6&Pb z*BA#%$h{i>yqdUPuA%x*Gz0TJMIp>3?Xd>iXGj5--ps%s!Q^Z7HSN|xVe}=E(Kw@% zH0f13j{AX5ek2G^_{#2$YgDCN2=SC|o8dl&HS$aE#wGJ&=g%qR1bY-Z7 z+Y zd@rgNtvqH%X$5_CxClVF&cXuOU{NwBK>D?Cz+>iM2?80&%4N_u{)poH5tGBh^F<`> z6HV}M=;bFipo5n?#`+kV72?*a&~$9Rtfw`&&yykxI`=K9H>~=&H1idW2|nF7xve_R zC#d69zkPdqD@;}tU_T4f$IA5WH1qn*%JefEQe7MMye~2mO%d03AF^FiF6nnUT(@g# z8kw!SX*BnXY7G8@<5rk;s=1)fYc=odX^tr-q5_dOux?M(cHsnve=|gC-+ZXyaV3g6 zJrhAiZE8kO&4UVZr6jtKF=>f{9;(O1f~pLIw+cY_&#<50o|~!vr#V|d1G9gOf@S9z zVqNV|;R&~E-Ol(hr?Hwq6K;>P5%WQ~S(s$;+Iqq}c9SNV%WYkoMAAY-u1%yvbQ z{*e5O#ap;G?FG2UTT0ZZx3*q==*w=-C`-k$+BI7C)y0U?K;iL4(veuxB41M zQV`3YmDMlrxZ+z^4Wq%FGPX|GLY9*%aBF>l<;nBRB5-0x)eY{ z{Lq%6ZMP-6<#6t7{nz1XJ&BLh2=$rZ>%C_7LJQnPP3_fCHUEZSK@mbw*l*E+K)X=~s)Q!mb zOnv7Y>e14OEa@hT=YkdPHu88B#;M_r{m@G(oYWP8=1Y^1yTpCQCo7~J&aAjreY|Y= zG={kTBL4VYiT|j_a>VN*LsU^vt1Mc6jfSwz<3O?f(M2o8n4y3UVhM569}_j=O5?W| zDuniA#h|F6$n=G-G2@A*dASt@y5DVu;8FTIqc@5cLOO3{`x9l#+va4pfC7;v0sq!c zrH^)lWU*Wz)zEa*>r!7e8YoN%w>FeR%b+JkAC3kNY377HEDY#PL9QS4`!tsm;vUK* zpP_y2KH`KSKS6|tdY@^98|NFN;VDZTKsx0Ot-G%}8gvZ)mc!@f?poDII2SK@Cog%y zKq)p?iVSJn)4~n+LgT{IB?jWA^&zknK-rb>n*$3san_wNg)e8@(hv^GwC->Jr zxk9ilLH`wn$M_J~!xsorbuEfMhpO+V7W-_B+`vvu_`784`d#}S^R0`h0Kjma{&Ctf z%5VFZcJGI640fGc+AOiCH*`Hx$JGl0YSEBU<0DRIV;>Ce9!z ze*>N&=1u~K($&=(>{5ikJb!eT;Vt8<8d+|Imnhi$eW@nwB)0jNt4V;r8|7 zXq@Y^KyuBghX7gdeE;5u-brTC!Ga;9d0pV?)bIZFkNt&vQ#C?F&PYPLQC%%F{B%HK zf@e_(Z={7!UKU#f4Xa1E4ETDlF+Hwz%(3&78slAheYM4mT~5K^Wqae=!RLsQ@5K~j zZ=HtTH!g;NwIu#|#p}ha-{YQNU_+$Bw`dA<#UfNt5U_c$LBB*reqL|0#^4y$TeiA+lVH<#*K{I%OPo@9);5ZtWhS1d zA|HgMm7!Ai9=}WAB3$K?U`tpb~DEiN_d`_tT&V7e3$W(Mi>mF-uA!g6zcXtDcxFDH>cB3tZyV z;A!M;a9_y?Z5~cnBM$vXk!RfL!-Ko^ho**guPdL9)}3$WvKlh^s-u9QyT14RCODEV z(~5S-JdTTmghUM)t?hNbDwKNMS1ZN)YG;3}4|fdkX$gdj9m(>3ObNy5XeaPi441J#Ur+GX@B2OWGWVu_k2sgu)ar zCxpx0(g2gv;iZ-=ffbzfcUtr!I}c{`{sa6^-XPH=9KM%H$dF)7J*Qx=uPcOJKREtr zaG!<2YBZvagfoPyA{0NMU>-jNSjIkV+^x0bT5^?tp}`y~4+@4W5BwUvu*;zaIaW9& zDnfk9_Wf>K(!yZ3dcd52!>!Ci3r&Q~dhW+prUy?kBG4D#|#?1kb`VrcCC9nz+%AA@PVos!$=4p@~#Bsdf5iC@zpi z*fT5CtYk>x(nA{T8#fxcII-#Ul_%nUl}2EH2P)5x1=`$t=S5Xa1aVLxOkub(XZyU%W`!gz7>^1i6w> zUD*FS*&rC*1&@JVUtv%Xl98sg;tJbIxOZ!rdJghXj)i9{Y^#}=$E?B&Y)6M(!-Fku zRND{rm^}91&vlCjGd-_-L8igP6c-6OTXz~kKMmQu`YB7CY%Caf!Z!2N#nGi57Sii^ z`PqAETf=?Z=2+JV&)hSKub~37S`+iVr9F?zz4>lx5}4S{PbK#i_M!b2ph(hRU9~?Z z8ZnHi4i@%e-M^8QB1bE}?5Acknf99sWNpy7BCRilmw&fRCcmvDm?v(ng3HHRI41b{ zaJoJaGedn638Yd+5Kxk2E>7%K@#&7ImJVH@4>mk}HwKNuVci|el!e&r>guwdE@Xb9 zFuYB@_s>hx_4^_@l{pxcti!1;X({Cm+WbSF1{heapc;K1rc8@%atZHRSe-pN#lD|; zn2h!Pe9?#HcOFFad5O;1z-{#lupn^+*r3&dBXQ;EW}p|HI4(9SHzw|lsg(b{D+YA= z=#GkhQOJzV`+33eSR~_LPN%Kzf%AsBRk!s~;y6mlqIu1}ehojty8mK?|1jE;{yT0g zm*Y)-Fk)I8DZU0tR7ew;VPnMf+O*PT2|Ybcf%-R+f&s%$Ppljf=Xe|)Y|&`JVlDWb z!4BOe#1OFE!6gxS5R>4HTA0SCGm+tHn>*qh60BC=EEWHhn$n%k;KGg$ z&d?qmnq#2PfP)5Ves6B5W(}kR`6(N}D}_j7W34EWF`k!)kOm?Bdk8T9>6398StH?t z*(#p3M^Z>fDPwve0XlpH(*%&HvIydNO-q)b{C#=o-qJLphkuFb~VR zKFt{WX6|Vqee*V7rY5@F;&eyak8cf73QofOnd`%bkv{i=YI(1KZnTJ*dT$ttmaEvh zfM;J`NnY>zXFxhAu=W4p>Mf(GELeaH?(Xgmfq}t2A-D%fa0mo<9o#~IAVC8J zg1ZNIg1fuB+t=LBd(O%It<`_K*Uajxt7=#6+8dtu4Bdg1$5`XWY`I(8pmNOF?g)m{ zL?F^~5i(0>sz~HA>(=k8UAPb$mlJc9y=)T$Wy%CcznREFpFzZ7g7|@rD20*$+cSu1 zZ#-kKy`#f!s&4zYP?=K0DnQMhD5h6&)C;dv2`$G1%D5afEHPgk-T=!gYCj2!88>xLtMj3 zY(w2kSv>#o+&%`p?e>n2$bsQOiszjzs*C@1fXD**yjXX&<>%*ef*qm$`^T%_TNuZ> zgP*$X{UVX2l{4aj^_7@zn|aCCPdCFY8?1IK8sdzW%PWB&f}aY0F8$Ot1kNt-GyY%a z**XBBeoZp3R=?h9M@@#b%KgH!%T?sT;WIF4de*$aXVqB`B$_kAAE){2E(SkVDhj5M zgYiVf{)1IMNlzLCja)w@WC&V0+L6>d;l1VifDKO*i{(|SVR=39@~q$QU-)u8V&&4{ zh#p@s`-mL$HI+9F&0E#rWF8Zc$8sMd;z`fOpp(6(5nsO7#RhO$+^F>Ok8%0|Sv5!U)**i=@_(H(h6gwp+|AXJQ-7a5Ed6sS}P z%xe2)2YlRJ;$1gV1RYRz0pjljX2~ca#1;*V4(gukOtc!oS;#0SrV`FLxIg;BB<2OP z={U3UVW^IBPTmfj*>9@7fIulr<&zN{W{3Raj+sT>*ow-K#3-HorQt~;mV4U!g`Grm z;9~nbz#mbGVmCV{!p@aE1CLt@swwSob`>NSWAUBdCUm_FGbGl86UKvWPT07Mvmi7>By!Sf4G0Of?`>+yHV-Z9tM_d**d?NZ$OyT;rPn^Gg2>c9sdTN?#tA zyR&Xomq6)TRB|~5S+$q9sZ5*FC)`kaexrTB>C6Wa%r0z?t^GL^WQ}KgXZn&R%kF?IpdmJ4CeoLTqn^(v&fRz83atJc5 zqP@}wTO=TTq>n4g*g&mAdT$Y{FmCCV7rIG7n+JU<(WnhtM&Kuo%nz2!fAtaCSCFjJ zD>g!ioh+-7U{dN7smOpHBfM-E0HvWj7Lw|ZJ|-Aq)aBYO9wn%fj~bBj<`}>|Cl3w1 zr}`Lp5gHm=ikASMLD7MDWU^P4Vrm$Fr8 zopPfg(&(nXjVP86ScOOc&P3Qq?<^XDKUI{s`{Ox6xGE!aBuu`uP^BD2y`TKFN<-wi z&^MJGZe`{}(TR_zc|*5B4A51vyL&eh4ZSDcX|CKjJ2`zx#JTxZVu|(nEzr3ZrlOF1 zhqKDJibBuzriPf&^LT;O_t1WfB6&otCFLFv>XMbe+C}G|7oU%xvu%i^Iwg2-M`XGf zMUh|duOpR$y)5@fl#HvDI_;WnO3xA98&7acZ3LZS=_Ja9Vs)wU%fAO341V~jzMn5C z0<^xer*gjjtqjc_VMI3cH=sJsav$v}(twMEv4rWWu}1TnF*V2OMrXO~W}s2kQ2)qV z^n~1~tM0%m?}&mIO-3bwuyVsd7RHh&lHP6kGTV$v24Pt<^8#o-%iu5`ayC*(4^x^+ zP5Vj*!euqd>L`&YsBaT!S%UduK7VR7biM99rdFqo=sxlBi+^?Xeirc)s%PpQIQ0Ad7a;m#f!L1}KQ8WR$? zCGD&I%xMd*`6Kdp?@TrW`|0kbA9 zC3ro$;s++=f{c7A2dhR}CG{6}UsM^?4X7Yzm%3+>JbMM|6)b|Q-HAu_3Y$;c+oWAwE zJ>Ln(XWtAgC($<-1#(kq8rE{azU_-tr-o%){CR9WdCh34^p@-J7T0Azq#ugOt85P0 z6li@TGUN}yh%A+}jJYQ^Me^$LPg97K9s5G?Ipkk)}8rx zjc`_b<}9Fx3+%VaIAAsG9Oek)?Ei3i>s=$Lr1rnT$v+EE!7yXr78VeNFmd4?X{Qeu zzI1v!u=w2}e!UMjC-kW8i0Q;UDe+^DjGOSmB+VdfMGGV{P;QJQC=2Sr+%IBmgVz(z zpot-psuy>~id8KQeT%|_54mS>m|b35fW5+Orf-AoquT2Escb$blz_zH`!E|RZhiBbcObl@QTB2KXzHVLVkMca%7_HnCtu+Ema-N?B zc@Z5=Q?YY=nFO|&Wadpz;?UOb;orr_mvsTHIEE#A&zl)=7kN)f;&bjgL8h=-1gr@( zinJUqXFiMx+rBK0Ccm5Rt}Tm*j#iORIYtp1^rIG5sBUT!hkmC0D>}^)!WPoo$H77H za-(x#nqW|0IxA26sDu=u!n*nCVrL>-q9EX}L(+^Uh^d4?pZx>DGwZ4C8a#s3w;oKN z6Q#Jhl4aIGP!y2nG`d1Qwl)+>#_?wV%R<83ek#I={_j|BtLS{%`ia^5Rd|2Wl%4V_ zy*T|AYvfmR`K&>N1XB9dDAJpiiu}2GI1nkyFhqxUl!KXmFyY%e)A|aR3??si13Wg0 zRUKXOzI-T@dflc=A-pG>GT{6!GaW=ZU>bCoh6Ps~t(UD9<(!y03T{!9Y=j;kLW|+y z&16(0IEW!kc#L1Q_2R|1K{tA7B>D(=`;}(7HuAR2Ega4A-$Gy^#4eor;M_A!6_&NSi#yz=U|aJJQH zcQDu|Kr3qluuSPf@mfju{c;B=3LPFD(KDg)+R$L%kCWSqug2DE|*qXU}}ZYs?LmhbUwm<@G2}hE~T+Bgo+|AXsJhrK`Lt-3-Zkf zHR}&H2SOQgTr3PB($*Vpf0P1wqBI=Q(y#A>kVl zR(PdZr1btEkB%8cZ?PND;oJ&n--_B+L!&2+r4uD*v$inw2Na3;Pf-U9jYR(1_)V zfl|uS$DW)YGsDSmwiyMi3?L@fW1+b8CJ^wErEcxZ(wuj5Md4! z*I-(ciYTUhHAA8jU$49zerpr#$ye+3)|}C1;?Jivduwy@J zKP`8Jq0rfY;OPcqX6X*flIMTxOFb^%))w&jyFn>0b8)4$Sp9jYh4PacY1}bTseZ<2 z-b=(F6coQ!lFh5asWk^|7h${DS(fP%&eV!d` zHXJ=SXU~=84^WuO#tC}$zu|beT#vK^8jm9z0??g^GRfCX<3pyqH>b(-s8}Y zi|%JG3_Qc$O&TKG`U4k7%dqEOG!ra8{*lN@#>uKiDNwSBo^)VurF*dPBiK?qrJe(g zxtD+qJ2F`*|Mv!$_*0ybnH$oJVaYpS)9L?V&iz&dS9R0I?(L`*z3dU!VUI!q!8i1c1{#pSgayX zBvaE43S#%zS&47Q*Q7evM8H#41GDoT0h*-gb`z|*kYq|7RCiP-g3%A4m57dnP6C(J zh_VHgTBg=t-yo{iU5@cVPFwuKT?$iXiC124Th4uGDG<(INjzaZ*XXv$9Qe{whufi9;J_3qk#HQ!E@n1>BcNGsPc+=Ya1zXL+8Gr@DH1q$$G?>183$ap)? zHR5OSH+~TR3zfb&T7}~VM?iU|uK6wK0�SZyy65BK#M>(Jw6!Cd>!XqsL~!K57k6 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�1qe>R3p)sY9#77?XszFCE_7GeAdm_6T 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 ZPEo|`#H9dH3SnL~uVOf{7b^KWAkr84y^%By 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

clC!@*b5uq5+= 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

Wx(-zJs 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%0A@M{7r}fwO_F)B}}jejK-FQ2LwwH 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 start

  • debug stop
  • + <%}else if(debugging){%> @@ -21,6 +24,7 @@ <%}%>
    @@ -28,7 +32,7 @@ <%}%> - + <%for(var s = 0, slen = statuses.length; s < slen; s += 1){ var status = statuses[s];%> @@ -49,9 +53,9 @@ -<%if(!debugging){%> - <%} else{%> - <%}%> + +socket.removeAllListeners('status-change'); +socket.on('status-change', function(pids, statuses){ + + var table = ''; + + statuses.forEach(function(status){ + + table += '' + status.name + ''; + + pids.forEach(function(pid){ + + table += ''; + + for(var st in status[pid] || {}){ + + table += '
    ' + st + ' : '; + table += JSON.stringify(status[pid][st]); + table += '
    '; + } + + table += '' + }); + + table += ''; + }); + + $('#workersStatusesTable').html(table); +}); + + diff --git a/test/component-status-test.js b/test/component-status-test.js deleted file mode 100644 index e69de29..0000000 diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index 2827d25..c54d563 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -39,9 +39,10 @@ new Cluster({ 'noWorkers': 1, 'createServer': require('http').createServer, 'app': app, - 'port': 8080, - 'monPort': 8082, - 'debugPort': 8083 + 'port': 9090, + 'monPort': 9091, + 'debugPort': 9092, + 'heartbeatInterval': 5000 }) .listen() .then(function(resolve){ From 9f812cb241cb076da7be2ba453cac752b536635f Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 18 Sep 2013 22:01:01 -0700 Subject: [PATCH 028/182] + to enjoy the newly released node-inspector ~0.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 50e19fc..efb747a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "express": "~3.1.0", "socket.io": "~0.9.16", "ejs": "~0.8.4", - "node-inspector": "~0.2.0-beta4", + "node-inspector": "~0.4.0", "nodefly-gcinfo": "~0.0.15", "bignumber.js": "~1.1.1" }, From 8706778bfd642e70775f43091b5539799cc94137 Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 19 Sep 2013 01:33:56 -0700 Subject: [PATCH 029/182] + allow saveLiveEdit to be an option, will help in dev --- lib/ecv.js | 20 +++++++++++--------- lib/index.js | 11 +++++++++-- lib/master.js | 20 ++++++++++++++++---- lib/worker.js | 2 ++ test/lib/cluster-test.js | 10 ++++------ 5 files changed, 42 insertions(+), 21 deletions(-) diff --git a/lib/ecv.js b/lib/ecv.js index c3f8942..bbe17af 100644 --- a/lib/ecv.js +++ b/lib/ecv.js @@ -7,11 +7,12 @@ //monitor mode requires a monitor url, a validator which allows ecv to issue request and let validator checks and decide if the ecv should be positive or negative //controled mode is simply an on/off switch based on 2 more url routes (enable/disable) var request = require('request'), - assert = require('assert'); + assert = require('assert'), + _ = require('underscore'); var logger = process.getLogger(__filename); -exports.enable = function enable(app, options){ +exports.enable = _.once(function enable(app, options){ var mode = options.mode, root = options.root, @@ -25,19 +26,20 @@ exports.enable = function enable(app, options){ assert.ok(mode); assert.ok(root); - logger.info('ecv enabled in the mode:%s', mode); + logger.info('[ecv] enabled in the mode:%s', mode); if('monitor' === mode){ var monitor = options.monitor, validator = options.validator || function(err, res, body){ - return res.statusCode < 300; + return res.statusCode < 400; }; app.use(function(req, res, next){ if(req.url !== root){ + next(); } else{ @@ -60,12 +62,12 @@ exports.enable = function enable(app, options){ if(message.command === 'disable'){ disabled = true; - logger.info('ecv disabled'); + logger.info('[ecv] traffic disabled'); } else if(message.command === 'enable'){ disabled = false; - logger.info('ecv enabled'); + logger.info('[ecv] traffic enabled'); } }); @@ -75,13 +77,13 @@ exports.enable = function enable(app, options){ disabled = true; emitter.emit('markDown', ['master']); - logger.info('ecv disabled'); + logger.info('[ecv] traffic disabled'); } else if(req.url === markUp){ disabled = false; emitter.emit('markUp', ['master']); - logger.info('ecv enabled'); + logger.info('[ecv] traffic enabled'); } else if(req.url !== root){ @@ -93,4 +95,4 @@ exports.enable = function enable(app, options){ } }); } -}; +}); diff --git a/lib/index.js b/lib/index.js index f87309f..6bc9ea7 100644 --- a/lib/index.js +++ b/lib/index.js @@ -49,7 +49,12 @@ var Cluster = exports.Cluster = function Cluster(options) { }, 'markOld': null, //should be a function determine if worker is old or not 'stopTimeout': 60000,//1 min - 'debugPort': 8082, + 'debug': { + 'webPort': 8082, + 'debugPort': 5858, + 'saveLiveEdit': false, + 'hidden':[] + }, 'ecv': { 'root': '/ecv', 'mode': 'control', @@ -60,7 +65,9 @@ var Cluster = exports.Cluster = function Cluster(options) { } }; - _.extend(this.options, options); + _.extend(this.options.ecv, options.ecv || {}); + _.extend(this.options.debug, options.debug || {}); + _.extend(this.options, _.omit(options, 'ecv', 'debug')); assert.ok(this.options.monCreateServer); assert.ok(this.options.monApp); diff --git a/lib/master.js b/lib/master.js index 7b9cd95..e09dbce 100644 --- a/lib/master.js +++ b/lib/master.js @@ -293,7 +293,10 @@ Master.prototype.initialize = function(proc, options){ }, 'dyingQueue': null,//a chain of old workers to be collected, it's a FIFO, which guarantees that no more than one old worker will be collected at any time. 'stopTimeout': options.stopTimeout, - 'debugPort': options.debugPort, + 'debug.debugPort': options.debug.debugPort, + 'debug.webPort': options.debug.webPort, + 'debug.saveLiveEdit': options.debug.saveLiveEdit, + 'debug.hidden': options.debug.hidden || [], 'options': options, 'slaves': { @@ -342,7 +345,8 @@ Master.prototype.initialize = function(proc, options){ 'createServer': manager.createServer, 'app': manager.app, 'port': manager.port, - 'warmUp': manager.afterServerStarted + 'warmUp': manager.afterServerStarted, + 'debug': false }); return new Worker(proc, options); @@ -385,6 +389,7 @@ Master.prototype.listen = function(){ return (wait > 0 ? timeout(_this.timeout, deferred.promise) : deferred.promise) .then(function(resolve){ + _this.logger.info('[master] warmUp'); warmUp(); return resolve; }); @@ -447,8 +452,15 @@ Master.prototype.debug = function debug(pid){ ready.then(function(){//must wait for the signal to be sent, and child process ready to accept connection on 5858 - _this.logger.info('[debug] starting node-inspector at:%s', inspectorPath); - var inspector = execFile(inspectorPath, ['--web-port=' + _this.debugPort]), + var inspectorArgs = [ + '--web-port=' + _this['debug.webPort'], //where node-inspector process listens to users' request from v8 + '--debug-port=' + _this['debug.debugPort'], //where node-inspector process subscribes to debugging app process + '--save-live-edit=' + _this['debug.saveLiveEdit'], //whether or not user could modify the debugging source and save it + '--hidden=' + _this['debug.hidden']//files excluded from adding breakpoints + ]; + _this.logger.info('[debug] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); + + var inspector = execFile(inspectorPath, inspectorArgs), buff = ''; inspector.stdout.on('data', function onData(data){ diff --git a/lib/worker.js b/lib/worker.js index 78a96fa..ac7c9b6 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -115,6 +115,8 @@ Worker.prototype.listen = function(){ return (wait > 0 ? timeout(_this.timeout, deferred.promise) : deferred.promise) .then(function(resolve){ + _this.logger.info('[worker] %d warming up', process.pid); + warmUp(); _this.emitter.emit(util.format('worker-%d-warmup'), ['master']); diff --git a/test/lib/cluster-test.js b/test/lib/cluster-test.js index c54d563..1f4e50d 100644 --- a/test/lib/cluster-test.js +++ b/test/lib/cluster-test.js @@ -41,7 +41,10 @@ new Cluster({ 'app': app, 'port': 9090, 'monPort': 9091, - 'debugPort': 9092, + 'debug': { + 'webPort': 9092, + 'saveLiveEdit': true + }, 'heartbeatInterval': 5000 }) .listen() @@ -49,10 +52,5 @@ new Cluster({ var masterOrWorker = resolve.master || resolve.worker; - masterOrWorker.useCache().then(function(usr){ - - usr.set('init', Date.now()); - }); - masterOrWorker.status.register('worker', process.pid); }); From bba58749219734dcb8f3a556bacd0c7f092b8706 Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 19 Sep 2013 23:51:58 -0700 Subject: [PATCH 030/182] + tests for ECV started --- .../cluster-demo.js | 4 +- lib/ecv.js | 2 +- lib/master.js | 15 ++- lib/utils.js | 14 +-- package.json | 7 +- test/lib/cache-test.js | 27 ----- test/lib/ecv-test.js | 106 ++++++++++++++++++ 7 files changed, 133 insertions(+), 42 deletions(-) rename test/lib/cluster-test.js => examples/cluster-demo.js (91%) delete mode 100644 test/lib/cache-test.js create mode 100644 test/lib/ecv-test.js diff --git a/test/lib/cluster-test.js b/examples/cluster-demo.js similarity index 91% rename from test/lib/cluster-test.js rename to examples/cluster-demo.js index 1f4e50d..23d9c38 100644 --- a/test/lib/cluster-test.js +++ b/examples/cluster-demo.js @@ -1,13 +1,13 @@ 'use strict'; -var Cluster = require('../../lib/index.js').Cluster, +var Cluster = require('../lib/index.js').Cluster, util = require('util'), express = require('express'), app = express(); app.get('/', function(req, res){ - require('../../lib/cache-usr.js').user() + require('../lib/cache-usr.js').user() .then(function(usr){ var key = req.query.key, diff --git a/lib/ecv.js b/lib/ecv.js index bbe17af..7c44341 100644 --- a/lib/ecv.js +++ b/lib/ecv.js @@ -91,7 +91,7 @@ exports.enable = _.once(function enable(app, options){ } else{ //just to tell if ecv is on/off - (disabled ? positive : negative)(req, res); + (disabled ? negative : positive)(req, res); } }); } diff --git a/lib/master.js b/lib/master.js index e09dbce..9b09649 100644 --- a/lib/master.js +++ b/lib/master.js @@ -333,8 +333,19 @@ Master.prototype.initialize = function(proc, options){ assert.ok(_this.app); assert.ok(_this.port); - exitIfBusyPort('localhost', _this.port); - exitIfBusyPort('localhost', _this.monPort); + when.all([ + exitIfBusyPort('localhost', _this.port), + exitIfBusyPort('localhost', _this.monPort), + exitIfBusyPort('localhost', _this['debug.debugPort']), + exitIfBusyPort('localhost', _this['debug.webPort']) + ]) + .otherwise(function(){ + + _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port', + [_this.port, _this.monPort, _this['debug.debugPort'], _this['debug.webPort']]); + + process.exit(-1); + }); return _this; } diff --git a/lib/utils.js b/lib/utils.js index 0093c0a..d477f90 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -7,22 +7,20 @@ var net = require('net'), path = require('path'), util = require('util'); -exports.exitIfBusyPort = function exitIfBusyPort(host, port) { +exports.exitIfBusyPort = function exitIfBusyPort(host, port){ var deferred = when.defer(), server = net.createServer(); - server.once('error', function (e) { - if(e.code === 'EADDRINUSE') { - console.trace('Port is use ..' + port); - deferred.resolved(true) + server.once('error', function(e){ + if(e.code === 'EADDRINUSE'){ + deferred.reject(new Error('Port is use ..' + port)); } }); - server.listen(port, host, function() { //'listening' listener - + server.listen(port, host, function(){ //'listening' listener server.close(); - deferred.resolve(false); + deferred.resolve(port); }); return timeout(3000, deferred.promise); diff --git a/package.json b/package.json index efb747a..f54ad21 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,10 @@ }, "scripts": { "prestart": "rm -rf ./log; mkdir log", - "start": "node ./test/lib/cluster-test.js" + "start": "node ./examples/cluster-demo.js", + "test": "./node_modules/mocha/bin/mocha ./test/*" }, - "optionalDependencies": {} + "optionalDependencies": { + + } } diff --git a/test/lib/cache-test.js b/test/lib/cache-test.js deleted file mode 100644 index e555b5d..0000000 --- a/test/lib/cache-test.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -var promiseOfUsr = require('../../lib/cache-usr.js').user(process.env['domain']), - when = require('when'), - should = require('should'); - -var counter = 0; - -promiseOfUsr.then(function(usr){ - - for(var i = 0; i < 10000; i += 1){ - - usr.get('k2', function(){ - return 'v2'; - }) - .then(function(v){ - //should be v2 - v.should.equal('v2'); - counter += 1; - }); - } -}); - -setTimeout(function(){ - console.log('test got:' + counter); - process.exit(0); -}, 3000); \ No newline at end of file diff --git a/test/lib/ecv-test.js b/test/lib/ecv-test.js new file mode 100644 index 0000000..2bfff32 --- /dev/null +++ b/test/lib/ecv-test.js @@ -0,0 +1,106 @@ +var should = require('should'), + express = require('express'), + request = require('request'), + http = require('http'), + when = require('when'), + _ = require('underscore'), + EventEmitter = require('events').EventEmitter, + getLogger = require('../../lib/utils.js').getLogger, + exitIfBusyPort = require('../../lib/utils.js').exitIfBusyPort; + +function knock(port, path, assertions){ + + var deferred = when.defer(); + + request.get('http://127.0.0.1:' + port + path, function(error, response, body){ + + try{ + assertions(error, response, body); + deferred.resolve(null); + } + catch(e){ + deferred.reject(e); + } + }); + + return deferred.promise; +} + +describe('ecv', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#enable', function(){ + + it('should support control mode', function(done){ + + var ecv = require('../../lib/ecv.js'), + app = express(), + server = http.createServer(app), + emitter = new EventEmitter(), + positive = function(req, res){ + res.send('postive', 200); + }, + negative = function(req, res){ + res.send('negative', 500); + }; + + ecv.enable(app, { + 'root': '/ecv', + 'markUp': '/ecv/markUp', + 'markDown': '/ecv/markDown', + 'mode': 'control', + 'disabled': true, + 'emitter': emitter + }); + + when.any(_.map(_.range(8000, 9000), function(port){ + return exitIfBusyPort('localhost', port); + })) + .then(function(port){ + + server.listen(port, function(){ + //server started; + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//yet markUp + }) + .then(function(){ + + emitter.emit('warning', {'command':'enable'}); + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(200);//should have been marked up + }) + .then(function(){ + + emitter.emit('warning', {'command':'disable'}); + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//marked down again + }) + .then(done, done); + + }, done); + }, done); + }); + }, + function(){ + done(new Error('no port available in [8000, 9000]')); + }); + }); + }); +}); \ No newline at end of file From 47cfa1d37e460200be34285ef8ad0328ca261f5d Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 20 Sep 2013 00:04:19 -0700 Subject: [PATCH 031/182] + renamed exitIfBusyPort to rejectIfPortBusy to align with the promise's intent --- lib/master.js | 12 ++++++------ lib/monitor.js | 0 lib/process.js | 0 lib/utils.js | 2 +- test/lib/ecv-test.js | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 lib/monitor.js delete mode 100644 lib/process.js diff --git a/lib/master.js b/lib/master.js index 9b09649..3509409 100644 --- a/lib/master.js +++ b/lib/master.js @@ -7,7 +7,7 @@ var _ = require('underscore'), execFile = require('child_process').execFile, BigNumber = require('bignumber.js'), Worker = require('./worker.js').Worker, - exitIfBusyPort = require('./utils.js').exitIfBusyPort, + rejectIfPortBusy = require('./utils.js').rejectIfPortBusy, writePid = require('./utils.js').writePid, getNodeInspectorPath = require('./utils.js').getNodeInspectorPath, enable = require('./ecv.js').enable; @@ -334,16 +334,16 @@ Master.prototype.initialize = function(proc, options){ assert.ok(_this.port); when.all([ - exitIfBusyPort('localhost', _this.port), - exitIfBusyPort('localhost', _this.monPort), - exitIfBusyPort('localhost', _this['debug.debugPort']), - exitIfBusyPort('localhost', _this['debug.webPort']) + rejectIfPortBusy('localhost', _this.port), + rejectIfPortBusy('localhost', _this.monPort), + rejectIfPortBusy('localhost', _this['debug.debugPort']), + rejectIfPortBusy('localhost', _this['debug.webPort']) ]) .otherwise(function(){ _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port', [_this.port, _this.monPort, _this['debug.debugPort'], _this['debug.webPort']]); - + process.exit(-1); }); diff --git a/lib/monitor.js b/lib/monitor.js deleted file mode 100644 index e69de29..0000000 diff --git a/lib/process.js b/lib/process.js deleted file mode 100644 index e69de29..0000000 diff --git a/lib/utils.js b/lib/utils.js index d477f90..3152a9f 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -7,7 +7,7 @@ var net = require('net'), path = require('path'), util = require('util'); -exports.exitIfBusyPort = function exitIfBusyPort(host, port){ +exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ var deferred = when.defer(), server = net.createServer(); diff --git a/test/lib/ecv-test.js b/test/lib/ecv-test.js index 2bfff32..f1177e4 100644 --- a/test/lib/ecv-test.js +++ b/test/lib/ecv-test.js @@ -6,7 +6,7 @@ var should = require('should'), _ = require('underscore'), EventEmitter = require('events').EventEmitter, getLogger = require('../../lib/utils.js').getLogger, - exitIfBusyPort = require('../../lib/utils.js').exitIfBusyPort; + rejectIfPortBusy = require('../../lib/utils.js').rejectIfPortBusy; function knock(port, path, assertions){ @@ -59,7 +59,7 @@ describe('ecv', function(){ }); when.any(_.map(_.range(8000, 9000), function(port){ - return exitIfBusyPort('localhost', port); + return rejectIfPortBusy('localhost', port); })) .then(function(port){ From 04f6a0224fea3b6b4769ee5496d8077cc5956c8b Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 20 Sep 2013 01:00:06 -0700 Subject: [PATCH 032/182] + finished 'control' mode ecv unit test + fixed port occupancy assertion --- lib/ecv.js | 25 +++++----- lib/utils.js | 32 +++++++++---- test/lib/ecv-test.js | 107 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 136 insertions(+), 28 deletions(-) diff --git a/lib/ecv.js b/lib/ecv.js index 7c44341..67ad28a 100644 --- a/lib/ecv.js +++ b/lib/ecv.js @@ -7,12 +7,11 @@ //monitor mode requires a monitor url, a validator which allows ecv to issue request and let validator checks and decide if the ecv should be positive or negative //controled mode is simply an on/off switch based on 2 more url routes (enable/disable) var request = require('request'), - assert = require('assert'), - _ = require('underscore'); + assert = require('assert'); var logger = process.getLogger(__filename); -exports.enable = _.once(function enable(app, options){ +exports.enable = function enable(app, options){ var mode = options.mode, root = options.root, @@ -52,21 +51,21 @@ exports.enable = _.once(function enable(app, options){ } else if('control' === mode){ - var disabled = options.disabled, - emitter = options.emitter, + var emitter = options.emitter, markUp = options.markUp, markDown = options.markDown; + app.ecv = {'disabled': options.disabled}; emitter.on('warning', function(message){ if(message.command === 'disable'){ - disabled = true; + app.ecv.disabled = true; logger.info('[ecv] traffic disabled'); } else if(message.command === 'enable'){ - disabled = false; + app.ecv.disabled = false; logger.info('[ecv] traffic enabled'); } }); @@ -75,15 +74,19 @@ exports.enable = _.once(function enable(app, options){ if(req.url === markDown){ - disabled = true; + app.ecv.disabled = true; emitter.emit('markDown', ['master']); logger.info('[ecv] traffic disabled'); + + negative(req, res); } else if(req.url === markUp){ - disabled = false; + app.ecv.disabled = false; emitter.emit('markUp', ['master']); logger.info('[ecv] traffic enabled'); + + positive(req, res); } else if(req.url !== root){ @@ -91,8 +94,8 @@ exports.enable = _.once(function enable(app, options){ } else{ //just to tell if ecv is on/off - (disabled ? negative : positive)(req, res); + (app.ecv.disabled ? negative : positive)(req, res); } }); } -}); +} diff --git a/lib/utils.js b/lib/utils.js index 3152a9f..fb10e3c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -10,17 +10,33 @@ var net = require('net'), exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ var deferred = when.defer(), + socket = new net.Socket(), server = net.createServer(); - server.once('error', function(e){ - if(e.code === 'EADDRINUSE'){ - deferred.reject(new Error('Port is use ..' + port)); - } - }); + socket.once('error', function(err) { + + socket.end(); + socket.destroy(); + + server.once('error', function(e){ + if(e.code === 'EADDRINUSE'){ + deferred.reject(new Error('Port is use ..' + port)); + } + }); + + server.listen(port, host, function(){ //'listening' listener + + server.close(); + deferred.resolve(port); + }); + }); + + socket.connect(port, host, function() { - server.listen(port, host, function(){ //'listening' listener - server.close(); - deferred.resolve(port); + socket.end(); + socket.destroy(); + + deferred.reject(new Error('Port is use ..' + port)); }); return timeout(3000, deferred.promise); diff --git a/test/lib/ecv-test.js b/test/lib/ecv-test.js index f1177e4..f5c48b6 100644 --- a/test/lib/ecv-test.js +++ b/test/lib/ecv-test.js @@ -3,6 +3,7 @@ var should = require('should'), request = require('request'), http = require('http'), when = require('when'), + timeout = require('when/timeout'), _ = require('underscore'), EventEmitter = require('events').EventEmitter, getLogger = require('../../lib/utils.js').getLogger, @@ -14,6 +15,7 @@ function knock(port, path, assertions){ request.get('http://127.0.0.1:' + port + path, function(error, response, body){ + assertions = assertions || function(){}; try{ assertions(error, response, body); deferred.resolve(null); @@ -36,7 +38,9 @@ describe('ecv', function(){ describe('#enable', function(){ - it('should support control mode', function(done){ + it('should support control mode via emitter', function(done){ + + this.timeout(3000); var ecv = require('../../lib/ecv.js'), app = express(), @@ -92,15 +96,100 @@ describe('ecv', function(){ response.should.be.ok; response.statusCode.should.equal(500);//marked down again }) - .then(done, done); + .then(done, done);//fail due to ecv check incorrect after markdown + + }, done);//fail due to ecv check incorrect after markup + + }, done);//fail due to initial ecv check failed - }, done); - }, done); }); - }, - function(){ - done(new Error('no port available in [8000, 9000]')); - }); + + }, done);//fail due to ports rejected + }); + + it('should support control mode via urls', function(done){ + + this.timeout(5000); + + var ecv = require('../../lib/ecv.js'), + app = express(), + server = http.createServer(app), + emitter = new EventEmitter(), + positive = function(req, res){ + res.send('postive', 200); + }, + negative = function(req, res){ + res.send('negative', 500); + }; + + ecv.enable(app, { + 'root': '/ecv', + 'markUp': '/ecv/markUp', + 'markDown': '/ecv/markDown', + 'mode': 'control', + 'disabled': true, + 'emitter': emitter + }); + + when.any(_.map(_.range(8000, 9000), function(port){ + return rejectIfPortBusy('localhost', port); + })) + .then(function(port){ + + server.listen(port, function(){ + //server started; + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//yet markUp + }) + .then(function(){ + + var expectMarkUpAlert = when.defer(); + + emitter.once('markUp', function(target){ + expectMarkUpAlert.resolve(target); + }); + + when.join(knock(port, '/ecv/markUp'), timeout(1000, expectMarkUpAlert.promise)).then(function(){ + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(200);//should have been marked up + }) + .then(function(){ + + var expectMarkDownAlert = when.defer(); + + emitter.once('markDown', function(target){ + expectMarkDownAlert.resolve(target); + }); + + when.join(knock(port, '/ecv/markDown'), timeout(1000, expectMarkDownAlert.promise)).then(function(){ + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//marked down again + }) + .then(done, done); //fail due to incorrect ecv after mark down + + }, done); //fail due to either mark down rejected or mark down status change event not received + + }, done); //fail due to incorrect ecv after mark up + + }, done); //fail due to either mark up rejected or mark up status change event not received + + }, done); //fail due to initial ecv check failed + + }); + + }, done); //fail due to all ports rejected }); }); -}); \ No newline at end of file +}); From dc991b4448d304c7ceb41e312da8e5c5ebc4ed7d Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 20 Sep 2013 11:46:14 -0700 Subject: [PATCH 033/182] + pickAvailablePort to utils.js + ecv test for mode 'monitor' --- lib/ecv.js | 16 ++-- lib/utils.js | 10 ++- test/lib/ecv-test.js | 199 +++++++++++++++++++++++++------------------ 3 files changed, 135 insertions(+), 90 deletions(-) diff --git a/lib/ecv.js b/lib/ecv.js index 67ad28a..4cbdd34 100644 --- a/lib/ecv.js +++ b/lib/ecv.js @@ -13,7 +13,7 @@ var logger = process.getLogger(__filename); exports.enable = function enable(app, options){ - var mode = options.mode, + var mode = options.mode || 'control', //default is control + disabled === false, therefore, ecv is mark up root = options.root, positive = options.positive || function(req, res){ res.send(200); @@ -22,19 +22,20 @@ exports.enable = function enable(app, options){ res.send(500); }; - assert.ok(mode); assert.ok(root); logger.info('[ecv] enabled in the mode:%s', mode); if('monitor' === mode){ - var monitor = options.monitor, - validator = options.validator || function(err, res, body){ + var monitor = options.monitor, //monitor must be given, and it's expected in full url format + validator = options.validator || function(error, response, body){ - return res.statusCode < 400; + return !error && response.statusCode < 400; }; + assert.ok(monitor); + app.use(function(req, res, next){ if(req.url !== root){ @@ -42,9 +43,9 @@ exports.enable = function enable(app, options){ next(); } else{ - request.get(monitor, function(err, res, body){ + request.get(monitor, function(error, response, body){ - (validator(err, res, body) ? positive : negative)(req, res); + (validator(error, response, body) ? positive : negative)(req, res); }); } }); @@ -56,6 +57,7 @@ exports.enable = function enable(app, options){ markDown = options.markDown; app.ecv = {'disabled': options.disabled}; + emitter.on('warning', function(message){ if(message.command === 'disable'){ diff --git a/lib/utils.js b/lib/utils.js index fb10e3c..ec8c842 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -5,7 +5,8 @@ var net = require('net'), winston = require('winston'), fs = require('graceful-fs'), path = require('path'), - util = require('util'); + util = require('util'), + _ = require('underscore'); exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ @@ -42,6 +43,13 @@ exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ return timeout(3000, deferred.promise); }; +exports.pickAvailablePort = function pickAvailablePort(min, max){ + + return when.any(_.map(_.range(min, max), function(port){ + return exports.rejectIfPortBusy('localhost', port); + })); +}; + exports.ensureDir = function ensureDir(dir, clean) { try { fs.readdirSync(dir); diff --git a/test/lib/ecv-test.js b/test/lib/ecv-test.js index f5c48b6..1cb6614 100644 --- a/test/lib/ecv-test.js +++ b/test/lib/ecv-test.js @@ -7,7 +7,7 @@ var should = require('should'), _ = require('underscore'), EventEmitter = require('events').EventEmitter, getLogger = require('../../lib/utils.js').getLogger, - rejectIfPortBusy = require('../../lib/utils.js').rejectIfPortBusy; + pickAvailablePort = require('../../lib/utils.js').pickAvailablePort; function knock(port, path, assertions){ @@ -45,13 +45,7 @@ describe('ecv', function(){ var ecv = require('../../lib/ecv.js'), app = express(), server = http.createServer(app), - emitter = new EventEmitter(), - positive = function(req, res){ - res.send('postive', 200); - }, - negative = function(req, res){ - res.send('negative', 500); - }; + emitter = new EventEmitter(); ecv.enable(app, { 'root': '/ecv', @@ -62,49 +56,46 @@ describe('ecv', function(){ 'emitter': emitter }); - when.any(_.map(_.range(8000, 9000), function(port){ - return rejectIfPortBusy('localhost', port); - })) - .then(function(port){ + pickAvailablePort(8000, 9000).then(function(port){ - server.listen(port, function(){ - //server started; + server.listen(port, function(){ + //server started; - knock(port, '/ecv', function(error, response, body){ + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//yet markUp + }) + .then(function(){ + + emitter.emit('warning', {'command':'enable'}); + knock(port, '/ecv', function(error, response, body){ + should.not.exist(error); response.should.be.ok; - response.statusCode.should.equal(500);//yet markUp + response.statusCode.should.equal(200);//should have been marked up }) .then(function(){ - emitter.emit('warning', {'command':'enable'}); + emitter.emit('warning', {'command':'disable'}); knock(port, '/ecv', function(error, response, body){ - + should.not.exist(error); response.should.be.ok; - response.statusCode.should.equal(200);//should have been marked up + response.statusCode.should.equal(500);//marked down again }) - .then(function(){ - - emitter.emit('warning', {'command':'disable'}); + .then(done, done);//fail due to ecv check incorrect after markdown - knock(port, '/ecv', function(error, response, body){ + }, done);//fail due to ecv check incorrect after markup - should.not.exist(error); - response.should.be.ok; - response.statusCode.should.equal(500);//marked down again - }) - .then(done, done);//fail due to ecv check incorrect after markdown + }, done);//fail due to initial ecv check failed - }, done);//fail due to ecv check incorrect after markup + }); - }, done);//fail due to initial ecv check failed - - }); - - }, done);//fail due to ports rejected + }, done);//fail due to ports rejected }); it('should support control mode via urls', function(done){ @@ -114,13 +105,7 @@ describe('ecv', function(){ var ecv = require('../../lib/ecv.js'), app = express(), server = http.createServer(app), - emitter = new EventEmitter(), - positive = function(req, res){ - res.send('postive', 200); - }, - negative = function(req, res){ - res.send('negative', 500); - }; + emitter = new EventEmitter(); ecv.enable(app, { 'root': '/ecv', @@ -131,65 +116,115 @@ describe('ecv', function(){ 'emitter': emitter }); - when.any(_.map(_.range(8000, 9000), function(port){ - return rejectIfPortBusy('localhost', port); - })) - .then(function(port){ + pickAvailablePort(8000, 9000).then(function(port){ - server.listen(port, function(){ - //server started; + server.listen(port, function(){ + //server started; - knock(port, '/ecv', function(error, response, body){ + knock(port, '/ecv', function(error, response, body){ - should.not.exist(error); - response.should.be.ok; - response.statusCode.should.equal(500);//yet markUp - }) - .then(function(){ + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//yet markUp + }) + .then(function(){ + + var expectMarkUpAlert = when.defer(); + + emitter.once('markUp', function(target){ + expectMarkUpAlert.resolve(target); + }); + + when.join(knock(port, '/ecv/markUp'), timeout(1000, expectMarkUpAlert.promise)).then(function(){ + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(200);//should have been marked up + }) + .then(function(){ - var expectMarkUpAlert = when.defer(); + var expectMarkDownAlert = when.defer(); - emitter.once('markUp', function(target){ - expectMarkUpAlert.resolve(target); - }); + emitter.once('markDown', function(target){ + expectMarkDownAlert.resolve(target); + }); - when.join(knock(port, '/ecv/markUp'), timeout(1000, expectMarkUpAlert.promise)).then(function(){ + when.join(knock(port, '/ecv/markDown'), timeout(1000, expectMarkDownAlert.promise)).then(function(){ - knock(port, '/ecv', function(error, response, body){ - - should.not.exist(error); - response.should.be.ok; - response.statusCode.should.equal(200);//should have been marked up - }) - .then(function(){ + knock(port, '/ecv', function(error, response, body){ - var expectMarkDownAlert = when.defer(); + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//marked down again + }) + .then(done, done); //fail due to incorrect ecv after mark down - emitter.once('markDown', function(target){ - expectMarkDownAlert.resolve(target); - }); + }, done); //fail due to either mark down rejected or mark down status change event not received - when.join(knock(port, '/ecv/markDown'), timeout(1000, expectMarkDownAlert.promise)).then(function(){ + }, done); //fail due to incorrect ecv after mark up - knock(port, '/ecv', function(error, response, body){ + }, done); //fail due to either mark up rejected or mark up status change event not received - should.not.exist(error); - response.should.be.ok; - response.statusCode.should.equal(500);//marked down again - }) - .then(done, done); //fail due to incorrect ecv after mark down + }, done); //fail due to initial ecv check failed + + }); + + }, done); //fail due to all ports rejected + }); - }, done); //fail due to either mark down rejected or mark down status change event not received + it('should support monitor with any validator', function(done){ - }, done); //fail due to incorrect ecv after mark up + this.timeout(3000); + + var ecv = require('../../lib/ecv.js'), + app = express(), + server = http.createServer(app), + emitter = new EventEmitter(), + disabled = false; - }, done); //fail due to either mark up rejected or mark up status change event not received + pickAvailablePort(8000, 9000).then(function(port){ - }, done); //fail due to initial ecv check failed + ecv.enable(app, { + 'root': '/ecv', + 'mode': 'monitor', + 'monitor': 'http://localhost:' + port + '/', + 'validator': function(error, response, body){ + + return !error && response.statusCode === 200; + }, + 'emitter': emitter + }); - }); + app.get('/', function(req, res){ - }, done); //fail due to all ports rejected + res.send(disabled ? 500 : 200); + }); + + server.listen(port, function(){ + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(200); + }) + .then(function(){ + + disabled = true; + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500); + }) + .then(done, done); + + }, done); + }); + }); }); }); }); From 9f46ce31a66519c657b11d859e05bc3a0a8ba592 Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 20 Sep 2013 14:13:07 -0700 Subject: [PATCH 034/182] + unit test for utils, bugfixes of utils.js + debug embedded node-inspector using messaging --- lib/master.js | 40 +++++----- lib/utils.js | 36 +++------ test/lib/utils-test.js | 173 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+), 45 deletions(-) create mode 100644 test/lib/utils-test.js diff --git a/lib/master.js b/lib/master.js index 3509409..b41b318 100644 --- a/lib/master.js +++ b/lib/master.js @@ -4,7 +4,7 @@ var _ = require('underscore'), cluster = require('cluster'), assert = require('assert'), util = require('util'), - execFile = require('child_process').execFile, + fork = require('child_process').fork, BigNumber = require('bignumber.js'), Worker = require('./worker.js').Worker, rejectIfPortBusy = require('./utils.js').rejectIfPortBusy, @@ -333,19 +333,22 @@ Master.prototype.initialize = function(proc, options){ assert.ok(_this.app); assert.ok(_this.port); - when.all([ - rejectIfPortBusy('localhost', _this.port), - rejectIfPortBusy('localhost', _this.monPort), + /*when.all([ + rejectIfPortBusy('localhost', options.port), + rejectIfPortBusy('localhost', options.monPort), rejectIfPortBusy('localhost', _this['debug.debugPort']), rejectIfPortBusy('localhost', _this['debug.webPort']) ]) - .otherwise(function(){ + .then(function(){ + //nothing to do + }, + function(error){ - _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port', - [_this.port, _this.monPort, _this['debug.debugPort'], _this['debug.webPort']]); + _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port; error:%j', + [options.port, options.monPort, _this['debug.debugPort'], _this['debug.webPort'], error]); - process.exit(-1); - }); + process.exit(-1); + });*/ return _this; } @@ -471,19 +474,18 @@ Master.prototype.debug = function debug(pid){ ]; _this.logger.info('[debug] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); - var inspector = execFile(inspectorPath, inspectorArgs), - buff = ''; + //NOTE, this is not _this.fork, but child_process.fork + var inspector = fork(inspectorPath, inspectorArgs, {'silent': true}); + + inspector.on('message', function inspectorListener(msg){ - inspector.stdout.on('data', function onData(data){ + if(msg.event === 'SERVER.LISTENING'){ - buff += data.replace(/[\r\n]+/g, ''); - //test util the inspectorUrl is matched, suggesting that the node-inspector is running - var inspectorUrl = buff.match(/.+(http:\/\/[\d]+\.[\d]+\.[\d]+\.[\d]+:[\d]+\/debug\?port=[\d]+).+/i);; - if(inspectorUrl){ + var inspectorUrl = msg.address.url; + _this.logger.debug('[debug] master got inspector url:%s', inspectorUrl); + _this.emitter.emit('debug-inspector', ['master'], inspectorUrl); - inspector.stdout.removeListener('data', onData); - _this.logger.debug('[debug] master got inspector url:%s', inspectorUrl[1]); - _this.emitter.emit('debug-inspector', ['master'], inspectorUrl[1]); + inspector.removeListener('message', inspectorListener); } }); diff --git a/lib/utils.js b/lib/utils.js index ec8c842..25b05fa 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -52,12 +52,11 @@ exports.pickAvailablePort = function pickAvailablePort(min, max){ exports.ensureDir = function ensureDir(dir, clean) { try { - fs.readdirSync(dir); + var paths = fs.readdirSync(dir); if(clean) { - var paths = fs.readdirSync(dir); paths.forEach(function(filename) { try { - fs.unlink(path.join(dir, filename)); + fs.unlinkSync(path.join(dir, filename)); } catch(e) { @@ -91,9 +90,9 @@ exports.readPids = function readPids(dir) { return _.map(fs.readdirSync(dir), function(filename){ - return fs.readSync(path.join(dir, filename), { + return parseInt(fs.readFileSync(path.join(dir, filename), { 'encoding': 'utf-8' - }); + }), 10); }); }; @@ -102,33 +101,18 @@ exports.readMasterPid = function readMasterPid(dir) { dir = dir || path.join(process.cwd(), '/pids'); exports.ensureDir(dir); - return fs.readSync( - path.join(dir, - _.filter(fs.readdirSync(dir), function(filename){ + return parseInt(fs.readFileSync(path.join(dir, _.filter(fs.readdirSync(dir), function(filename){ return /master\./.test(filename); })[0]), - { - 'encoding': 'utf-8' - }); + { + 'encoding': 'utf-8' + }), + 10); }; exports.getNodeInspectorPath = function getNodeInspectorPath(){ - var here = path.join(__dirname, '..'),//see if it's under cluster's node_modules - find = function(dir){ - - if(fs.existsSync(path.join(dir, './node_modules/node-inspector'))){ - return path.join(dir, './node_modules/node-inspector/bin/inspector.js'); - } - - if(dir === process.cwd()){ - return null; - } - - return find(path.join(dir, '..')); - }; - - return find(here); + return require.resolve('node-inspector/bin/inspector'); }; var fileLoggerTransport = new (winston.transports.File)({ diff --git a/test/lib/utils-test.js b/test/lib/utils-test.js new file mode 100644 index 0000000..d30da1f --- /dev/null +++ b/test/lib/utils-test.js @@ -0,0 +1,173 @@ +var should = require('should'), + utils = require('../../lib/utils.js'), + path = require('path'), + when = require('when'), + fs = require('graceful-fs'), + _ = require('underscore'); + +describe('utils', function(){ + + describe('#ensureDir', function(){ + + it('should mkdir if it does not exist', function(done){ + + this.timeout(1000); + + var ensureDir = utils.ensureDir, + dir = path.join(__dirname, '/ensureDir-' + Date.now()); + + fs.existsSync(dir).should.equal(false); + + ensureDir(dir); + fs.existsSync(dir).should.equal(true); + + ensureDir(dir); + fs.existsSync(dir).should.equal(true); + + var touch = path.join(dir, 'touch.txt'); + + fs.writeFileSync(touch, ''); + fs.existsSync(touch).should.equal(true); + + ensureDir(dir); + fs.existsSync(touch).should.equal(true); + + ensureDir(dir, true); + fs.existsSync(touch).should.equal(false); + + fs.unlink(dir, function(){ + done(); + }); + + }); + + }); + + describe('#writePid', function(){ + + it('should writePid to a given dir', function(done){ + + this.timeout(1000); + + var writePid = utils.writePid, + dir = path.join(__dirname, '/writePid-' + Date.now()), + pid = process.pid; + + writePid(pid, dir); + fs.existsSync(dir).should.equal(true); + + var written = fs.readdirSync(dir); + written.should.be.ok; + + _.some(_.map(written, function(filename){ + + if(/master\.([\d]+)\.pid/.test(filename)){ + //filename matched, further verifyt the pid + var verifyPid = fs.readFileSync(path.join(dir, filename), {'encoding':'utf-8'}); + return verifyPid && parseInt(verifyPid, 10) === pid; + } + else{ + //not matched + return false; + } + + })).should.equal(true); + + done(); + }); + }); + + describe('#readPids', function(){ + + it('should read all pids from a given dir', function(done){ + + this.timeout(1000); + + var writePid = utils.writePid, + readPids = utils.readPids, + dir = path.join(__dirname, '/readPids-' + Date.now()), + pid = process.pid; + + writePid(pid, dir); + fs.existsSync(dir).should.equal(true); + + var pids = readPids(dir); + pids.should.be.ok; + pids.should.include(pid); + + done(); + }); + }); + + describe('#readMasterPid', function(){ + + it('should read master pid from a given dir', function(done){ + + this.timeout(1000); + + var writePid = utils.writePid, + readMasterPid = utils.readMasterPid, + dir = path.join(__dirname, '/readMasterPid-' + Date.now()), + pid = process.pid; + + writePid(pid, dir); + fs.existsSync(dir).should.equal(true); + + var masterPid = readMasterPid(dir); + masterPid.should.be.ok; + masterPid.should.equal(pid); + + done(); + }); + }); + + describe('#getNodeInspectorPath', function(){ + + it('should get the path of node-inspector', function(done){ + + this.timeout(500); + + var nodeInspectorPath = utils.getNodeInspectorPath(); + nodeInspectorPath.should.be.ok; + + var stat = fs.statSync(nodeInspectorPath); + stat.should.be.ok; + stat.isFile().should.equal(true); + + done(); + }); + }); + + after(function(done){ + + var rmPatterns = [ + /ensureDir-[\d]+/, + /writePid-[\d]+/, + /readPids-[\d]+/, + /readMasterPid-[\d]+/ + ]; + + fs.readdir(__dirname, function(err, files){ + + _.each(files, function(f){ + + if(_.some(_.invoke(rmPatterns, 'test', f))){ + + var rm = path.join(__dirname, f), + touches = fs.readdirSync(rm) || []; + + _.each(touches, function(t){ + + fs.unlinkSync(path.join(rm, t)); + }); + + fs.rmdirSync(rm); + } + }); + + done(); + }); + + }); + +}); \ No newline at end of file From b42aa2dd80201412678066c0988c22cf9513ae8c Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 20 Sep 2013 15:01:00 -0700 Subject: [PATCH 035/182] + 'use strict' & fixed octal literal + cluster-emitter-test.js --- lib/cluster-emitter.js | 12 ++++++++ lib/master.js | 2 ++ lib/utils.js | 7 +++-- lib/worker.js | 2 ++ test/lib/cluster-emitter-test.js | 48 ++++++++++++++++++++++++++++++++ test/lib/ecv-test.js | 2 ++ test/lib/utils-test.js | 2 ++ 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 test/lib/cluster-emitter-test.js diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index a350d5e..b0563e9 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -95,6 +95,12 @@ var logger = process.getLogger(__filename), if(_this.handlers[event].length === 0){ process.removeAllListeners(event); } + }, + + 'removeAllListeners': function(event){ + + this.handlers[event] = []; + process.removeAllListeners(event); } }; @@ -153,6 +159,12 @@ var slaveEmitter = { if(_this.handlers[event].length === 0){ process.removeAllListeners(event); } + }, + + 'removeAllListeners': function(event){ + + this.handlers[event] = []; + process.removeAllListeners(event); } }; diff --git a/lib/master.js b/lib/master.js index b41b318..f55be0d 100644 --- a/lib/master.js +++ b/lib/master.js @@ -1,3 +1,5 @@ +'use strict'; + var _ = require('underscore'), when = require('when'), timeout = require('when/timeout'), diff --git a/lib/utils.js b/lib/utils.js index 25b05fa..233e5b2 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,3 +1,5 @@ +'use strict'; + var net = require('net'), when = require('when'), timeout = require('when/timeout'), @@ -6,7 +8,8 @@ var net = require('net'), fs = require('graceful-fs'), path = require('path'), util = require('util'), - _ = require('underscore'); + _ = require('underscore'), + ACCESS = parseInt('0755', 8); exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ @@ -65,7 +68,7 @@ exports.ensureDir = function ensureDir(dir, clean) { } } catch(e) { - fs.mkdirSync(dir, 0755); + fs.mkdirSync(dir, ACCESS); } }; diff --git a/lib/worker.js b/lib/worker.js index ac7c9b6..010a146 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -1,3 +1,5 @@ +'use strict'; + var _ = require('underscore'), when = require('when'), timeout = require('when/timeout'), diff --git a/test/lib/cluster-emitter-test.js b/test/lib/cluster-emitter-test.js new file mode 100644 index 0000000..8e3c598 --- /dev/null +++ b/test/lib/cluster-emitter-test.js @@ -0,0 +1,48 @@ +'use strict'; + +var should = require('should'), + _ = require('underscore'), + getLogger = require('../../lib/utils.js').getLogger; + +describe('cluster-emitter', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('master-emitter', function(){ + + it('should work in none-cluster mode', function(done){ + + this.timeout(500); + + var emitter = require('../../lib/cluster-emitter.js').emitter; + + emitter.should.be.ok; + _.isFunction(emitter.emit).should.equal(true); + _.isFunction(emitter.on).should.equal(true); + _.isFunction(emitter.once).should.equal(true); + _.isFunction(emitter.removeListener).should.equal(true); + _.isFunction(emitter.removeAllListeners).should.equal(true); + + var event = 'event-' + Date.now(), + echo = 'echo-' + event; + + emitter.once(echo, function(){//test once + + done(); + }); + + emitter.on(event, function(){//test on + + emitter.emit(echo); + }); + + emitter.emit(event);//test emit + }); + + }); + +}); \ No newline at end of file diff --git a/test/lib/ecv-test.js b/test/lib/ecv-test.js index 1cb6614..24a4a06 100644 --- a/test/lib/ecv-test.js +++ b/test/lib/ecv-test.js @@ -1,3 +1,5 @@ +'use strict'; + var should = require('should'), express = require('express'), request = require('request'), diff --git a/test/lib/utils-test.js b/test/lib/utils-test.js index d30da1f..74b4b2b 100644 --- a/test/lib/utils-test.js +++ b/test/lib/utils-test.js @@ -1,3 +1,5 @@ +'use strict'; + var should = require('should'), utils = require('../../lib/utils.js'), path = require('path'), From ae84cb5c9560984e64c199fb9b9e03fb21c06352 Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 20 Sep 2013 17:03:26 -0700 Subject: [PATCH 036/182] ~ avoid dup comp registry --- lib/cluster-status.js | 25 +++++++++++++++++-------- test/lib/cluster-emitter-test.js | 10 ++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/cluster-status.js b/lib/cluster-status.js index bedc639..a473eac 100644 --- a/lib/cluster-status.js +++ b/lib/cluster-status.js @@ -17,13 +17,22 @@ exports.status = function(emitter){ emitter.on('new-status', function(name, pid, view, update){ registry[name] = registry[name] || []; - registry[name].push({ - 'pid': pid, - 'view': view, - 'update': update - }); - logger.info('register status: %s from %d, in process: %d', name, pid, process.pid); + if(_.some(registry[name], function(r){ //avoid duplicate component registry + return r.pid === pid; + })){ + + logger.debug('[status] register status ignored due to existing registry'); + } + else{ + registry[name].push({ + 'pid': pid, + 'view': view, + 'update': update + }); + + logger.info('[status] register status: %s from %d, in process: %d', name, pid, process.pid); + } }); emitter.on('del-status', function(name, pid){ @@ -32,7 +41,7 @@ exports.status = function(emitter){ return r.pid !== pid; }); - logger.info('unregister status: %s in process: %d', name, pid); + logger.info('[status] unregister status: %s in process: %d', name, pid); }); cluster.on('disconnect', function(worker){ @@ -47,7 +56,7 @@ exports.status = function(emitter){ }); }); - logger.debug('status auto updated after worker:%j', registry); + logger.debug('[status] auto updated after worker:%j', registry); }); return { diff --git a/test/lib/cluster-emitter-test.js b/test/lib/cluster-emitter-test.js index 8e3c598..7457f69 100644 --- a/test/lib/cluster-emitter-test.js +++ b/test/lib/cluster-emitter-test.js @@ -45,4 +45,14 @@ describe('cluster-emitter', function(){ }); + //now we'll need to verify the test in cluster mode, for master emitter the behavior should be: + //emit is to send the event to both master & all workers (we'll prepare a couple of workers at least 2 just to make sure) + //on/once should listen to events emitted by either master or workers + //removeListener/removeAllListeners should revoke all the listeners triggered above + + //for the slave emitter, the behavior should be: + //emit is to sent the event to both master & the worker itself + //on/once should listen to events emitted from either master or workers + //removeListener/removeAllListeners should revoke all the listeners triggered abovesss + }); \ No newline at end of file From b653a5c8601a312096e75e24bd310c68aa962961 Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 20 Sep 2013 21:55:34 -0700 Subject: [PATCH 037/182] + bugfix of port availability check, use http server to verify confidently --- lib/master.js | 15 ++++----- lib/utils.js | 80 +++++++++++++++++++++++++++----------------- lib/worker.js | 2 +- test/lib/ecv-test.js | 8 ++--- 4 files changed, 61 insertions(+), 44 deletions(-) diff --git a/lib/master.js b/lib/master.js index f55be0d..b750faa 100644 --- a/lib/master.js +++ b/lib/master.js @@ -335,22 +335,19 @@ Master.prototype.initialize = function(proc, options){ assert.ok(_this.app); assert.ok(_this.port); - /*when.all([ + when.all([ rejectIfPortBusy('localhost', options.port), rejectIfPortBusy('localhost', options.monPort), rejectIfPortBusy('localhost', _this['debug.debugPort']), rejectIfPortBusy('localhost', _this['debug.webPort']) ]) - .then(function(){ - //nothing to do - }, - function(error){ + .otherwise(function(error){ - _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port; error:%j', - [options.port, options.monPort, _this['debug.debugPort'], _this['debug.webPort'], error]); + _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port; error:%j', + [options.port, options.monPort, _this['debug.debugPort'], _this['debug.webPort'], error]); - process.exit(-1); - });*/ + process.exit(-1); + }); return _this; } diff --git a/lib/utils.js b/lib/utils.js index 233e5b2..fd881a9 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,6 +1,7 @@ 'use strict'; -var net = require('net'), +var http = require('http'), + request = require('request'), when = require('when'), timeout = require('when/timeout'), cluster = require('cluster'), @@ -14,43 +15,62 @@ var net = require('net'), exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ var deferred = when.defer(), - socket = new net.Socket(), - server = net.createServer(); - - socket.once('error', function(err) { - - socket.end(); - socket.destroy(); - - server.once('error', function(e){ - if(e.code === 'EADDRINUSE'){ - deferred.reject(new Error('Port is use ..' + port)); - } - }); - - server.listen(port, host, function(){ //'listening' listener - - server.close(); - deferred.resolve(port); - }); - }); + server = http.createServer(function(req, res){ + + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.end(port.toString(10)); + }); - socket.connect(port, host, function() { + server.once('error', function(e){ + deferred.reject(new Error('Port is in use:' + port)); + }); - socket.end(); - socket.destroy(); - - deferred.reject(new Error('Port is use ..' + port)); + server.listen(port, host, function(){ //'listening' listener + request.get(util.format('http://%s:%d/', host, port), function(err, response, body){ + //console.log('[utils] url: http://%s:%d/ err:%j response:%j body:%s', host, port, err, response, body); + if(!err && response && response.statusCode === 200 && parseInt(body, 10) === port){ + server.close(function(){ + deferred.resolve(port); + }); + } + else{ + deferred.reject(new Error('Port is in use:' + port)); + } + }); }); - return timeout(3000, deferred.promise); + return timeout(2000, deferred.promise); }; +global.portsAlreadyPicked = []; + exports.pickAvailablePort = function pickAvailablePort(min, max){ - return when.any(_.map(_.range(min, max), function(port){ - return exports.rejectIfPortBusy('localhost', port); - })); + function checkAvailability(deferred, port){ + + if(port > max){ + deferred.reject(new Error('no port available')); + } + else if(_.contains(global.portsAlreadyPicked, port)){ + checkAvailability(deferred, port + 1); + } + else{ + exports.rejectIfPortBusy('localhost', port) + .then(function(port){ + deferred.resolve(port); + global.portsAlreadyPicked.push(port); + }) + .otherwise(function(){ + checkAvailability(deferred, port + 1); + }); + } + } + + var available = when.defer(); + + checkAvailability(available, min); + + return available.promise; }; exports.ensureDir = function ensureDir(dir, clean) { diff --git a/lib/worker.js b/lib/worker.js index 010a146..367cad4 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -78,7 +78,7 @@ Worker.prototype.listen = function(){ var deferred = when.defer(), run = function(){ - server = createServer(app).listen(port, function(){ + var server = createServer(app).listen(port, function(){ server.on('connection', function(conn){ _this.whenConnected(conn); diff --git a/test/lib/ecv-test.js b/test/lib/ecv-test.js index 24a4a06..dfe15e8 100644 --- a/test/lib/ecv-test.js +++ b/test/lib/ecv-test.js @@ -58,7 +58,7 @@ describe('ecv', function(){ 'emitter': emitter }); - pickAvailablePort(8000, 9000).then(function(port){ + pickAvailablePort(8000, 8099).then(function(port){ server.listen(port, function(){ //server started; @@ -118,7 +118,7 @@ describe('ecv', function(){ 'emitter': emitter }); - pickAvailablePort(8000, 9000).then(function(port){ + pickAvailablePort(8000, 8099).then(function(port){ server.listen(port, function(){ //server started; @@ -186,8 +186,8 @@ describe('ecv', function(){ emitter = new EventEmitter(), disabled = false; - pickAvailablePort(8000, 9000).then(function(port){ - + pickAvailablePort(8000, 8099).then(function(port){ + ecv.enable(app, { 'root': '/ecv', 'mode': 'monitor', From c19d48c9d566e99321d8df088e737a1635bc3c7d Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 11:02:16 -0700 Subject: [PATCH 038/182] ~ moved unit tests to /test folder and leave /test/lib to cluster's workers --- test/{lib => }/cluster-emitter-test.js | 4 ++-- test/{lib => }/ecv-test.js | 10 +++++----- test/{lib => }/utils-test.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) rename test/{lib => }/cluster-emitter-test.js (92%) rename test/{lib => }/ecv-test.js (95%) rename test/{lib => }/utils-test.js (98%) diff --git a/test/lib/cluster-emitter-test.js b/test/cluster-emitter-test.js similarity index 92% rename from test/lib/cluster-emitter-test.js rename to test/cluster-emitter-test.js index 7457f69..4c2078f 100644 --- a/test/lib/cluster-emitter-test.js +++ b/test/cluster-emitter-test.js @@ -2,7 +2,7 @@ var should = require('should'), _ = require('underscore'), - getLogger = require('../../lib/utils.js').getLogger; + getLogger = require('../lib/utils.js').getLogger; describe('cluster-emitter', function(){ @@ -18,7 +18,7 @@ describe('cluster-emitter', function(){ this.timeout(500); - var emitter = require('../../lib/cluster-emitter.js').emitter; + var emitter = require('../lib/cluster-emitter.js').emitter; emitter.should.be.ok; _.isFunction(emitter.emit).should.equal(true); diff --git a/test/lib/ecv-test.js b/test/ecv-test.js similarity index 95% rename from test/lib/ecv-test.js rename to test/ecv-test.js index dfe15e8..c4dd641 100644 --- a/test/lib/ecv-test.js +++ b/test/ecv-test.js @@ -8,8 +8,8 @@ var should = require('should'), timeout = require('when/timeout'), _ = require('underscore'), EventEmitter = require('events').EventEmitter, - getLogger = require('../../lib/utils.js').getLogger, - pickAvailablePort = require('../../lib/utils.js').pickAvailablePort; + getLogger = require('../lib/utils.js').getLogger, + pickAvailablePort = require('../lib/utils.js').pickAvailablePort; function knock(port, path, assertions){ @@ -44,7 +44,7 @@ describe('ecv', function(){ this.timeout(3000); - var ecv = require('../../lib/ecv.js'), + var ecv = require('../lib/ecv.js'), app = express(), server = http.createServer(app), emitter = new EventEmitter(); @@ -104,7 +104,7 @@ describe('ecv', function(){ this.timeout(5000); - var ecv = require('../../lib/ecv.js'), + var ecv = require('../lib/ecv.js'), app = express(), server = http.createServer(app), emitter = new EventEmitter(); @@ -180,7 +180,7 @@ describe('ecv', function(){ this.timeout(3000); - var ecv = require('../../lib/ecv.js'), + var ecv = require('../lib/ecv.js'), app = express(), server = http.createServer(app), emitter = new EventEmitter(), diff --git a/test/lib/utils-test.js b/test/utils-test.js similarity index 98% rename from test/lib/utils-test.js rename to test/utils-test.js index 74b4b2b..70e93cd 100644 --- a/test/lib/utils-test.js +++ b/test/utils-test.js @@ -1,7 +1,7 @@ 'use strict'; var should = require('should'), - utils = require('../../lib/utils.js'), + utils = require('../lib/utils.js'), path = require('path'), when = require('when'), fs = require('graceful-fs'), From d593808a2d67639394d25dd70d8d84e2cfa4d799 Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 13:57:02 -0700 Subject: [PATCH 039/182] + cluster-emitter unit test added, included 'optimist' for argv parsing as devDependencies --- package.json | 3 +- test/cluster-emitter-test.js | 19 +++++ test/lib/cluster-emitter-runtime.js | 119 ++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 test/lib/cluster-emitter-runtime.js diff --git a/package.json b/package.json index f54ad21..0a1251a 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ }, "devDependencies": { "mocha": "~1.11.0", - "should": "~1.2.2" + "should": "~1.2.2", + "optimist": "~0.6.0" }, "scripts": { "prestart": "rm -rf ./log; mkdir log", diff --git a/test/cluster-emitter-test.js b/test/cluster-emitter-test.js index 4c2078f..c592a4c 100644 --- a/test/cluster-emitter-test.js +++ b/test/cluster-emitter-test.js @@ -2,6 +2,7 @@ var should = require('should'), _ = require('underscore'), + fork = require('child_process').fork, getLogger = require('../lib/utils.js').getLogger; describe('cluster-emitter', function(){ @@ -55,4 +56,22 @@ describe('cluster-emitter', function(){ //on/once should listen to events emitted from either master or workers //removeListener/removeAllListeners should revoke all the listeners triggered abovesss + describe('cluster-emitter', function(){ + + it('should work in cluster mode', function(done){ + + this.timeout(3000); + + var token = 't-' + Date.now(), + clusterRuntime = fork(require.resolve('./lib/cluster-emitter-runtime.js'), ['--token=' + token]); + + clusterRuntime.on('message', function(msg){ + + done(msg.exit); + + }); + + }); + }); + }); \ No newline at end of file diff --git a/test/lib/cluster-emitter-runtime.js b/test/lib/cluster-emitter-runtime.js new file mode 100644 index 0000000..5392b8d --- /dev/null +++ b/test/lib/cluster-emitter-runtime.js @@ -0,0 +1,119 @@ +'use strict'; + +process.getLogger = require('../../lib/utils.js').getLogger; + +var should = require('should'), + cluster = require('cluster'), + optimist = require('optimist'), + when = require('when'), + timeout = require('when/timeout'), + _ = require('underscore'), + emitter = require('../../lib/cluster-emitter.js').emitter, + logger = process.getLogger(__filename); + +if(cluster.isMaster){ + + var argv = optimist.argv, + token = argv.token, + noWorkers = argv.noWorkers || 2, + event = 'event-' + token, + echo = 'echo-' + event; + + cluster.setupMaster({ + 'args': ['--event=' + event] + }); + + logger.info('[master] exec with token:%s and will use event:%s and echo:%s to verify emitter with %d workers', token, event, echo, noWorkers); + + var workers = _.map(_.range(0, noWorkers), function(){ + return cluster.fork(); + }), + waitForWorkers = when.map(workers, function(w){ + var waitForOnline = when.defer(); + + w.once('online', function(){ + waitForOnline.resolve(w); + }); + + return timeout(2000, waitForOnline.promise); + }), + exit = function exit(error){ + + logger.info('[master] exiting with error:%j', error); + + process.send({ + 'exit': error + }); //tell the test it has exited with failure + + process.nextTick(function(){ //exit now. + _.invoke(workers, 'kill', 'SIGTERM'); //force all workers to exit before master itself + process.nextTick(function(){ + process.exit(error ? -1 : 0); + }); + }); + }; + + waitForWorkers + .then(function(){ + + logger.info('[master] got all workers online notifications'); + + var expects = _.map(workers, function(w){ + return w.process.pid;//all workers' pids + }) + .concat([process.pid]);//master included + + emitter.once(event, function(){ + + logger.info('[master] received event:%s, and will echo:%s with pid:%d', event, echo, process.pid); + emitter.emit(echo, ['self'], process.pid); + }); + + emitter.on(echo, function(pid){ + + logger.info('[master] received echo:%s from process:%d', echo, pid); + + expects = _.without(expects, pid); + if(_.isEmpty(expects)){ + exit(); + } + }); + + logger.info('[master] emitting event:%s to all', event); + emitter.emit(event, null/*target*/, echo); + + setTimeout(function(){ + + exit(new Error('timeout after 5s, remaining expects:' + expects)); + }, 5000); + }) + .otherwise(function(error){ + + logger.info('[master] did not receive all workers online notification in time'); + exit(error); + }); +} +else{ + + var argv = optimist.argv, + event = argv.event; + + emitter.on(event, function(echo){ + + logger.info('[worker:%d] received:%s and will echo:%s', process.pid, event, echo); + + var eventToMe = event + '/' + process.pid; + + emitter.once(eventToMe, function(){ + + logger.info('[worker:%d] received:%s and will emit:%s', process.pid, eventToMe, echo); + emitter.emit(echo, null, process.pid); + logger.info('[worker:%d] emitted:%s with payload:%s', process.pid, echo, process.pid); + }); + + emitter.emit(eventToMe, ['self']); + logger.info('[worker:%d] emitted:%s', process.pid, eventToMe); + }); + + logger.info('[worker:%d] prepared to echo to event:%s', process.pid, event); +} From f175d62424d8d00464471eddfd5dac539f6da375 Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 15:08:24 -0700 Subject: [PATCH 040/182] + simplified cluster-emitter & cluster-status usages, could be required using: require('cluster/cluster-emitter') require('cluster/cluster-status') directly without access to cluster instance --- lib/cluster-emitter.js | 4 ++-- lib/cluster-status.js | 16 ++++++++-------- lib/index.js | 2 +- lib/master.js | 2 +- lib/worker.js | 2 +- test/cluster-emitter-test.js | 2 +- test/lib/cluster-emitter-runtime.js | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/cluster-emitter.js b/lib/cluster-emitter.js index b0563e9..b81cdd0 100644 --- a/lib/cluster-emitter.js +++ b/lib/cluster-emitter.js @@ -170,7 +170,7 @@ var slaveEmitter = { if(cluster.isMaster){ - var emitter = exports.emitter = masterEmitter; + var emitter = module.exports = masterEmitter; //any newly forked worker must get a replication of the known event handlers cluster.on('fork', function(worker){ @@ -186,7 +186,7 @@ if(cluster.isMaster){ } else{ - var emitter = exports.emitter = slaveEmitter; + var emitter = module.exports = slaveEmitter; process.on('message', function(message){ _.each(emitter.handlers[message.type] || [], function(h){ diff --git a/lib/cluster-status.js b/lib/cluster-status.js index a473eac..eca9a66 100644 --- a/lib/cluster-status.js +++ b/lib/cluster-status.js @@ -8,9 +8,10 @@ var when = require('when'), util = require('util'), _ = require('underscore'); -var logger = process.getLogger(__filename); +var logger = process.getLogger(__filename), + emitter = require('./cluster-emitter'); -exports.status = function(emitter){ +module.exports = (function(emitter){ var registry = {}; @@ -92,7 +93,7 @@ exports.status = function(emitter){ 'getStatus': function getStatus(name, wait){ - return when.all(_.map(registry[name], function(r){ + return when.map(registry[name], function(r){ var got = when.defer(), echo = util.format('get-status-%s-%d-%d', name, r.pid, Date.now()); @@ -109,12 +110,12 @@ exports.status = function(emitter){ emitter.emit(util.format('get-status-%s', name), [r.pid], echo); return timeout(got.promise, wait || 1000); - })); + }); }, 'setStatus': function setStatus(name, value, wait){ - return when.all(_.map(registry[name], function(r){ + return when.map(registry[name], function(r){ var set = when.defer(), echo = util.format('set-status-%s-%d-%d', name, r.pid, Date.now()); @@ -130,8 +131,7 @@ exports.status = function(emitter){ emitter.emit(util.format('set-status-%s', name), [r.pid], value, echo); return timeout(set.promise, wait || 1000); - })); + }); } }; -}; - +})(emitter); diff --git a/lib/index.js b/lib/index.js index 6bc9ea7..0dded56 100644 --- a/lib/index.js +++ b/lib/index.js @@ -34,7 +34,7 @@ var Cluster = exports.Cluster = function Cluster(options) { process.getLogger(__filename).error(error.stack || error); }); - var emitter = require('./cluster-emitter.js').emitter; + var emitter = require('./cluster-emitter'); this.options = { 'emitter': emitter, 'noWorkers': os.cpus().length, diff --git a/lib/master.js b/lib/master.js index b750faa..b066318 100644 --- a/lib/master.js +++ b/lib/master.js @@ -303,7 +303,7 @@ Master.prototype.initialize = function(proc, options){ 'slaves': { }, - 'status': require('./cluster-status.js').status(options.emitter) + 'status': require('./cluster-status') }); cluster.on('fork', function(worker){//interestingly, on fork or #fork could complete in disorder... diff --git a/lib/worker.js b/lib/worker.js index 367cad4..d9d75df 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -31,7 +31,7 @@ var Worker = exports.Worker = function(proc, options){ 'totalTransactions': new BigNumber(1),//avoid zero division 'totalDurations': new BigNumber(0), 'heartbeatInterval': options.heartbeatInterval || 60000,//1 min, the heartbeat should be too frequent, which could cause false old determining - 'status': require('./cluster-status.js').status(emitter), + 'status': require('./cluster-status'), 'status.os': { }, diff --git a/test/cluster-emitter-test.js b/test/cluster-emitter-test.js index c592a4c..a7c1176 100644 --- a/test/cluster-emitter-test.js +++ b/test/cluster-emitter-test.js @@ -19,7 +19,7 @@ describe('cluster-emitter', function(){ this.timeout(500); - var emitter = require('../lib/cluster-emitter.js').emitter; + var emitter = require('../lib/cluster-emitter'); emitter.should.be.ok; _.isFunction(emitter.emit).should.equal(true); diff --git a/test/lib/cluster-emitter-runtime.js b/test/lib/cluster-emitter-runtime.js index 5392b8d..ac0f8fd 100644 --- a/test/lib/cluster-emitter-runtime.js +++ b/test/lib/cluster-emitter-runtime.js @@ -8,7 +8,7 @@ var should = require('should'), when = require('when'), timeout = require('when/timeout'), _ = require('underscore'), - emitter = require('../../lib/cluster-emitter.js').emitter, + emitter = require('../../lib/cluster-emitter'), logger = process.getLogger(__filename); if(cluster.isMaster){ From 9c6e368d219eeb866dd7b3fb274285f26d341f2e Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 15:11:55 -0700 Subject: [PATCH 041/182] + refactored cluster-emitter to emitter & cluster-status to status to allow require to work as: require('cluster2/emitter') require('cluster2/status') --- lib/{cluster-emitter.js => emitter.js} | 0 lib/index.js | 2 +- lib/master.js | 2 +- lib/{cluster-status.js => status.js} | 2 +- lib/worker.js | 2 +- test/cluster-emitter-test.js | 2 +- test/lib/cluster-emitter-runtime.js | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename lib/{cluster-emitter.js => emitter.js} (100%) rename lib/{cluster-status.js => status.js} (98%) diff --git a/lib/cluster-emitter.js b/lib/emitter.js similarity index 100% rename from lib/cluster-emitter.js rename to lib/emitter.js diff --git a/lib/index.js b/lib/index.js index 0dded56..b1c8772 100644 --- a/lib/index.js +++ b/lib/index.js @@ -34,7 +34,7 @@ var Cluster = exports.Cluster = function Cluster(options) { process.getLogger(__filename).error(error.stack || error); }); - var emitter = require('./cluster-emitter'); + var emitter = require('./emitter'); this.options = { 'emitter': emitter, 'noWorkers': os.cpus().length, diff --git a/lib/master.js b/lib/master.js index b066318..49fe8f0 100644 --- a/lib/master.js +++ b/lib/master.js @@ -303,7 +303,7 @@ Master.prototype.initialize = function(proc, options){ 'slaves': { }, - 'status': require('./cluster-status') + 'status': require('./status') }); cluster.on('fork', function(worker){//interestingly, on fork or #fork could complete in disorder... diff --git a/lib/cluster-status.js b/lib/status.js similarity index 98% rename from lib/cluster-status.js rename to lib/status.js index eca9a66..00294a7 100644 --- a/lib/cluster-status.js +++ b/lib/status.js @@ -9,7 +9,7 @@ var when = require('when'), _ = require('underscore'); var logger = process.getLogger(__filename), - emitter = require('./cluster-emitter'); + emitter = require('./emitter'); module.exports = (function(emitter){ diff --git a/lib/worker.js b/lib/worker.js index d9d75df..8d2a987 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -31,7 +31,7 @@ var Worker = exports.Worker = function(proc, options){ 'totalTransactions': new BigNumber(1),//avoid zero division 'totalDurations': new BigNumber(0), 'heartbeatInterval': options.heartbeatInterval || 60000,//1 min, the heartbeat should be too frequent, which could cause false old determining - 'status': require('./cluster-status'), + 'status': require('./status'), 'status.os': { }, diff --git a/test/cluster-emitter-test.js b/test/cluster-emitter-test.js index a7c1176..993d972 100644 --- a/test/cluster-emitter-test.js +++ b/test/cluster-emitter-test.js @@ -19,7 +19,7 @@ describe('cluster-emitter', function(){ this.timeout(500); - var emitter = require('../lib/cluster-emitter'); + var emitter = require('../lib/emitter'); emitter.should.be.ok; _.isFunction(emitter.emit).should.equal(true); diff --git a/test/lib/cluster-emitter-runtime.js b/test/lib/cluster-emitter-runtime.js index ac0f8fd..b05b25f 100644 --- a/test/lib/cluster-emitter-runtime.js +++ b/test/lib/cluster-emitter-runtime.js @@ -8,7 +8,7 @@ var should = require('should'), when = require('when'), timeout = require('when/timeout'), _ = require('underscore'), - emitter = require('../../lib/cluster-emitter'), + emitter = require('../../lib/emitter'), logger = process.getLogger(__filename); if(cluster.isMaster){ From 695990b9603633372997dbeb51451a0b488b13b1 Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 16:26:52 -0700 Subject: [PATCH 042/182] + status unit test + error in heartbeat --- lib/status.js | 7 +- lib/worker.js | 20 +++++- test/cluster-status-test.js | 135 ++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 test/cluster-status-test.js diff --git a/lib/status.js b/lib/status.js index 00294a7..802bfb2 100644 --- a/lib/status.js +++ b/lib/status.js @@ -9,7 +9,10 @@ var when = require('when'), _ = require('underscore'); var logger = process.getLogger(__filename), - emitter = require('./emitter'); + emitter = require('./emitter'), + noop = function(){ + + }; module.exports = (function(emitter){ @@ -73,6 +76,8 @@ module.exports = (function(emitter){ emitter.on(util.format('set-status-%s', name), function(value, echo){ + update = update || noop;//in case update wasn't given + emitter.emit(echo, ['master', 'self'], update(value)); }); }, diff --git a/lib/worker.js b/lib/worker.js index 8d2a987..16e418f 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -38,6 +38,10 @@ var Worker = exports.Worker = function(proc, options){ 'gc': { 'incremental': 0, 'full': 0 + }, + 'error': { + 'count': 0, + 'fatal': 0 } }); @@ -51,6 +55,16 @@ var Worker = exports.Worker = function(proc, options){ }); }); + emitter.on('error', function(err){ + + if(err && err.fatal){ + _this.error.fatal += 1; + } + else{ + _this.error.count += 1; + } + }); + _this.status.register('status.os', function(){ return _this['status.os']; @@ -58,6 +72,7 @@ var Worker = exports.Worker = function(proc, options){ function(status){ return _this['status.os'] = status; }); + _this.whenHeartbeat(); }; @@ -164,7 +179,8 @@ Worker.prototype.whenHeartbeat = function(){ 'durations': _this.durations, 'totalTransactions': _this.totalTransactions.plus(_this.transactions).toString(16), 'totalDurations': _this.totalDurations.plus(_this.durations).toString(16), - 'gc': _this.gc + 'gc': _this.gc, + 'error': _this.error }; emitter.emit('heartbeat', ['self', 'master'], heartbeat); @@ -175,6 +191,8 @@ Worker.prototype.whenHeartbeat = function(){ _this.transactions = 1; _this.gc.incremental = 0; _this.gc.full = 0; + _this.error.count = 0; + _this.error.fatal = 0; }); _this.heartbeatTimer = setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); diff --git a/test/cluster-status-test.js b/test/cluster-status-test.js new file mode 100644 index 0000000..4d2cded --- /dev/null +++ b/test/cluster-status-test.js @@ -0,0 +1,135 @@ +'use strict'; + +var should = require('should'), + getLogger = require('../lib/utils.js').getLogger; + +describe('cluster-status', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#statuses', function(){ + + it('should get no status at the beginning', function(done){ + + var status = require('../lib/status'); + + status.statuses().should.be.ok; + status.statuses().length.should.equal(0); + + done(); + + }); + + }); + + describe('#register', function(){ + + it('should allow register of an immutable component', function(done){ + + var status = require('../lib/status'), + name = 'immutable-status-' + Date.now(), + view = 'view-' + name; + + status.getStatus(name).then(done, function(){ + + status.register(name, function(){ + return view; + }); + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(view); + + status.setStatus(name, 'noop').then(function(){ //as we didn't register update, setStatus should have no effect at all. + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(view); + + done(); + + }); + + }, done); + + }, done); + }); + }); + + it('should allow register of a mutable component', function(done){ + + var status = require('../lib/status'), + name = 'mutable-status-' + Date.now(), + view = 'view-' + name, + updated = 'updated-' + name; + + status.getStatus(name).then(done, function(){ + + status.register(name, function(){ + return view; + }, + function(update){ + view = update; + }); + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(view); + + + status.setStatus(name, updated).then(function(){ //as we didn't register update, setStatus should have no effect at all. + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(updated); + + done(); + + }); + + }, done); + + }, done); + }); + }); + + }); + + //need to add test for cluster mode. + //we'll need to verify that statuses, register, setStatus, getStatus all work from workers view, masters view + //worker should see components registered by itself + //master should see components registered by itself and all of its workers + +}); \ No newline at end of file From f12c3efd71729cf4dc9749f1cbc8f61157413d89 Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 20:22:06 -0700 Subject: [PATCH 043/182] + pending cluster-status cluster unit test --- package.json | 2 +- test/cluster-status-test.js | 19 +++++ test/lib/cluster-status-runtime.js | 121 +++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 test/lib/cluster-status-runtime.js diff --git a/package.json b/package.json index 0a1251a..77163be 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "scripts": { "prestart": "rm -rf ./log; mkdir log", "start": "node ./examples/cluster-demo.js", - "test": "./node_modules/mocha/bin/mocha ./test/*" + "test": "./node_modules/mocha/bin/mocha ./test/*-test.js" }, "optionalDependencies": { diff --git a/test/cluster-status-test.js b/test/cluster-status-test.js index 4d2cded..cc034eb 100644 --- a/test/cluster-status-test.js +++ b/test/cluster-status-test.js @@ -1,6 +1,7 @@ 'use strict'; var should = require('should'), + fork = require('child_process').fork, getLogger = require('../lib/utils.js').getLogger; describe('cluster-status', function(){ @@ -132,4 +133,22 @@ describe('cluster-status', function(){ //worker should see components registered by itself //master should see components registered by itself and all of its workers + describe.skip('cluster-status', function(){ + + it('should work in cluster mode', function(done){ + + this.timeout(3000); + + var token = 't-' + Date.now(), + clusterRuntime = fork(require.resolve('./lib/cluster-status-runtime.js'), ['--token=' + token]); + + clusterRuntime.on('message', function(msg){ + + done(msg.exit); + + }); + + }); + }); + }); \ No newline at end of file diff --git a/test/lib/cluster-status-runtime.js b/test/lib/cluster-status-runtime.js new file mode 100644 index 0000000..f2aaa68 --- /dev/null +++ b/test/lib/cluster-status-runtime.js @@ -0,0 +1,121 @@ +'use strict'; + +process.getLogger = require('../../lib/utils.js').getLogger; + +var should = require('should'), + cluster = require('cluster'), + optimist = require('optimist'), + when = require('when'), + timeout = require('when/timeout'), + _ = require('underscore'), + status = require('../../lib/status'), + emitter = require('../../lib/emitter'), + logger = process.getLogger(__filename); + +if(cluster.isMaster){ + + var argv = optimist.argv, + token = argv.token, + noWorkers = argv.noWorkers || 2, + statusName = 'status-' + token; + + cluster.setupMaster({ + 'args': ['--status=' + statusName] + }); + + logger.info('[master] exec with token:%s and will register status:%s and create %d workers', token, statusName, noWorkers); + + var onlineWorkers = 0, + waitForWorkers = when.defer(); + + emitter.on('worker-online', function(){ + onlineWorkers += 1; + + if(onlineWorkers === noWorkers){ + waitForWorkers.resolve(onlineWorkers); + } + }); + + var workers = _.map(_.range(0, noWorkers), function(){ + + return cluster.fork(); + }), + exit = function exit(error){ + + logger.info('[master] exiting with error:%j', error); + + process.send({ + 'exit': new Error(error) + }); //tell the test it has exited with failure + + process.nextTick(function(){ //exit now. + _.invoke(workers, 'kill', 'SIGTERM'); //force all workers to exit before master itself + process.nextTick(function(){ + process.exit(error ? -1 : 0); + }); + }); + }; + + timeout(3000, waitForWorkers) + .then(function(){ + + logger.info('[master] got all workers online notifications'); + + var expects = _.map(workers, function(w){ + return w.process.pid;//all workers' pids + }) + .concat([process.pid]);//master included + + var pid = process.pid; + + status.register(statusName, + function(){ + return pid; + }, + function(value){ + pid = value; + }); + + status.getStatus(statusName) + .then(function(result){ + + console.log('[cluster-status] got status result:%j', result); + + result.should.be.ok; + result.length.should.equal(expects.length); + + exit(); + + }) + .otherwise(exit); + }) + .otherwise(function(error){ + + logger.info('[master] did not receive all workers online notification in time'); + + exit(error); + }); +} +else{ + + var argv = optimist.argv, + statusName = argv.status, + pid = process.pid; + + logger.info('[worker:%d] forked and register status:%s', pid, statusName); + + status.register(statusName, + function(){ + return pid; + }, + function(value){ + pid = value; + }); + + logger.info('[worker:%d] registered status', process.pid, statusName); + + emitter.emit('worker-online', ['master']);//truely ready + + logger.info('[worker:%d] sent notification:%s', 'online-' + pid); + +} From 2734eac0e1cbc634a16b80737bc8cc53ff75d28f Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 21 Sep 2013 20:41:00 -0700 Subject: [PATCH 044/182] + simple shutdown support --- lib/shutdown.js | 5 +++++ package.json | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 lib/shutdown.js diff --git a/lib/shutdown.js b/lib/shutdown.js new file mode 100644 index 0000000..f74373e --- /dev/null +++ b/lib/shutdown.js @@ -0,0 +1,5 @@ +'use strict'; + +var readMasterPid = require('./utils.js').readMasterPid; + +process.kill(readMasterPid(), 'SIGSTOP'); diff --git a/package.json b/package.json index 77163be..e656be2 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "scripts": { "prestart": "rm -rf ./log; mkdir log", "start": "node ./examples/cluster-demo.js", + "stop": "node ./lib/shutdown.js", + "poststop": "rm ./log/*.log; rm ./pids/*.pid", "test": "./node_modules/mocha/bin/mocha ./test/*-test.js" }, "optionalDependencies": { From 2b4a1ff2f0edf6461e1be9ec546caa30f43f3c93 Mon Sep 17 00:00:00 2001 From: huzhou Date: Mon, 23 Sep 2013 16:56:27 -0700 Subject: [PATCH 045/182] + major cache api rewrite, added 'namespace' and let user deal with 'cache' alone + will need to update the debug monitor-app to handle 'namespaces' --- lib/cache-common.js | 1 + lib/cache-mgr.js | 205 +++++++++++++++++++++++++++++--------------- lib/cache-usr.js | 126 ++++++++++----------------- lib/cache.js | 111 ++++++++++++++++++++++++ test/cache-test.js | 163 +++++++++++++++++++++++++++++++++++ 5 files changed, 456 insertions(+), 150 deletions(-) create mode 100644 lib/cache.js create mode 100644 test/cache-test.js diff --git a/lib/cache-common.js b/lib/cache-common.js index 8fc5596..3be2f73 100644 --- a/lib/cache-common.js +++ b/lib/cache-common.js @@ -48,6 +48,7 @@ module.exports = { 'failure' : '-1' }, 'types': { + 'NS' : 'ns', 'GET' : 'get', 'SET' : 'set', 'DEL' : 'del', diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index a9fd491..06b59cd 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -5,7 +5,11 @@ var common = require('./cache-common.js'), fs = require('graceful-fs'), os = require('os'), net = require('net'), - util = require('util'); + util = require('util'), + path = require('path'), + when = require('when'), + timeout = require('when/timeout'), + ensureDir = require('./utils.js').ensureDir; var success = common.status.success, failure = common.status.failure, @@ -20,9 +24,25 @@ var success = common.status.success, domain = os.type().toLowerCase().indexOf('windows') >= 0 ? 8888 : '/tmp/cache.socket.' + process.pid, domainPath = common.domainPath, persistPath = common.persistPath, - cache = {}, - expirations = {}, - persists = {}, + namespaces = { + '': { //meta namespace + '': { //meta of meta namespace itself + 'value': { //meta value + 'persist': true, //persist true + 'expire': 0 //never expire + } + } + } + }, + metaOfNs = function metaOfNs(namespace){ + + var entry = namespaces[''][namespace]; + + return entry ? entry.value : { + 'persist': false, + 'expire': 0 + };//default meta + }, conns = [], logger = process.getLogger(__filename); @@ -30,7 +50,19 @@ var manager = { 'domain': domain, - 'all': function(conn, token){ + 'ns': function(conn, token){ + + common.write(conn, common.serialize({ + 'type': NS, + 'token': token, + 'namespaces': _.keys(namespaces), + 'status': success + })); + }, + + 'all': function(conn, token, namespace){ + + var cache = namespaces[namespaces] || {}; common.write(conn, common.serialize({ 'type': ALL, @@ -40,12 +72,19 @@ var manager = { })); }, - 'set': function(conn, token, key, value, persist, expire, overwrite){ + 'set': function(conn, token, namespace, key, value, overwrite){ - var old = cache[key], + var cache = namespaces[namespace] = namespaces[namespace] || {}, + meta = metaOfNs(namespace), + expire = meta.expire, + old = cache[key], write = old === undefined || overwrite; - cache[key] = write ? value : cache[key]; + cache[key] = write ? { + 'value': value, + 'expire': expire > 0 ? Date.now + expire : 0 //expire at + } + : cache[key]; common.write(conn, common.serialize({ 'type': SET, @@ -58,59 +97,58 @@ var manager = { var notify = common.serialize({ 'token': CHN, + 'namespace': namespace, 'key': key, - 'value': cache[key] + 'value': cache[key]['value'] }); _.each(conns, function(c){ common.write(c, notify); }); - - if(persist || persists[key]){ - persists[key] = cache[key]; - } - if(expire){ - expirations[key] = Date.now() + expire; - } } }, - 'get': function(conn, token, key, value, persist, expire){ + 'get': function(conn, token, namespace, key, value){ - var result = { - 'type': GET, - 'token': token, - 'key': key, - 'value': cache[key] || value,//default - 'status': success - }; + var cache = namespaces[namespace] || {}, + entry = cache[key] || {}, + result = { + 'type': GET, + 'token': token, + 'key': key, + 'value': entry.value || value,//default + 'status': success + }; common.write(conn, common.serialize(result)); }, - 'ins': function(conn, token, key){ + 'ins': function(conn, token, namespace, key){ - var result = { - 'type': INSPECT, - 'token': token, - 'key': key, - 'value': cache[key], - 'persist': persists[key], - 'expire': Date.now() - expirations[key], - 'status': success - }; + var cache = namespaces[namespace] || {}, + meta = metaOfNs(namespace), + entry = cache[key], + result = { + 'type': INSPECT, + 'token': token, + 'key': key, + 'value': entry.value, + 'persist': meta.persist, + 'expire': meta.expire ? Date.now() - entry.expire : meta.expire, + 'status': success + }; common.write(conn, common.serialize(result)); }, - 'del': function(conn, token, key){ + 'del': function(conn, token, namespace, key){ - var value = cache[key]; + var cache = namespaces[namespace] || {}, + entry = cache[key] || {}, + value = entry.value; + delete cache[key]; delete cache[key + '/lock'];//locker released too - delete persists[key];//no harm even if it's not a persisted key - delete expirations[key]; - common.write(conn, common.serialize({ 'type': DEL, 'token': token, @@ -121,8 +159,9 @@ var manager = { var notify = common.serialize({ 'token': CHN, + 'namespace': namespace, 'key': key, - 'value': cache[key] + 'value': value }); _.each(conns, function(c){ common.write(c, notify); @@ -169,14 +208,13 @@ module.exports = { var command = common.deserialize(pack), token = command.token, + namespace = command.namespace, type = command.type, //['set', 'get', 'del', 'persist'] key = command.key, //cache key value = command.value, - persist = command.persist, - expire = command.expire, overwrite = !command.leaveIfNonNull; // cache value - manager[type].apply(manager, [conn, token, key, value, persist, expire, overwrite]); + manager[type].apply(manager, [conn, token, namespace, key, value, overwrite]); }); }//otherwise keep buffering... }); @@ -200,12 +238,18 @@ module.exports = { logger.info('cache manager started'); - var persistPathExists = fs.existsSync(persistPath); + ensureDir(persistPath); - if(persistPathExists){ - //to get the cache from something already persisted - cache = common.deserialize(fs.readFileSync(persistPath, {'encoding':'utf-8'}) || '{}'); - } + var persists = fs.readdirSync(persistPath) || []; + _.each(persists, function(p){ + + var filter = /^(.+)\.cache$/, + match = filter.exec(p); + + if(match && match[1]){ + namespaces[match[1]] = common.deserialize(fs.readFileSync(path.join(persistPath, p), {'encoding':'utf-8'}) || '{}'); + } + }); //register domain to where all other users and the master process could watch fs.writeFileSync(domainPath, domain); @@ -213,30 +257,57 @@ module.exports = { var updateTask = function updateTask(){ //expiration monitoring every 10 seconds - var now = Date.now(); - _.each(expirations, function(due, key){ - if(due >= now){ - - delete cache[key]; - delete cache[key + '/lock'];//locker released too - delete persists[key];//no harm even if it's not a persisted key - delete expirations[key]; - - var notify = common.serialize({ - 'token': CHN, - 'key': key, - 'value': cache[key] - }); - _.each(conns, function(c){ - common.write(c, notify); + var now = Date.now(), + cachesToPersist = []; + + _.each(namespaces, function(cache, namespace){ + + var meta = metaOfNs(namespace), + persist = meta.persist, + expire = meta.expire; + + if(expire > 0){ + _.each(cache, function(entry, key){ + + if(entry.expire <= now){ + + delete cache[key]; + + var notify = common.serialize({ + 'token': CHN, + 'namespace': namespace, + 'key': key, + 'value': cache[key] + }); + _.each(conns, function(c){ + common.write(c, notify); + }); + } }); } + + if(persist){ + cachesToPersist[namespace] = cache; + } }); - //persist every 10 seconds - fs.writeFile(persistPath, common.serialize(persists), function(){ + + when.map(cachesToPersist, function(cache, namespace){ + + var waitForPersist = when.defer(), + persistence = path.join(persistPath, namespace + '.cache'); + + fs.writeFile(persistPath, common.serialize(persists), function(err){ + + waitForPersist.resolve(!err); + }); + + return timeout(waitForPersist, 10000);//too big? + }) + .ensure(function(){ + setTimeout(updateTask, 10000); - }); + }) }; updateTask(); diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 312c03e..6faecc6 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -27,7 +27,9 @@ var success = common.status.success, changes = { }, - anyChanges = [], + anyChanges = { + + }, conn = null, reconnect = function reconnect(error){ @@ -58,6 +60,7 @@ var success = common.status.success, var response = common.deserialize(pack), token = response.token, + namespace = response.namespace, key = response.key, keys = response.keys, value = response.value, @@ -66,11 +69,12 @@ var success = common.status.success, expire = response.expire; if(token === CHN){ - _.each(changes[key], function(whenChange){ + changes[namespace] = changes[namespace] || [] + _.each(changes[namespace][key] || [], function(whenChange){ whenChange(value); }); - _.invoke(anyChanges, 'call', null, key, value); + _.invoke(anyChanges[namespace] || [], 'call', null, key, value); } else if(token === PONG){//just to keep the connection open common.write(connecting, common.serialize({ @@ -95,9 +99,7 @@ var success = common.status.success, var user = process.user || { - 'copy': null, - - 'keys': function(options){ + 'keys': function(namespace, options){ options = options || {}; @@ -120,7 +122,8 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': ALL, - 'token': token + 'token': token, + 'namespace': namespace })); return (wait > 0 ? timeout(wait, tillKeys.promise) : tillKeys.promise).ensure(function(){ @@ -128,7 +131,7 @@ var user = process.user || { }); }, - 'get': function(key, loader, options){ + 'get': function(namespace, key, loader, options){ options = options || {}; @@ -139,17 +142,13 @@ var user = process.user || { if(success === status && value !== undefined){//got the value - if(user.copy){//copy the value fetched from master cache, this is needed for consistency restore, unmakeCopy then makeCopy etc. - user.copy[key] = value; - } - tillGet.resolve(value); } else if(loader){//must atomically load the value var watchOthers = function(changed){ //unregister itself immediately - user.unwatch(key, watchOthers); + user.unwatch(namespace, key, watchOthers); if(changed !== undefined){ tillGet.resolve(changed); @@ -159,22 +158,20 @@ var user = process.user || { } }; - user.watch(key, watchOthers); - user.set(key + '/lock', process.pid, { + user.watch(namespace, key, watchOthers); + user.set(namespace, key + '/lock', process.pid, { 'wait': wait, 'leaveIfNonNull': true }) .then(function(set){ //only one of the concurrent writers will be given the set===true if(set){ - user.unwatch(key, watchOthers);//unregister immediately as i'm about to write the value + user.unwatch(namespace, key, watchOthers);//unregister immediately as i'm about to write the value try{ //promise or value when(loader(), function(value){ //success value loaded - user.set(key, value, { - 'persist': options.persist, - 'expire': options.expire, + user.set(namespace, key, value, { 'wait': wait }) .then(function(){ @@ -189,7 +186,7 @@ var user = process.user || { } catch(e){ //in case loaded fail - when.join(user.set(key + '/lock', null), user.set(key, undefined)) + when.join(user.set(namespace, key + '/lock', null), user.set(namespace, key, undefined)) .ensure(function(){ tillGet.reject(new Error('loader failed')); }); @@ -203,27 +200,23 @@ var user = process.user || { } }; - if(user.copy && user.copy[key] !== undefined){ - //local copy hit - tillGet.resolve(user.copy[key]); - } - else{ - //local copy miss, fetch from master cache - handlers[token] = handler; - - common.write(conn, common.serialize({ - 'type': GET, - 'token': token, - 'key': key - })); - } + + //local copy miss, fetch from master cache + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': GET, + 'token': token, + 'namespace': namespace, + 'key': key + })); return (wait > 0 ? timeout(wait, tillGet.promise) : tillGet.promise).ensure(function(){ delete handlers[token]; }); }, - 'inspect': function(key, options){ + 'inspect': function(namespace, key, options){ options = options || {}; @@ -247,6 +240,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': INSPECT, 'token': token, + 'namespace': namespace, 'key': key })); @@ -265,7 +259,7 @@ var user = process.user || { leaveIfNonNull boolean (true means the set will backout if the value exists, default as false, which will overwrite the value) * } */ - 'set': function(key, value, options){//must guarantee that value has no '\r\n' in it (if it's a string or any complex type) + 'set': function(namespace, key, value, options){//must guarantee that value has no '\r\n' in it (if it's a string or any complex type) options = options || {}; @@ -275,10 +269,6 @@ var user = process.user || { handler = function(status, key){ if(success === status){ - if(user.copy){//user copy enabled - user.copy[key] = value; - } - tillSet.resolve(true); } else{ @@ -291,10 +281,9 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': SET, 'token': token, + 'namespace': namespace, 'key': key, 'value': value, - 'persist': options.persist, - 'expire': options.expire, 'leaveIfNonNull': options.leaveIfNonNull })); @@ -307,7 +296,7 @@ var user = process.user || { * @param key string * @param wait number (timeout after wait expired) */ - 'del': function(key, options){ + 'del': function(namespace, key, options){ options = options || {}; @@ -318,10 +307,6 @@ var user = process.user || { if(success === status){ - if(user.copy){//user copy enabled - delete user.copy[key]; - } - tillDel.resolve(value); } else{ @@ -334,6 +319,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': DEL, 'token': token, + 'namespace': namespace, 'key': key })); @@ -342,53 +328,27 @@ var user = process.user || { }); }, - 'watch': function(key, callback){ + 'watch': function(namespace, key, callback){ if(!key){ - anyChanges.push(callback); + anyChanges[namespace] = anyChanges[namespace] || []; + anyChanges[namespace].push(callback); } else{ - changes[key] = changes[key] || []; - changes[key].push(callback); + changes[namespace] = changes[namespace] || {}; + changes[namespace][key] = changes[namespace][key] || []; + changes[namespace][key].push(callback); } }, - 'unwatch': function(key, callback){ + 'unwatch': function(namespace, key, callback){ if(!key){ - anyChanges = _.without(anyChanges, callback); + anyChanges[namespace] = _.without(anyChanges[namespace] || [], callback); } else{ - changes[key] = changes[key] || []; - changes[key] = _.without(changes[key], callback); - } - }, - - 'makeCopy': function(){ - - if(user.copy !== null){//don't let repeated makeCopy request wipe out the existing copies - return; - } - - user.copy = {}; - user.any = function any(key, value){ - - if(value !== null){ - user.copy[key] = value; - } - else{ - delete user.copy[key]; - } - }; - anyChanges.push(user.any); - }, - - 'unmakeCopy': function(){ - - if(user.copy !== null){ - - user.copy = null; - anyChanges = _.without(anyChanges, user.any); + changes[namespace] = changes[namespace] || {}; + changes[namespace][key] = _.without(changes[namespace][key] || [], callback); } }, diff --git a/lib/cache.js b/lib/cache.js new file mode 100644 index 0000000..11407d9 --- /dev/null +++ b/lib/cache.js @@ -0,0 +1,111 @@ +'use strict'; + +var _ = require('underscore'), + when = require('when'), + timeout = require('when/timeout'), + pipeline = require('when/pipeline'), + logger = process.getLogger(__filename); + +var Cache = exports.Cache = function(usr, namespace, options){ + + options = options || { + 'persist': false, + 'expire': 0 + }; + + _.extend(this, { + 'usr': usr, + 'namespace': namespace, + 'persist': options.persist, + 'expire': options.expire + }); +}; + +Cache.prototype.meta = function(){ + + return { + 'persist': this.persist, + 'expire': this.expire + }; +} + +Cache.prototype.keys = function keys(){ + + return this.usr.keys(this.namespace); +}; + +Cache.prototype.get = function get(key, loader, options){ + + return this.usr.get(this.namespace, key, loader, options); +}; + +Cache.prototype.set = function set(key, value, options){ + + return this.usr.set(this.namespace, key, value, options); +}; + +Cache.prototype.del = function del(key, options){ + + return this.usr.del(this.namespace, key, options); +}; + +Cache.prototype.watch = function watch(key, onChange){ + + return this.usr.watch(this.namespace, key, onChange); +}; + +Cache.prototype.unwatch = function unwatch(key, onChange){ + + return this.usr.get(this.namespace, key, loader, options); +}; + +module.exports = { + + 'use': function(namespace, options){ + + var actualOptions = options || {}; + _.defaults(actualOptions, { + 'persist': false, + 'expire': 0, + 'timeout': 3000 + }); + + /*return pipeline([ + function(domain){ + + logger.info('[cache] using domain:%s', domain); + return require('./cache-usr.js').user(domain); + }, + function(usr){ + + logger.info('[cache] usr ready, and using namespace:%s & options:%j', namespace, actualOptions); + return when.join(usr, usr.get('', namespace, function(){ + + return actualOptions; + })); + }, + function(resolve){ + + var usr = resolve[0], + meta= resolve[1]; + + logger.info('[cache] namespace:%s reserved with meta:%j', namespace, meta); + return new Cache(usr, namespace, meta); + } + ], actualOptions.domain);//optional*/ + + var waitToUse = when.defer(); + + require('./cache-usr.js').user(actualOptions.domain) + .then(function(usr){ + usr.get('', namespace, function(){ + return actualOptions; + }) + .then(function(meta){ + waitToUse.resolve(new Cache(usr, namespace, meta)); + }); + }); + + return timeout(actualOptions.timeout, waitToUse.promise); + } +}; diff --git a/test/cache-test.js b/test/cache-test.js new file mode 100644 index 0000000..dff4b25 --- /dev/null +++ b/test/cache-test.js @@ -0,0 +1,163 @@ +'use strict'; + +var should = require('should'), + getLogger = require('../lib/utils.js').getLogger, + logger = getLogger(__filename); + +describe('cache', function(){ + + + before(function(done){ + + process.getLogger = getLogger; + + var mgr = require('../lib/cache-mgr.js'), + svr = mgr.createServer(mgr.app); + + svr.listen(mgr.port, mgr.afterServerStarted); + + done(); + }); + + describe('#cache-user', function(){ + + it('should auto connect to mgr', function(done){ + + this.timeout(3000); + + require('../lib/cache-usr.js').user() + .then(function(usr){ + + done(); + }); + }); + + it('should support all ACID operations', function(done){ + + this.timeout(3000); + + require('../lib/cache-usr.js').user() + .then(function(usr){ + + var namespace = 'ns-' + Date.now(); + logger.info('[test] using namespace:%s', namespace); + + usr.get(namespace, 'key') + .then(function(value){ + + logger.info('[test] first "key" get attempt should fail:%j', value); + should.not.exist(value); + + usr.watch(namespace, 'key', function(value){ + + value.should.equal('value'); + + logger.info('[test] watch key triggered'); + }); + + usr.watch(namespace, null, function(key, value){ + + key.should.equal('key'); + value.should.equal('value'); + + logger.info('[test] watch all triggered'); + + }); + + usr.set(namespace, 'key', 'value') + .then(function(set){ + + logger.info('[test] first "key" set attempt should succeed:%s', set); + set.should.equal(true); + + usr.get(namespace, 'key') + .then(function(value){ + + logger.info('[test] 2nd "key" get attempt should succeed:%j', value); + value.should.be.ok; + value.should.equal('value'); + + usr.inspect(namespace, 'key') + .then(function(inspection){ + + logger.info('[test] inspecting "key" got:%j', inspection); + inspection.should.be.ok; + inspection.length.should.equal(3); + + //value, persist, expire + inspection[0].should.equal('value'); + inspection[1].should.equal(false); + inspection[2].should.equal(0); + + done(); + + }, done); + + }, done); + + }, done); + + }, done); + }); + }); + }); + + describe('#use', function(){ + + + it('should give a Cache interface back which hides the cache-usr behind', function(done){ + + this.timeout(4000); + + var namespace = 'use-ns-' + Date.now(), + persist = true, + expire = 3000; + + require('../lib/cache').use(namespace, { + 'persist': persist, + 'expire': expire + }) + .then(function(cache){ + + logger.info('[test] cache obtained:%j', cache); + + cache.should.be.ok; + cache.namespace.should.equal(namespace); + + var meta = cache.meta(); + meta.should.be.ok; + meta.persist.should.equal(true); + + logger.info('[test] cache queries begin'); + + cache.get('key') + .then(function(value){ + + logger.info('[test] cache 1st "get" attempt should value:%j', value); + + should.not.exist(value); + + cache.get('key', function(){ + + return 'value'; + }) + .then(function(value){ + + logger.info('[test] cache 2nd "get" with loader attempt should succeed given value:%j', value); + + value.should.equal('value'); + + done(); + + }, done); + + }, done); + + done(); + + }, done); + }); + + }); + +}); \ No newline at end of file From da92bb416b2ba8f97681e5e3a12c293df6ecc1b3 Mon Sep 17 00:00:00 2001 From: huzhou Date: Mon, 23 Sep 2013 17:26:41 -0700 Subject: [PATCH 046/182] + cache monitor draft support --- lib/cache-usr.js | 32 ++++++++++++ lib/monitor-app.js | 99 +++++++++++++++++++++++++------------ lib/public/views/caches.ejs | 58 +++++++++++++--------- lib/public/views/index.ejs | 4 +- 4 files changed, 135 insertions(+), 58 deletions(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 6faecc6..beb768b 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -10,6 +10,7 @@ var _ = require('underscore'), var success = common.status.success, failure = common.status.failure, + NS = common.types.NS, ALL = common.types.ALL, GET = common.types.GET, SET = common.types.SET, @@ -99,6 +100,37 @@ var success = common.status.success, var user = process.user || { + 'ns': function(options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillNamespaces = when.defer(), + handler = function(status, namespaces){ + + if(success === status){ + + tillNamespaces.resolve(namespaces || []); + } + else{ + + tillNamespaces.reject(new Error('failed to get namespaces')); + } + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': NS, + 'token': token + })); + + return (wait > 0 ? timeout(wait, tillNamespaces.promise) : tillNamespaces.promise).ensure(function(){ + delete handlers[token]; + }); + }, + 'keys': function(namespace, options){ options = options || {}; diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 9e0f242..8be2834 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -152,44 +152,79 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ require('./cache-usr.js').user().then(function(usr){ - usr.watch(null, function(key, value){ + usr.ns() + .then(function(namespaces){ - usr.inspect(key).then(function(status){ - - socket.emit('cache-changed', key, status[0], status[1], status[2]); + _.each(namespaces || [], function(namespace){ + + usr.watch(namespace, null, function(key, value){ + + usr.inspect(namespace, key).then(function(status){ + + socket.emit('cache-changed', namespace, key, status[0], status[1], status[2]); + }); + }); + + usr.keys(namespace).then(function(keys){ + + when.map(keys, function(k){ + + return usr.inspect(namespace, k); + }) + .then(function(values){ + + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'caches': _.map(keys, function(k, i){ + return { + 'key': k, + 'value': values[i][0], + 'persist': values[i][1], + 'expire': values[i][2] + }; + }) + }); + + socket.emit('caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }); + }); + }); + }); + }); }); - }); - usr.keys().then(function(keys){ - - when.map(keys, function(k){ - - return usr.inspect(k); - }) - .then(function(values){ - - fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'caches': _.map(keys, function(k, i){ - return { - 'key': k, - 'value': values[i][0], - 'persist': values[i][1], - 'expire': values[i][2] - }; - }) - }); - - socket.emit('caches', { - 'view': 'html', - 'html': html + usr.watch('', null, function(namespace, value){ + + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'caches': [] }); + + socket.emit('caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html }); + }); + + usr.watch(namespace, null, function(key, value){ + + usr.inspect(namespace, key).then(function(status){ + + socket.emit('cache-changed', namespace, key, status[0], status[1], status[2]); }); + }); }); }); }); diff --git a/lib/public/views/caches.ejs b/lib/public/views/caches.ejs index 58f2320..4cd4d66 100644 --- a/lib/public/views/caches.ejs +++ b/lib/public/views/caches.ejs @@ -1,31 +1,41 @@ - - - - - - - - - - - <%for(var k = 0, len = caches.length; k < len; k += 1){ - var entry = caches[k];%> - - - - - - - <%}%> - -
    #valuepersistedexpire
    <%=entry.key%><%=JSON.stringify(entry.value)%><%=entry.persist ? true : false%><%=entry.expire ? entry.expire + 'ms' : ''%>
    +
    +
    +

    Cache: <%=namespace%>

    +
    +
    + + + + + + + + + + + + <%for(var k = 0, len = caches.length; k < len; k += 1){ + var entry = caches[k];%> + + + + + + + <%}%> + +
    #valuepersistedexpire
    <%=entry.key%><%=JSON.stringify(entry.value)%><%=entry.persist ? true : false%><%=entry.expire ? entry.expire + 'ms' : ''%>
    + +
    +
    + From d7ef3e916c2db5e1aa1ccbb30e71b29b1fc8682a Mon Sep 17 00:00:00 2001 From: huz Date: Mon, 23 Sep 2013 23:35:26 -0700 Subject: [PATCH 047/182] + namespace related bugfixes + monitor of active namespaces restored completely --- .gitignore | 1 + .npmignore | 6 ++++++ examples/cluster-demo.js | 18 +++++++----------- lib/cache-mgr.js | 4 +++- lib/cache-usr.js | 5 +++-- lib/cache.js | 10 +++++----- lib/monitor-app.js | 19 +++++++++++++++++++ lib/public/views/index.ejs | 2 +- 8 files changed, 45 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 952ac26..c8b0f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.log +.idea node_modules pids docs diff --git a/.npmignore b/.npmignore index 389d6bf..696ff44 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,10 @@ *.iml .travis.yml +.idea node_modules test +examples +log +pids +cluster-cache-domain +cluster-cache-persist diff --git a/examples/cluster-demo.js b/examples/cluster-demo.js index 23d9c38..b0bc393 100644 --- a/examples/cluster-demo.js +++ b/examples/cluster-demo.js @@ -7,29 +7,25 @@ var Cluster = require('../lib/index.js').Cluster, app.get('/', function(req, res){ - require('../lib/cache-usr.js').user() - .then(function(usr){ + require('../lib/cache').use('demo-cache') + .then(function(cache){ var key = req.query.key, val = req.query.value; if(!key){ - usr.get('key', function(){ + cache.get('key', function(){ return 'value'; - }, - { - 'persist': true, - 'expire': null }) .then(function(value){ res.send(util.format('hello from:%d whose cached value is:%j', process.pid, value), 200); }); } else{ - console.log('user set:' + key + '=' + val); - usr.set(key, val) - .then(function(){ - res.send(util.format('user set:%s to value:%j', key, val), 200); + console.log('[cache] set:%s=%j', key, val); + cache.set(key, val) + .then(function(set){ + res.send(util.format('[cache] set:%s to value:%j result:%s', key, val, set), 200); }); } }); diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 06b59cd..c417e97 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -13,6 +13,7 @@ var common = require('./cache-common.js'), var success = common.status.success, failure = common.status.failure, + NS = common.types.NS, GET = common.types.GET, SET = common.types.SET, DEL = common.types.DEL, @@ -62,11 +63,12 @@ var manager = { 'all': function(conn, token, namespace){ - var cache = namespaces[namespaces] || {}; + var cache = namespaces[namespace] || {}; common.write(conn, common.serialize({ 'type': ALL, 'token': token, + 'namespace': namespace, 'keys': _.keys(cache), 'status': success })); diff --git a/lib/cache-usr.js b/lib/cache-usr.js index beb768b..f5195bd 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -62,6 +62,7 @@ var success = common.status.success, var response = common.deserialize(pack), token = response.token, namespace = response.namespace, + namespaces = response.namespaces, key = response.key, keys = response.keys, value = response.value, @@ -70,7 +71,7 @@ var success = common.status.success, expire = response.expire; if(token === CHN){ - changes[namespace] = changes[namespace] || [] + changes[namespace] = changes[namespace] || {}; _.each(changes[namespace][key] || [], function(whenChange){ whenChange(value); }); @@ -84,7 +85,7 @@ var success = common.status.success, })); } else{ - handlers[token].apply(user, [status, key || keys, value, persist, expire]); + handlers[token].apply(user, [status, key || keys || namespaces, value, persist, expire]); } }); } diff --git a/lib/cache.js b/lib/cache.js index 11407d9..0b946e7 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -70,7 +70,7 @@ module.exports = { 'timeout': 3000 }); - /*return pipeline([ + return pipeline([ function(domain){ logger.info('[cache] using domain:%s', domain); @@ -87,14 +87,14 @@ module.exports = { function(resolve){ var usr = resolve[0], - meta= resolve[1]; + meta = resolve[1]; logger.info('[cache] namespace:%s reserved with meta:%j', namespace, meta); return new Cache(usr, namespace, meta); } - ], actualOptions.domain);//optional*/ + ], actualOptions.domain);//optional - var waitToUse = when.defer(); + /*var waitToUse = when.defer(); require('./cache-usr.js').user(actualOptions.domain) .then(function(usr){ @@ -106,6 +106,6 @@ module.exports = { }); }); - return timeout(actualOptions.timeout, waitToUse.promise); + return timeout(actualOptions.timeout, waitToUse.promise);*/ } }; diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 8be2834..ea4b31e 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -113,8 +113,10 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ v.name = k; return v; }); + if(!_.isEqual(knownPids, pids)){ + logger.info('[monitor][workers] detects workers changed:%j from:%j', pids, knownPids); knownPids = pids;//update pids fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { @@ -130,6 +132,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ 'statuses': arrOfStatues }); + logger.info('[monitor][workers] renders workers view:%s', html); socket.emit('workers', { 'view': 'html', 'html': html @@ -137,6 +140,8 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ }); } else{ + + logger.debug('[monitor][workers] emits status changes:%j', arrOfStatues); socket.emit('status-change', pids, arrOfStatues); } }); @@ -155,18 +160,24 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ usr.ns() .then(function(namespaces){ + logger.info('[monitor][cache] existing namespaces:%s', namespaces); + _.each(namespaces || [], function(namespace){ usr.watch(namespace, null, function(key, value){ + logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); usr.inspect(namespace, key).then(function(status){ + logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); socket.emit('cache-changed', namespace, key, status[0], status[1], status[2]); }); }); usr.keys(namespace).then(function(keys){ + logger.info('[monitor][cache][%s] existing keys:%s', namespace, keys); + when.map(keys, function(k){ return usr.inspect(namespace, k); @@ -179,6 +190,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ function(err, read){ var html = ejs.render(read, { + 'namespace': namespace, 'caches': _.map(keys, function(k, i){ return { 'key': k, @@ -189,6 +201,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ }) }); + logger.info('[monitor][cache][%s] inspected:\n%s\nand renders caches view:\n%s', JSON.stringify(values), namespace, html); socket.emit('caches', { 'view': 'html', 'namespace': namespace, @@ -202,15 +215,19 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ usr.watch('', null, function(namespace, value){ + logger.info('[monitor][cache] detects new namespace:%s', namespace); + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { 'encoding': 'utf-8' }, function(err, read){ var html = ejs.render(read, { + 'namespace': namespace, 'caches': [] }); + logger.info('[monitor][cache][%s] renders empty caches view', namespace); socket.emit('caches', { 'view': 'html', 'namespace': namespace, @@ -220,8 +237,10 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ usr.watch(namespace, null, function(key, value){ + logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); usr.inspect(namespace, key).then(function(status){ + logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); socket.emit('cache-changed', namespace, key, status[0], status[1], status[2]); }); }); diff --git a/lib/public/views/index.ejs b/lib/public/views/index.ejs index 0eaa9ce..6ec6268 100644 --- a/lib/public/views/index.ejs +++ b/lib/public/views/index.ejs @@ -73,7 +73,7 @@ } }); - socket.once('caches', function(data) { + socket.on('caches', function(data) { if(data.view === 'html'){ $('#caches-tables').append(data.html); } From be5660c35b9e8866c4e24ecb69e0d74c1c45c22c Mon Sep 17 00:00:00 2001 From: huz Date: Tue, 24 Sep 2013 10:21:05 -0700 Subject: [PATCH 048/182] + refactor socket usage in monitor-app.js --- lib/monitor-app.js | 371 +++++++++++++++++++++++---------------------- 1 file changed, 189 insertions(+), 182 deletions(-) diff --git a/lib/monitor-app.js b/lib/monitor-app.js index ea4b31e..13e04cb 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -33,241 +33,248 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ return; } - //the debug flow is as the following: - //app view accepts debug request, and we call master#debug to start - //app view shows the debug as preparing till we hear 'debug-inspector' event from the master - //app view shows the inspector's url for user to go to - //if it's debugging live, the worker is still running and debug is started as well - //otherwise the debugging fresh, the worker won't start till user comes back to the app view and 'resume' the debug (after he/she puts all the breakpoints needed) - //user could continue the debug till the app view accepts 'debug-finshed' request and propagate this event to the master - - exports.io.sockets.on('connection', function (socket) { + res.render('index', { - var debugging = undefined, - inspector = null, - state = null, - statuses = {}, - knownPids = [], - debug = function debug(pid){ + }); +}; - debugging = pid; - inspector = null; - state = null; +monApp.use(debugMiddleware); - logger.info('[debug] %s requested', pid); +exports.monApp = monApp; - masterPromise.then(function(master){ +exports.monCreateServer = function createServer(app){ - socket.once('debug-started', function(){ + var server = require('http').createServer(app), + io = require('socket.io').listen(server, {'log': false}), + debugging = undefined, + inspector = null, + state = null, + statuses = {}, + knownPids = [], + sockets = [];//all of these vars are now scoped in monCreateServer to make unique - state = 'debug-started'; - master.emitter.emit('debug-started', ['master']); - logger.info('debug:%s start requested', pid); - }); + logger.info('[monitor] server started'); - socket.once('debug-finished', function(){ + function workers(){ + + masterPromise.then(function(master){ + var pids = _.keys(master.slaves), + promises = _.map(master.status.statuses(), function(status){ + return master.status.getStatus(status); + }); - debugging = null; - inspector = null; - state = 'debug-finshed'; + when.all(promises) + .then(function(statusesOfWorkers){ - master.emitter.emit('debug-finished', ['master']); - logger.info('[debug] %s finished', pid); - socket.once('debug', debug); - }); + _.each(statusesOfWorkers, function(statusOfWorkers){ - master.emitter.once('debug-inspector', function(inspectorUrl){ + _.each(statusOfWorkers, function(statusOfWorker){ - inspector = inspectorUrl; - logger.info('[debug] %s inspector ready:%s', pid, inspector); - knownPids = [];//force an update + statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; + statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + }); }); - master.debug(pid); - }); - }; - - socket.once('debug', debug); - - function workers(){ - - masterPromise.then(function(master){ - var pids = _.keys(master.slaves), - promises = _.map(master.status.statuses(), function(status){ - return master.status.getStatus(status); - }); + var arrOfStatues = _.map(statuses, function(v, k){ + v.name = k; + return v; + }); - when.all(promises) - .then(function(statusesOfWorkers){ + if(!_.isEqual(knownPids, pids)){ + + logger.info('[monitor][workers] detects workers changed:%j from:%j', pids, knownPids); + knownPids = pids;//update pids - _.each(statusesOfWorkers, function(statusOfWorkers){ + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ - _.each(statusOfWorkers, function(statusOfWorker){ + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': arrOfStatues + }); - statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; - statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; - }); + logger.info('[monitor][workers] renders workers view:%s', html); + _.invoke(sockets, 'emit', 'workers', { + 'view': 'html', + 'html': html + }); }); + } + else{ - var arrOfStatues = _.map(statuses, function(v, k){ - v.name = k; - return v; - }); - - if(!_.isEqual(knownPids, pids)){ - - logger.info('[monitor][workers] detects workers changed:%j from:%j', pids, knownPids); - knownPids = pids;//update pids - - fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'pids': pids, - 'debugging': debugging, - 'inspector': inspector, - 'state': state, - 'statuses': arrOfStatues - }); - - logger.info('[monitor][workers] renders workers view:%s', html); - socket.emit('workers', { - 'view': 'html', - 'html': html - }); - }); - } - else{ - - logger.debug('[monitor][workers] emits status changes:%j', arrOfStatues); - socket.emit('status-change', pids, arrOfStatues); - } - }); - }); - setTimeout(workers, 1000);//everyone 1s - }; - - workers(); + logger.debug('[monitor][workers] emits status changes:%j', arrOfStatues); + _.invoke(sockets, 'emit', 'status-change', pids, arrOfStatues) + } + }); + }); + setTimeout(workers, 1000);//everyone 1s + }; - function caches(){ + function caches(){ - masterPromise.then(function(){ + masterPromise.then(function(){ - require('./cache-usr.js').user().then(function(usr){ + require('./cache-usr.js').user().then(function(usr){ - usr.ns() - .then(function(namespaces){ + usr.ns() + .then(function(namespaces){ - logger.info('[monitor][cache] existing namespaces:%s', namespaces); + logger.info('[monitor][cache] existing namespaces:%s', namespaces); - _.each(namespaces || [], function(namespace){ + _.each(namespaces || [], function(namespace){ - usr.watch(namespace, null, function(key, value){ + usr.watch(namespace, null, function(key, value){ - logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); - usr.inspect(namespace, key).then(function(status){ - - logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); - socket.emit('cache-changed', namespace, key, status[0], status[1], status[2]); - }); + logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); + usr.inspect(namespace, key).then(function(status){ + + logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); + _.invoke(sockets, 'emit', 'cache-changed', namespace, key, status[0], status[1], status[2]); }); + }); - usr.keys(namespace).then(function(keys){ - - logger.info('[monitor][cache][%s] existing keys:%s', namespace, keys); - - when.map(keys, function(k){ - - return usr.inspect(namespace, k); - }) - .then(function(values){ - - fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'namespace': namespace, - 'caches': _.map(keys, function(k, i){ - return { - 'key': k, - 'value': values[i][0], - 'persist': values[i][1], - 'expire': values[i][2] - }; - }) - }); - - logger.info('[monitor][cache][%s] inspected:\n%s\nand renders caches view:\n%s', JSON.stringify(values), namespace, html); - socket.emit('caches', { - 'view': 'html', - 'namespace': namespace, - 'html': html - }); - }); + usr.keys(namespace).then(function(keys){ + + logger.info('[monitor][cache][%s] existing keys:%s', namespace, keys); + + when.map(keys, function(k){ + + return usr.inspect(namespace, k); + }) + .then(function(values){ + + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'namespace': namespace, + 'caches': _.map(keys, function(k, i){ + return { + 'key': k, + 'value': values[i][0], + 'persist': values[i][1], + 'expire': values[i][2] + }; + }) + }); + + logger.info('[monitor][cache][%s] inspected:\n%s\nand renders caches view:\n%s', JSON.stringify(values), namespace, html); + _.invoke(sockets, 'emit', 'caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }) }); - }); + }); }); }); + }); - usr.watch('', null, function(namespace, value){ + usr.watch('', null, function(namespace, value){ - logger.info('[monitor][cache] detects new namespace:%s', namespace); + logger.info('[monitor][cache] detects new namespace:%s', namespace); - fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ - var html = ejs.render(read, { - 'namespace': namespace, - 'caches': [] - }); + var html = ejs.render(read, { + 'namespace': namespace, + 'caches': [] + }); - logger.info('[monitor][cache][%s] renders empty caches view', namespace); - socket.emit('caches', { - 'view': 'html', - 'namespace': namespace, - 'html': html - }); - }); + logger.info('[monitor][cache][%s] renders empty caches view', namespace); + _.invoke(sockets, 'emit', 'caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }); + }); - usr.watch(namespace, null, function(key, value){ + usr.watch(namespace, null, function(key, value){ - logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); - usr.inspect(namespace, key).then(function(status){ - - logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); - socket.emit('cache-changed', namespace, key, status[0], status[1], status[2]); - }); + logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); + usr.inspect(namespace, key).then(function(status){ + + logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); + _.invoke(sockets, 'emit', 'cache-changed', namespace, key, status[0], status[1], status[2]) }); }); }); }); - } + }); + } + + //the debug flow is as the following: + //app view accepts debug request, and we call master#debug to start + //app view shows the debug as preparing till we hear 'debug-inspector' event from the master + //app view shows the inspector's url for user to go to + //if it's debugging live, the worker is still running and debug is started as well + //otherwise the debugging fresh, the worker won't start till user comes back to the app view and 'resume' the debug (after he/she puts all the breakpoints needed) + //user could continue the debug till the app view accepts 'debug-finshed' request and propagate this event to the master + + io.sockets.on('connection', function (socket) { + + logger.info('[monitor] accepted new websocket and sending workers & caches view'); + + sockets.push(socket); + + workers(); caches(); - }); - res.render('index', { + socket.once('debug', function debug(pid){ - }); -}; + debugging = pid; + inspector = null; + state = null; -monApp.use(debugMiddleware); + logger.info('[debug] %s requested', pid); -exports.monApp = monApp; + masterPromise.then(function(master){ -exports.monCreateServer = function createServer(app){ + socket.once('debug-started', function(){ + + state = 'debug-started'; + master.emitter.emit('debug-started', ['master']); + logger.info('debug:%s start requested', pid); + }); + + socket.once('debug-finished', function(){ + + debugging = null; + inspector = null; + state = 'debug-finshed'; + + master.emitter.emit('debug-finished', ['master']); + logger.info('[debug] %s finished', pid); + socket.once('debug', debug); + }); + + master.emitter.once('debug-inspector', function(inspectorUrl){ + + inspector = inspectorUrl; + logger.info('[debug] %s inspector ready:%s', pid, inspector); + knownPids = [];//force an update + }); - var server = require('http').createServer(app); + master.debug(pid); + }); + }); - exports.io = require('socket.io').listen(server, {'log': false}); + socket.once('close', function close(){ - logger.info('monitor server started'); + sockets = _.without(sockets, socket); + }); + }); return server; }; From ae8336ff65450e78281c74bf7c233343918c804d Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 24 Sep 2013 12:30:21 -0700 Subject: [PATCH 049/182] + spread status & caches view to all workers, whether new or existings, avoid unnecessary listeners completely, efficient socket communications. --- lib/monitor-app.js | 174 +++++++++++++++++++++++++-------------------- 1 file changed, 95 insertions(+), 79 deletions(-) diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 13e04cb..855e7df 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -50,12 +50,11 @@ exports.monCreateServer = function createServer(app){ inspector = null, state = null, statuses = {}, - knownPids = [], sockets = [];//all of these vars are now scoped in monCreateServer to make unique logger.info('[monitor] server started'); - function workers(){ + var workers = _.once(function tick(){ masterPromise.then(function(master){ var pids = _.keys(master.slaves), @@ -80,40 +79,88 @@ exports.monCreateServer = function createServer(app){ return v; }); - if(!_.isEqual(knownPids, pids)){ - - logger.info('[monitor][workers] detects workers changed:%j from:%j', pids, knownPids); - knownPids = pids;//update pids - - fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'pids': pids, - 'debugging': debugging, - 'inspector': inspector, - 'state': state, - 'statuses': arrOfStatues - }); + _.each(sockets, function(socket){ - logger.info('[monitor][workers] renders workers view:%s', html); - _.invoke(sockets, 'emit', 'workers', { - 'view': 'html', - 'html': html - }); - }); - } - else{ + if(_.isEmpty(_.difference(socket.knownPids, pids)) && _.isEmpty(_.difference(pids, socket.knownPids))){ + + logger.debug('[monitor][workers] emits status changes:%j', arrOfStatues); + socket.emit('status-change', pids, arrOfStatues); + } + else{ + + logger.info('[monitor][workers] detects workers changed:%j from:%j', pids, socket.knownPids); + socket.knownPids = pids;//update pids + + fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': arrOfStatues + }); + + logger.debug('[monitor][workers] renders workers view:%s', html); + socket.emit('workers', { + 'view': 'html', + 'html': html + }); + }); + } + }); + }); + }); + setTimeout(tick, 1000);//everyone 1s + }); + + var watchings = [], + watchExists = function watchExists(usr, namespace){ + + if(_.contains(watchings, namespace)){ + return; + } + + watchings.push(namespace); + usr.watch(namespace, null, function(key, value){ + + logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); + usr.inspect(namespace, key).then(function(status){ + + logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); + _.invoke(sockets, 'emit', 'cache-changed', namespace, key, status[0], status[1], status[2]); + }); + }); + }, + watchFresh = _.once(function(usr){ + + usr.watch('', null, function(namespace, value){ + + logger.info('[monitor][cache] detects new namespace:%s', namespace); + fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'namespace': namespace, + 'caches': [] + }); + + logger.info('[monitor][cache][%s] renders empty caches view', namespace); + _.invoke(sockets, 'emit', 'caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }); + }); - logger.debug('[monitor][workers] emits status changes:%j', arrOfStatues); - _.invoke(sockets, 'emit', 'status-change', pids, arrOfStatues) - } + watchExists(usr, namespace); }); }); - setTimeout(workers, 1000);//everyone 1s - }; function caches(){ @@ -128,15 +175,7 @@ exports.monCreateServer = function createServer(app){ _.each(namespaces || [], function(namespace){ - usr.watch(namespace, null, function(key, value){ - - logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); - usr.inspect(namespace, key).then(function(status){ - - logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); - _.invoke(sockets, 'emit', 'cache-changed', namespace, key, status[0], status[1], status[2]); - }); - }); + watchExists(usr, namespace); usr.keys(namespace).then(function(keys){ @@ -165,11 +204,17 @@ exports.monCreateServer = function createServer(app){ }) }); - logger.info('[monitor][cache][%s] inspected:\n%s\nand renders caches view:\n%s', JSON.stringify(values), namespace, html); - _.invoke(sockets, 'emit', 'caches', { - 'view': 'html', - 'namespace': namespace, - 'html': html + logger.debug('[monitor][cache][%s] inspected:\n%s\nand renders caches view:\n%s', JSON.stringify(values), namespace, html); + _.each(sockets, function(socket){ + if(!_.contains(socket.namespaces, namespace)){ + + socket.namespaces.push(namespace); + socket.emit('caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }); + } }) }); }); @@ -177,38 +222,7 @@ exports.monCreateServer = function createServer(app){ }); }); - usr.watch('', null, function(namespace, value){ - - logger.info('[monitor][cache] detects new namespace:%s', namespace); - - fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { - 'encoding': 'utf-8' - }, - function(err, read){ - - var html = ejs.render(read, { - 'namespace': namespace, - 'caches': [] - }); - - logger.info('[monitor][cache][%s] renders empty caches view', namespace); - _.invoke(sockets, 'emit', 'caches', { - 'view': 'html', - 'namespace': namespace, - 'html': html - }); - }); - - usr.watch(namespace, null, function(key, value){ - - logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); - usr.inspect(namespace, key).then(function(status){ - - logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); - _.invoke(sockets, 'emit', 'cache-changed', namespace, key, status[0], status[1], status[2]) - }); - }); - }); + watchFresh(usr); }); }); } @@ -225,6 +239,8 @@ exports.monCreateServer = function createServer(app){ logger.info('[monitor] accepted new websocket and sending workers & caches view'); + socket.knownPids = []; + socket.namespaces = []; sockets.push(socket); workers(); @@ -263,7 +279,7 @@ exports.monCreateServer = function createServer(app){ inspector = inspectorUrl; logger.info('[debug] %s inspector ready:%s', pid, inspector); - knownPids = [];//force an update + socket.knownPids = [];//force an update }); master.debug(pid); From 345271fdca3dd2e160ddd1276f64adc919f6f7d6 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 24 Sep 2013 13:48:41 -0700 Subject: [PATCH 050/182] + refactor Slave to standalone puppet.js class for better unit test and naming --- lib/master.js | 235 ++++++-------------------------------------------- lib/puppet.js | 193 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+), 211 deletions(-) create mode 100644 lib/puppet.js diff --git a/lib/master.js b/lib/master.js index 49fe8f0..7d54dc5 100644 --- a/lib/master.js +++ b/lib/master.js @@ -9,6 +9,7 @@ var _ = require('underscore'), fork = require('child_process').fork, BigNumber = require('bignumber.js'), Worker = require('./worker.js').Worker, + Puppet = require('./puppet.js').Puppet, rejectIfPortBusy = require('./utils.js').rejectIfPortBusy, writePid = require('./utils.js').writePid, getNodeInspectorPath = require('./utils.js').getNodeInspectorPath, @@ -17,194 +18,6 @@ var _ = require('underscore'), var masterDeferred = when.defer(), masterPromise = exports.master = masterDeferred.promise; -/** - * Slave is an image of the worker at the Master's runtime, to simplify the state machine - */ -var Slave = exports.Slave = function Slave(master, worker, options, env){ - - var _this = this; - - _.extend(_this, { - 'logger': master.logger, - 'emitter': master.emitter, - 'cacheManager': env.CACHE_MANAGER, - 'debugging': env.debug, - 'worker': worker, - 'pid': worker.process.pid - }); - - _this.forkedState = { - - 'disconnect': function(){ - - worker.disconnect(); - }, - - 'whenOnline': function(){ - - if(_this.debugging){ - //we could enable debugging here - master.emitter.once('debug-started', function(){ - _this.emitter.emit('run', [_this.pid]); - }); - - master.emitter.once('debug-finished', function(){ - _this.disconnect(); - }); - - _this.debug(); - } - }, - - 'whenListening': function(){ - - _this.state = _this.activeState; - //this is mainly for the old worker to be notified that the successor is ready - master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); - }, - - 'whenHeartbeat': function(){ - //no interest - }, - - 'whenExit': function(){ - - if(!worker.suicide){//accident, must be revived - master.fork(options, env); - } - } - }; - - _this.activeState = { - - 'disconnect': function(){ - - worker.disconnect(); - worker.suicide = true; - }, - - 'whenHeartbeat': function(heartbeat){ - //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a slave should - //enter an old state from active - - if(master.markOld(heartbeat)){ - - var dieDeferred = when.defer(), - diePromise = null, - die = function(){ - - _this.activeState = _this.oldState; - - var successor = master.fork(options, env); - //when successor is in place, the old worker could be discontinued finally - master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ - - master.emitter.emit('disconnect', ['master', worker.pid]); - dieDeferred.resolve(worker.pid); - - if(master.dyingQueue === diePromise){//last of dyingQueue resolved, clean up the dyingQueue - master.dyingQueue = null; - } - }); - }; - - if(!master.dyingQueue){//1st in the dying queue, - diePromise = master.dyingQueue = timeout(dieDeferred.promise, 60000);//1 min - die(); - } - else{ - diePromise = master.dyingQueue = timeout(master.dyingQueue, 60000).ensure(die); - } - } - }, - - 'whenExit': function(){ - - if(!worker.suicide){//accident, must be revived - master.fork(options, env); - } - //already exit, clean up - delete master.slaves[_this.pid]; - } - }; - - _this.oldState = { - - 'disconnect': function(){ - - worker.disconnect(); - }, - - 'whenExit': function(){ - - _this.state = _this.diedState; - - //already exit, clean up - delete master.slaves[_this.pid]; - } - }; - - _this.diedState = { - - 'disconnect': function(){ - //already disconnected - }, - - 'whenExit': function(){ - //already exit, clean up - delete master.slaves[_this.pid]; - } - }; - - _this.state = _this.forkedState; -}; - -Slave.prototype.debug = function(){ - - //debugger listening on port 5858 - var _this = this, - buff = '', - pid = _this.pid, - worker = _this.worker, - debugDeferred = when.defer(); - - _this.emitter.once('debug-port-listening', function(){ - - _this.logger.info('[debug] slave: %d received debug-port-listening', pid); - debugDeferred.resolve(pid); - }); - - worker.process.kill('SIGUSR1');//make it debug ready - _this.logger.debug('[debug] master sent signal SIGUSR1 to %d', pid); - - return debugDeferred.promise; -}; - -Slave.prototype.disconnect = function(){ - - return this.state.disconnect(); -}; - -Slave.prototype.whenOnline = function(){ - - return this.state.whenOnline(); -}; - -Slave.prototype.whenListening = function(){ - - return this.state.whenListening(); -}; - -Slave.prototype.whenHeartbeat = function(heartbeat){ - - return this.state.whenHeartbeat(heartbeat); -}; - -Slave.prototype.whenExit = function(){ - - return this.state.whenExit(); -}; - var Master = exports.Master = function(proc, options){ var _this = this.initialize(proc, options); @@ -242,7 +55,7 @@ Master.prototype.initialize = function(proc, options){ return _this.fork(_this.options); }); - //wait for all slaves to be ready, and then enable ECV as the last step + //wait for all puppets to be ready, and then enable ECV as the last step _this.markUp(); }, 'noWorkers': options.noWorkers, @@ -261,20 +74,20 @@ Master.prototype.initialize = function(proc, options){ var _this = this, pid = heartbeat.pid, - slave = _this.slaves[pid], + puppet = _this.puppets[pid], currTPS = heartbeat.durations / heartbeat.transactions; if(currTPS <= 2){//TPS too low, no good for sampling as the 1st phase. return false; } - var peak = slave.peak = slave.peak || { + var peak = puppet.peak = puppet.peak || { 'tps': currTPS, 'cpu': heartbeat.cpu, 'memory': heartbeat.memory, 'gc.incremental': heartbeat.gc.incremental, 'gc.full': heartbeat.gc.full - };//remember the peak of each slave + };//remember the peak of each puppet if(currTPS >= peak.tps){ peak.tps = Math.max(currTPS.tps, peak.tps); @@ -300,32 +113,32 @@ Master.prototype.initialize = function(proc, options){ 'debug.saveLiveEdit': options.debug.saveLiveEdit, 'debug.hidden': options.debug.hidden || [], 'options': options, - 'slaves': { + 'puppets': { }, 'status': require('./status') }); cluster.on('fork', function(worker){//interestingly, on fork or #fork could complete in disorder... - _this.slaves[worker.process.pid] = _this.slaves[worker.process.pid] || new Slave(_this, worker, options, worker.process.env || {}); - _this.slaves[worker.process.pid].worker = worker; + _this.puppets[worker.process.pid] = _this.puppets[worker.process.pid] || new Puppet(_this, worker, options, worker.process.env || {}); + _this.puppets[worker.process.pid].worker = worker; }); cluster.on('online', function(worker){ - _this.slaves[worker.process.pid].whenOnline(); + _this.puppets[worker.process.pid].whenOnline(); }); cluster.on('listening', function(worker){ - _this.slaves[worker.process.pid].whenListening(); + _this.puppets[worker.process.pid].whenListening(); }); cluster.on('exit', function(worker){ _this.logger.info('master detects exit of worker:' + worker.process.pid); - _this.slaves[worker.process.pid].whenExit(); + _this.puppets[worker.process.pid].whenExit(); }); _this.emitter.on('heartbeat', function(heartbeat){ - _this.slaves[heartbeat.pid].whenHeartbeat(heartbeat); + _this.puppets[heartbeat.pid].whenHeartbeat(heartbeat); }); process.once('SIGINT', _.bind(_this.whenStop, _this)); @@ -432,15 +245,15 @@ Master.prototype.debug = function debug(pid){ _this.markDown(); //debug fresh - _.each(_this.slaves, function(slave){ + _.each(_this.puppets, function(puppet){ - if(!slave.cacheManager && pid !== slave.pid){ - _this.logger.info('debug fresh, disconnecting:%j vs pid:%j', slave.pid, pid); - slave.disconnect(); + if(!puppet.cacheManager && pid !== puppet.pid){ + _this.logger.info('debug fresh, disconnecting:%j vs pid:%j', puppet.pid, pid); + puppet.disconnect(); } }); - //send signal to the slave + //send signal to the puppet var pending = when.defer(), ready = pending.promise; if(!pid){ @@ -450,7 +263,7 @@ Master.prototype.debug = function debug(pid){ pending.resolve(true); } else{ - var debugging = _this.slaves[pid]; + var debugging = _this.puppets[pid]; _this.logger.info('[debug] going to debug live:%d status:%s', pid, debugging !== null); ready = debugging.debug(); @@ -531,7 +344,7 @@ Master.prototype.fork = function(options, env){ var _this = this, forked = cluster.fork(env); - _this.slaves[forked.process.pid] = new Slave(_this, forked, options, env); + _this.puppets[forked.process.pid] = new Puppet(_this, forked, options, env); return forked; }; @@ -543,7 +356,7 @@ Master.prototype.whenStop = function whenStop(){ threshold = Date.now() + _this.stopTimeout, gracefully = function(){ - if(_.keys(_this.slaves).length === 0){//wait till each live slaves to be disconnected, then exit + if(_.keys(_this.puppets).length === 0){//wait till each live puppets to be disconnected, then exit process.exit(0); } @@ -555,9 +368,9 @@ Master.prototype.whenStop = function whenStop(){ } };//check every second - _.each(_this.slaves, function(slave){ + _.each(_this.puppets, function(puppet){ - slave.disconnect(); + puppet.disconnect(); }); gracefully();//shutdown gracefully @@ -565,9 +378,9 @@ Master.prototype.whenStop = function whenStop(){ Master.prototype.whenExit = function whenExit(){ - _.each(_this.slaves, function(slave){ + _.each(_this.puppets, function(puppet){ - slave.disconnect(); + puppet.disconnect(); }); process.exit(-1);//shutdown bruteforcely diff --git a/lib/puppet.js b/lib/puppet.js new file mode 100644 index 0000000..e26893d --- /dev/null +++ b/lib/puppet.js @@ -0,0 +1,193 @@ +'use strict'; + +var timeout = require('when/timeout'), + util = require('util'), + _ = require('underscore'); + +/** + * Puppet is a projection of the worker at the Master's runtime, to simplify the state machine & control over workers + */ +var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ + + var _this = this; + + _.extend(_this, { + 'logger': master.logger, + 'emitter': master.emitter, + 'cacheManager': env.CACHE_MANAGER, + 'debugging': env.debug, + 'worker': worker, + 'pid': worker.process.pid + }); + + _this.forkedState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenOnline': function(){ + + if(_this.debugging){ + //we could enable debugging here + master.emitter.once('debug-started', function(){ + _this.emitter.emit('run', [_this.pid]); + }); + + master.emitter.once('debug-finished', function(){ + _this.disconnect(); + }); + + _this.debug(); + } + }, + + 'whenListening': function(){ + + _this.state = _this.activeState; + //this is mainly for the old worker to be notified that the successor is ready + master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); + }, + + 'whenHeartbeat': function(){ + //no interest + }, + + 'whenExit': function(){ + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + } + }; + + _this.activeState = { + + 'disconnect': function(){ + + worker.disconnect(); + worker.suicide = true; + }, + + 'whenHeartbeat': function(heartbeat){ + //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a puppet should + //enter an old state from active + + if(master.markOld(heartbeat)){ + + var dieDeferred = when.defer(), + diePromise = null, + die = function(){ + + _this.activeState = _this.oldState; + + var successor = master.fork(options, env); + //when successor is in place, the old worker could be discontinued finally + master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + + master.emitter.emit('disconnect', ['master', worker.pid]); + dieDeferred.resolve(worker.pid); + + if(master.dyingQueue === diePromise){//last of dyingQueue resolved, clean up the dyingQueue + master.dyingQueue = null; + } + }); + }; + + if(!master.dyingQueue){//1st in the dying queue, + diePromise = master.dyingQueue = timeout(dieDeferred.promise, 60000);//1 min + die(); + } + else{ + diePromise = master.dyingQueue = timeout(master.dyingQueue, 60000).ensure(die); + } + } + }, + + 'whenExit': function(){ + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + //already exit, clean up + delete master.puppets[_this.pid]; + } + }; + + _this.oldState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenExit': function(){ + + _this.state = _this.diedState; + + //already exit, clean up + delete master.puppets[_this.pid]; + } + }; + + _this.diedState = { + + 'disconnect': function(){ + //already disconnected + }, + + 'whenExit': function(){ + //already exit, clean up + delete master.puppets[_this.pid]; + } + }; + + _this.state = _this.forkedState; +}; + +Puppet.prototype.debug = function(){ + + //debugger listening on port 5858 + var _this = this, + buff = '', + pid = _this.pid, + worker = _this.worker, + debugDeferred = when.defer(); + + _this.emitter.once('debug-port-listening', function(){ + + _this.logger.info('[debug] puppet: %d received debug-port-listening', pid); + debugDeferred.resolve(pid); + }); + + worker.process.kill('SIGUSR1');//make it debug ready + _this.logger.debug('[debug] master sent signal SIGUSR1 to %d', pid); + + return debugDeferred.promise; +}; + +Puppet.prototype.disconnect = function(){ + + return this.state.disconnect(); +}; + +Puppet.prototype.whenOnline = function(){ + + return this.state.whenOnline(); +}; + +Puppet.prototype.whenListening = function(){ + + return this.state.whenListening(); +}; + +Puppet.prototype.whenHeartbeat = function(heartbeat){ + + return this.state.whenHeartbeat(heartbeat); +}; + +Puppet.prototype.whenExit = function(){ + + return this.state.whenExit(); +}; From d8c0cd6d1529bacd0d374ddb1b942772815b0ab5 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 24 Sep 2013 13:56:33 -0700 Subject: [PATCH 051/182] + refactor moved node-inspector creation to utils to further simplify master and make easier for unit test --- lib/master.js | 18 ++++++------------ lib/utils.js | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/master.js b/lib/master.js index 7d54dc5..d30486c 100644 --- a/lib/master.js +++ b/lib/master.js @@ -6,13 +6,12 @@ var _ = require('underscore'), cluster = require('cluster'), assert = require('assert'), util = require('util'), - fork = require('child_process').fork, BigNumber = require('bignumber.js'), Worker = require('./worker.js').Worker, Puppet = require('./puppet.js').Puppet, rejectIfPortBusy = require('./utils.js').rejectIfPortBusy, writePid = require('./utils.js').writePid, - getNodeInspectorPath = require('./utils.js').getNodeInspectorPath, + startInspector = require('./utils.js').startInspector, enable = require('./ecv.js').enable; var masterDeferred = when.defer(), @@ -278,16 +277,11 @@ Master.prototype.debug = function debug(pid){ ready.then(function(){//must wait for the signal to be sent, and child process ready to accept connection on 5858 - var inspectorArgs = [ - '--web-port=' + _this['debug.webPort'], //where node-inspector process listens to users' request from v8 - '--debug-port=' + _this['debug.debugPort'], //where node-inspector process subscribes to debugging app process - '--save-live-edit=' + _this['debug.saveLiveEdit'], //whether or not user could modify the debugging source and save it - '--hidden=' + _this['debug.hidden']//files excluded from adding breakpoints - ]; - _this.logger.info('[debug] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); - - //NOTE, this is not _this.fork, but child_process.fork - var inspector = fork(inspectorPath, inspectorArgs, {'silent': true}); + var inspector = startInspector(_this['debug.webPort'], + _this['debug.debugPort'], + _this['debug.saveLiveEdit'], + _this['debug.hidden'], + _this.logger); inspector.on('message', function inspectorListener(msg){ diff --git a/lib/utils.js b/lib/utils.js index fd881a9..21681ff 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -9,6 +9,7 @@ var http = require('http'), fs = require('graceful-fs'), path = require('path'), util = require('util'), + fork = require('child_process').fork, _ = require('underscore'), ACCESS = parseInt('0755', 8); @@ -138,6 +139,28 @@ exports.getNodeInspectorPath = function getNodeInspectorPath(){ return require.resolve('node-inspector/bin/inspector'); }; +exports.startInspector = function(webPort, debugPort, saveLiveEdit, hidden, logger){ + + var inspectorPath = exports.getNodeInspectorPath(), + inspectorArgs = [ + '--web-port=' + webPort, //where node-inspector process listens to users' request from v8 + '--debug-port=' + debugPort, //where node-inspector process subscribes to debugging app process + '--save-live-edit=' + saveLiveEdit, //whether or not user could modify the debugging source and save it + '--hidden=' + hidden//files excluded from adding breakpoints + ]; + + assert.ok(inspectorPath); + + if(logger){ + logger.info('[debug] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); + } + + //NOTE, this is not _this.fork, but child_process.fork + return fork(inspectorPath, inspectorArgs, { + 'silent': true + }); +}; + var fileLoggerTransport = new (winston.transports.File)({ 'filename': path.join('./log', process.pid + '.log'), 'maxsize': 4 * 1024 * 1024,//4mb From eb4da6b69c42fe669a30796027a825099dd40a00 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 24 Sep 2013 15:47:01 -0700 Subject: [PATCH 052/182] + refactorings, moved startInspector to utils.js + bugfixes of monitor-app.js, should use 'puppets' instead of 'slaves' now --- lib/cache-usr.js | 1 + lib/cache.js | 14 -------------- lib/master.js | 17 +++++++++++++---- lib/monitor-app.js | 2 +- lib/puppet.js | 19 ++++++++++++------- lib/utils.js | 23 +++++++++++++++-------- 6 files changed, 42 insertions(+), 34 deletions(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index f5195bd..6146dfb 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -32,6 +32,7 @@ var success = common.status.success, }, conn = null, + //TODO, support connection pooling to speed up the cache operations if needed. reconnect = function reconnect(error){ var options = _.isString(domain) ? {'path': domain} : domain, diff --git a/lib/cache.js b/lib/cache.js index 0b946e7..de28a8d 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -93,19 +93,5 @@ module.exports = { return new Cache(usr, namespace, meta); } ], actualOptions.domain);//optional - - /*var waitToUse = when.defer(); - - require('./cache-usr.js').user(actualOptions.domain) - .then(function(usr){ - usr.get('', namespace, function(){ - return actualOptions; - }) - .then(function(meta){ - waitToUse.resolve(new Cache(usr, namespace, meta)); - }); - }); - - return timeout(actualOptions.timeout, waitToUse.promise);*/ } }; diff --git a/lib/master.js b/lib/master.js index d30486c..ba90d8f 100644 --- a/lib/master.js +++ b/lib/master.js @@ -255,28 +255,33 @@ Master.prototype.debug = function debug(pid){ //send signal to the puppet var pending = when.defer(), ready = pending.promise; + if(!pid){ + _this.fork(_this.options, { 'debug': true }); + pending.resolve(true); } else{ + var debugging = _this.puppets[pid]; + _this.logger.info('[debug] going to debug live:%d status:%s', pid, debugging !== null); + ready = debugging.debug(); - + _this.emitter.once('debug-finished', function(){ debugging.disconnect(); }); } - var inspectorPath = getNodeInspectorPath(); - assert.ok(inspectorPath); - ready.then(function(){//must wait for the signal to be sent, and child process ready to accept connection on 5858 + _this.logger.info('[debug] master starting inspector'); + var inspector = startInspector(_this['debug.webPort'], _this['debug.debugPort'], _this['debug.saveLiveEdit'], @@ -310,6 +315,10 @@ Master.prototype.debug = function debug(pid){ _this.markUp(); } }); + }) + .otherwise(function(){ + + _this.logger.error('[debug] master did not get worker to debug mode:%d, debug request aborted', pid); }); }; diff --git a/lib/monitor-app.js b/lib/monitor-app.js index 855e7df..bc7fc18 100644 --- a/lib/monitor-app.js +++ b/lib/monitor-app.js @@ -57,7 +57,7 @@ exports.monCreateServer = function createServer(app){ var workers = _.once(function tick(){ masterPromise.then(function(master){ - var pids = _.keys(master.slaves), + var pids = _.keys(master.puppets), promises = _.map(master.status.statuses(), function(status){ return master.status.getStatus(status); }); diff --git a/lib/puppet.js b/lib/puppet.js index e26893d..a5c3d51 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -1,11 +1,14 @@ 'use strict'; -var timeout = require('when/timeout'), +var when = require('when'), + timeout = require('when/timeout'), util = require('util'), _ = require('underscore'); - + /** - * Puppet is a projection of the worker at the Master's runtime, to simplify the state machine & control over workers + * Puppet is a projection of the worker at the Master's runtime, to simplify the state machine & control over workers. + * NOTE, Puppet only runs in master's runtime, it has access to master instance, and the worker handle to communicate via messaging. + * NOTE, Puppet is a state machine, which are [FORKED, ACTIVE, OLD, DIED], the transitions are events based, including esp. heartbeats. */ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ @@ -153,18 +156,20 @@ Puppet.prototype.debug = function(){ buff = '', pid = _this.pid, worker = _this.worker, - debugDeferred = when.defer(); + waitForDebugPort = when.defer(); _this.emitter.once('debug-port-listening', function(){ _this.logger.info('[debug] puppet: %d received debug-port-listening', pid); - debugDeferred.resolve(pid); + + waitForDebugPort.resolve(pid); }); worker.process.kill('SIGUSR1');//make it debug ready - _this.logger.debug('[debug] master sent signal SIGUSR1 to %d', pid); - return debugDeferred.promise; + _this.logger.info('[debug] master sent signal SIGUSR1 to %d', pid); + + return waitForDebugPort.promise; }; Puppet.prototype.disconnect = function(){ diff --git a/lib/utils.js b/lib/utils.js index 21681ff..4d08150 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -10,6 +10,7 @@ var http = require('http'), path = require('path'), util = require('util'), fork = require('child_process').fork, + assert = require('assert'), _ = require('underscore'), ACCESS = parseInt('0755', 8); @@ -27,8 +28,11 @@ exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ }); server.listen(port, host, function(){ //'listening' listener + request.get(util.format('http://%s:%d/', host, port), function(err, response, body){ + //console.log('[utils] url: http://%s:%d/ err:%j response:%j body:%s', host, port, err, response, body); + if(!err && response && response.statusCode === 200 && parseInt(body, 10) === port){ server.close(function(){ deferred.resolve(port); @@ -40,7 +44,7 @@ exports.rejectIfPortBusy = function rejectIfPortBusy(host, port){ }); }); - return timeout(2000, deferred.promise); + return timeout(3000, deferred.promise); }; global.portsAlreadyPicked = []; @@ -139,22 +143,25 @@ exports.getNodeInspectorPath = function getNodeInspectorPath(){ return require.resolve('node-inspector/bin/inspector'); }; -exports.startInspector = function(webPort, debugPort, saveLiveEdit, hidden, logger){ +exports.startInspector = function startInspector(webPort, debugPort, saveLiveEdit, hidden, logger){ + + logger = logger || {'info': _.bind(console.log, console)}; + hidden = hidden || []; + + logger.info('[utils] starting node-inspector webPort:%d, debugPort:%d, saveLiveEdit:%s, hidden:%j', webPort, debugPort, saveLiveEdit, hidden); var inspectorPath = exports.getNodeInspectorPath(), inspectorArgs = [ '--web-port=' + webPort, //where node-inspector process listens to users' request from v8 '--debug-port=' + debugPort, //where node-inspector process subscribes to debugging app process '--save-live-edit=' + saveLiveEdit, //whether or not user could modify the debugging source and save it - '--hidden=' + hidden//files excluded from adding breakpoints + '--hidden=' + JSON.stringify(hidden)//files excluded from adding breakpoints ]; + logger.info('[utils] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); + assert.ok(inspectorPath); - - if(logger){ - logger.info('[debug] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); - } - + //NOTE, this is not _this.fork, but child_process.fork return fork(inspectorPath, inspectorArgs, { 'silent': true From a06634cf576ccc4e95240d49c6031f237ac2c76c Mon Sep 17 00:00:00 2001 From: huz Date: Tue, 24 Sep 2013 17:23:23 -0700 Subject: [PATCH 053/182] + refactorings, renamed monitor-app.js to monitor to allow dependency as: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit require('/cluster2/monitor') .monApp .debugMiddleware … etc. --- lib/index.js | 4 ++-- lib/{monitor-app.js => monitor.js} | 24 +++++++++++------------- lib/shutdown.js | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-) rename lib/{monitor-app.js => monitor.js} (98%) diff --git a/lib/index.js b/lib/index.js index b1c8772..a6bcc3f 100644 --- a/lib/index.js +++ b/lib/index.js @@ -38,8 +38,8 @@ var Cluster = exports.Cluster = function Cluster(options) { this.options = { 'emitter': emitter, 'noWorkers': os.cpus().length, - 'monCreateServer': require('./monitor-app.js').monCreateServer, - 'monApp': require('./monitor-app.js').monApp, + 'monCreateServer': require('./monitor').monCreateServer, + 'monApp': require('./monitor').monApp, 'monPort': 8081, 'createServer': require('http').createServer, 'app': null,//must be provided by the options diff --git a/lib/monitor-app.js b/lib/monitor.js similarity index 98% rename from lib/monitor-app.js rename to lib/monitor.js index bc7fc18..476abe3 100644 --- a/lib/monitor-app.js +++ b/lib/monitor.js @@ -9,35 +9,33 @@ var express = require('express'), var logger = process.getLogger(__filename), monApp = express(), - masterPromise = require('./master.js').master; + masterPromise = require('./master').master; //the monitor app should support the following: //debug - -monApp.use('/scripts', express.static(path.join(__dirname, './public/scripts'))); -monApp.use('/stylesheets', express.static(path.join(__dirname, './public/stylesheets'))); -monApp.engine('.ejs', require('ejs').__express); -monApp.set('views', path.join(__dirname, './public/views')); -monApp.set('view engine', 'ejs'); - var debugMiddleware = exports.debugMiddleware = function(req, res, next){ if(req.url === '/help'){ - res.sendfile(path.join(__dirname, './public/views/live-debugging.png')); - return; + + return res.sendfile(path.join(__dirname, './public/views/live-debugging.png')); } if(req.url !== '/debug'){ - next(); - return; + + return next(); } res.render('index', { - + }); }; +monApp.use('/scripts', express.static(path.join(__dirname, './public/scripts'))); +monApp.use('/stylesheets', express.static(path.join(__dirname, './public/stylesheets'))); +monApp.engine('.ejs', require('ejs').__express); +monApp.set('views', path.join(__dirname, './public/views')); +monApp.set('view engine', 'ejs'); monApp.use(debugMiddleware); exports.monApp = monApp; diff --git a/lib/shutdown.js b/lib/shutdown.js index f74373e..cc13d20 100644 --- a/lib/shutdown.js +++ b/lib/shutdown.js @@ -2,4 +2,4 @@ var readMasterPid = require('./utils.js').readMasterPid; -process.kill(readMasterPid(), 'SIGSTOP'); +process.kill(readMasterPid(), 'SIGINT'); From c587712ab64d4e135e770eda4a02b0c3339f9711 Mon Sep 17 00:00:00 2001 From: huz Date: Tue, 24 Sep 2013 22:16:01 -0700 Subject: [PATCH 054/182] ~ bugfix & refactorings of cache-mgr.js --- lib/cache-mgr.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index c417e97..7d85b05 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -224,6 +224,7 @@ module.exports = { var keepAlive = setInterval(function(){ //this is to keep the connection open, just to send PING, and receive PONG, and will be extended to validate the health of the connection later manager.ping(conn, PONG); + }, 2000);//ping/pong every second conn.once('close', function(){ @@ -232,10 +233,13 @@ module.exports = { conns = _.without(conns, conn); conn.destroy(); + clearInterval(keepAlive); }); }, + 'port': domain, + 'afterServerStarted': function() { //'listening' listener logger.info('cache manager started'); @@ -260,8 +264,9 @@ module.exports = { //expiration monitoring every 10 seconds var now = Date.now(), - cachesToPersist = []; + cachesToPersist = {}; + logger.info('[cache][maintain] at:%d upon namespaces:%j', now, _.keys(namespaces)); _.each(namespaces, function(cache, namespace){ var meta = metaOfNs(namespace), @@ -274,6 +279,7 @@ module.exports = { if(entry.expire <= now){ delete cache[key]; + delete cache[key + '/lock']; var notify = common.serialize({ 'token': CHN, @@ -281,6 +287,7 @@ module.exports = { 'key': key, 'value': cache[key] }); + _.each(conns, function(c){ common.write(c, notify); }); @@ -293,13 +300,16 @@ module.exports = { } }); + logger.info('[cache][maintain] expiration finished, and persist the following:%j', _.keys(cachesToPersist)); when.map(cachesToPersist, function(cache, namespace){ var waitForPersist = when.defer(), persistence = path.join(persistPath, namespace + '.cache'); - fs.writeFile(persistPath, common.serialize(persists), function(err){ + fs.writeFile(persistence, common.serialize(persists), function(err){ + + logger.info('[cache][maintain] persisted:%s %s', persistence, err ? 'with error' : 'successfully'); waitForPersist.resolve(!err); }); From 79c64b4146955ad543f5208e0ab124a5c39c0ea9 Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 25 Sep 2013 00:12:45 -0700 Subject: [PATCH 055/182] Update README.md --- README.md | 75 +++++++++++++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index a1eea98..a009a7e 100644 --- a/README.md +++ b/README.md @@ -23,25 +23,30 @@ before it gets slow. ## caching -This is as exciting as debugging, it allows workers to share computation results, watch over others, in a fast and reliable manner. +This is as exciting as debugging, it allows workers to share computation results, watch over changes, in a fast and reliable manner. We tried work delegation to master once, and found it error-prone and difficult to code against, caching makes things so much simpler, using domain socket, so much faster. The atomic getOrLoad syntax makes sharing efficient, running cache manager as another worker and persistence support make it disaster recoverable. It's like having a memcached process, only this is node, and you can debug it too. -* **`user`** +* **`cache`** ```javascript -require('cluster/cache-user').user().then(function(usr){ -//the usr is the major api cluster application could then interact with -//the usr is the same accross the entire worker process +require('cluster/cache').use('cache-name', { + 'persist': true,//default false + 'expire': 60000 //in ms, default 0, meaning no expiration +}) +.then(function(cache){ +//the cache is the major api cluster application could then interact with +//the cache values are the same accross the entire worker process +//'cache-name' is a namespace, #use will create such namespace if yet exists }); ``` * **`keys`** ```javascript -var usr;//assume the usr has been assigned as above +var cache;//assume the cache is in use as above -usr.keys({ +cache.keys({ 'wait': 100//this is a timeout option }) .then(function(keys){ @@ -51,45 +56,47 @@ usr.keys({ * **`get`** ```javascript -var usr;//assume the usr has been assigned as above +var cache; -usr.get('cache-key-1', //key must be string +cache.get('cache-key-1', //key must be string function(){ - return 'cache-value-loaded-1'; + return 'cache-value-loaded-1'; //value could be value or promise }, { - 'persist': false,//default false, otherwise the loaded value will be persisted, if not loaded, the persistence info will be returned - 'expire': 10000,//default null, otherwise it means in how many ms the key/value should be expired if not loaded. 'wait': 100//this is a timeout option }) - .then(function(value, persist, expire){ + .then(function(value){ //the value resolved is anything already cached or the value newly loaded //note, the loader will be called once and once only, if it failed, the promise of get will be rejected. + }) + .otherwise(function(error){ + }); ``` * **`set`** ```javascript -var usr;//assume the usr has been assigned as above +var cache; -usr.set('cache-key-1', //key must be string +cache.set('cache-key-1', //key must be string 'cache-value-loaded-1', //value could be any json object { - 'persist': false, - 'expire': 10000, 'leaveIfNotNull': false,//default false, which allows set to overwrite existing values, use true for the atomic getAndLoad 'wait': 100 }) .then(function(happens){ //the happens resolved is a true/false value indicating if the value has been accepted by the cache manager + }) + .otherwise(function(error){ + }); ``` * **`del`** ```javascript -var usr;//assume the usr has been assigned as above +var cache; -usr.del('cache-key-1', //key must be string +cache.del('cache-key-1', //key must be string { 'wait': 100//this is a timeout option }) @@ -100,36 +107,16 @@ usr.del('cache-key-1', //key must be string * **`watch`** ```javascript -var usr;//assume the usr has been assigned as above +var cache; -usr.watch('cache-key-1', //key must be string - function watching(value){ +cache.watch('cache-key-1', //key must be string or null (indicating watch everything) + function watching(value, key){ //this is a callback which will be called anytime the associatd key has an updated value }); ``` * **`unwatch`** ```javascript -var usr;//assume the usr has been assigned as above - -usr.unwatch('cache-key-1', watching);//stop watching - -``` -* **`makeCopy`** - -```javascript -var usr;//assume the usr has been assigned as above - -usr.makeCopy(); -//this forces the user to keep copy of cache manager whenever a value is loaded, it also watches any change and update the copy automatically -//this option is to make the cache more reliable but could cause consistency problem when the cache manager dies -``` -* **`unmakeCopy`** +var cache; -```javascript -var usr;//assume the usr has been assigned as above - -usr.unmakeCopy(); -//the opposite as makeCopy, and the default behavior, no copy is kept locally, all queries go to cache manager -//which maximizes the consistency, but availability will be hurt when the cache manager is in the middle over recovery -``` +.unwatch('cache-key-1', watching);//stop watching From 687ed2ad5d643931fa026c64877ff7bc3520d3c5 Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 25 Sep 2013 00:46:16 -0700 Subject: [PATCH 056/182] Update README.md api draft --- README.md | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a009a7e..46a26e7 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,41 @@ You'll see that we've simplified the api a great deal, the listen method takes n That's based on the adoption of Promise A+ (when.js). You'll also find redundant features like: multiple app/port support, ecv on workers removed, to keep code clean. +* **`cluster`** + +```javascript +var Cluster = require('cluster2').Cluster; + +var runtime = new Cluster({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'monPort': 9091, + 'debug': { //node-inspector integration + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'control', + 'root': '/ecv' + } + 'heartbeatInterval': 5000 //heartbeat rate +}); + +runtime.listen() +.then(function(resolved){ + //cluster started + //resolved is an object which embeds server, app, port, etc. +}) +.otherwise(function(error){ + //cluster start error +}); +//the major change is the return of promise and the much simplified #listen (as all options pushed to construction) + +``` + ## debug Ever imagined debugging to be simpler? Here's the good news, we've carefully designed the debugging process from the ground up of the new cluster. @@ -119,4 +154,58 @@ cache.watch('cache-key-1', //key must be string or null (indicating watch everyt ```javascript var cache; -.unwatch('cache-key-1', watching);//stop watching +cache.unwatch('cache-key-1', watching);//stop watching +``` + +## status + +This is a helpful piece evolved from the current cluster2, which is to allow applications to easily register status of any interest. +It allows each worker to register its own state, master would automatically aggregate all states from active workers. +It works nicely with our monitor capability (via debug middleware) + +* **`register`** + +```javascript +require('cluster/status') + .register('status-name', + function(){ + return 'view';//view function + }, + function(value){ + //update function + }); +``` + +* **`statuses`** + +```javascript +require('cluster/status') + .statuses(); //return names of registered statuses +``` + +* **`getStatus`** + +```javascript +require('cluster/status') + .getStatus('status-name') + .then(function(status){ + //got status + }) + .otherwise(function(error){ + //err + }); +``` + +* **`setStatus`** + +```javascript +require('cluster/status') + .setStatus('status-name', + 'value') + .then(function(set){ + //set or not + }) + .otherwise(function(error){ + //err + }); +``` From cbc33052968346abe718cd83ce5684d9abe2ab83 Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 25 Sep 2013 00:58:29 -0700 Subject: [PATCH 057/182] + refactorings to alter the order of watch callback for 'null' key, which aligns with the watch callback for non null --- lib/cache-usr.js | 4 ++-- lib/monitor.js | 4 ++-- test/cache-test.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 6146dfb..778b8f6 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -74,10 +74,10 @@ var success = common.status.success, if(token === CHN){ changes[namespace] = changes[namespace] || {}; _.each(changes[namespace][key] || [], function(whenChange){ - whenChange(value); + whenChange(value, key); }); - _.invoke(anyChanges[namespace] || [], 'call', null, key, value); + _.invoke(anyChanges[namespace] || [], 'call', null, value, key); } else if(token === PONG){//just to keep the connection open common.write(connecting, common.serialize({ diff --git a/lib/monitor.js b/lib/monitor.js index 476abe3..e8e912e 100644 --- a/lib/monitor.js +++ b/lib/monitor.js @@ -123,7 +123,7 @@ exports.monCreateServer = function createServer(app){ } watchings.push(namespace); - usr.watch(namespace, null, function(key, value){ + usr.watch(namespace, null, function(value, key){ logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); usr.inspect(namespace, key).then(function(status){ @@ -135,7 +135,7 @@ exports.monCreateServer = function createServer(app){ }, watchFresh = _.once(function(usr){ - usr.watch('', null, function(namespace, value){ + usr.watch('', null, function(value, namespace){ logger.info('[monitor][cache] detects new namespace:%s', namespace); fs.readFile(path.join(__dirname, '/public/views/caches.ejs'), { diff --git a/test/cache-test.js b/test/cache-test.js index dff4b25..5d166b2 100644 --- a/test/cache-test.js +++ b/test/cache-test.js @@ -48,14 +48,14 @@ describe('cache', function(){ logger.info('[test] first "key" get attempt should fail:%j', value); should.not.exist(value); - usr.watch(namespace, 'key', function(value){ + usr.watch(namespace, 'key', function(value, key){ value.should.equal('value'); logger.info('[test] watch key triggered'); }); - usr.watch(namespace, null, function(key, value){ + usr.watch(namespace, null, function(value, key){ key.should.equal('key'); value.should.equal('value'); From aa6319dc149a8d0d96eb7c4435501a972fbe5bc9 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 15:00:14 -0700 Subject: [PATCH 058/182] + refactorings and simplifications - useCache from master & worker - '.js' dependencies from all references - Cluster class, using #listen, and plan to support #run as 2 functions - Cluster as emitter instance, use require('cluster2/emitter') directly, if overwritten with your own emitter, then that should be what u want to register handlers to. --- examples/cluster-demo.js | 5 +- lib/cache-mgr.js | 26 +++++-- lib/index.js | 147 ++++++++++++++++++--------------------- lib/master.js | 36 ++++++---- lib/monitor.js | 2 +- lib/shutdown.js | 2 +- lib/worker.js | 5 -- 7 files changed, 111 insertions(+), 112 deletions(-) diff --git a/examples/cluster-demo.js b/examples/cluster-demo.js index b0bc393..ff7dcf1 100644 --- a/examples/cluster-demo.js +++ b/examples/cluster-demo.js @@ -1,6 +1,6 @@ 'use strict'; -var Cluster = require('../lib/index.js').Cluster, +var listen = require('../lib/index').listen, util = require('util'), express = require('express'), app = express(); @@ -31,7 +31,7 @@ app.get('/', function(req, res){ }); }); -new Cluster({ +listen({ 'noWorkers': 1, 'createServer': require('http').createServer, 'app': app, @@ -43,7 +43,6 @@ new Cluster({ }, 'heartbeatInterval': 5000 }) -.listen() .then(function(resolve){ var masterOrWorker = resolve.master || resolve.worker; diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 7d85b05..8d079ac 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -1,6 +1,6 @@ 'use strict'; -var common = require('./cache-common.js'), +var common = require('./cache-common'), _ = require('underscore'), fs = require('graceful-fs'), os = require('os'), @@ -9,7 +9,7 @@ var common = require('./cache-common.js'), path = require('path'), when = require('when'), timeout = require('when/timeout'), - ensureDir = require('./utils.js').ensureDir; + ensureDir = require('./utils').ensureDir; var success = common.status.success, failure = common.status.failure, @@ -242,11 +242,14 @@ module.exports = { 'afterServerStarted': function() { //'listening' listener - logger.info('cache manager started'); + logger.info('[cache] manager started'); ensureDir(persistPath); var persists = fs.readdirSync(persistPath) || []; + + logger.info('[cache] manager loading from persistences: %j', persists); + _.each(persists, function(p){ var filter = /^(.+)\.cache$/, @@ -257,6 +260,15 @@ module.exports = { } }); + namespaces[''] = namespaces[''] || {}; + namespaces[''][''] = { //meta of meta namespace itself + 'value': { //meta value + 'persist': true, //persist true + 'expire': 0 //never expire + } + }; + logger.info('[cache] manager loaded from all persistences'); + //register domain to where all other users and the master process could watch fs.writeFileSync(domainPath, domain); @@ -302,12 +314,14 @@ module.exports = { logger.info('[cache][maintain] expiration finished, and persist the following:%j', _.keys(cachesToPersist)); - when.map(cachesToPersist, function(cache, namespace){ + when.all(_.map(cachesToPersist, function(cache, namespace){ var waitForPersist = when.defer(), persistence = path.join(persistPath, namespace + '.cache'); + + logger.info('[cache][maintain] to persist namespace:%s to:%s', namespace, persistence); - fs.writeFile(persistence, common.serialize(persists), function(err){ + fs.writeFile(persistence, common.serialize(cache), function(err){ logger.info('[cache][maintain] persisted:%s %s', persistence, err ? 'with error' : 'successfully'); @@ -315,7 +329,7 @@ module.exports = { }); return timeout(waitForPersist, 10000);//too big? - }) + })) .ensure(function(){ setTimeout(updateTask, 10000); diff --git a/lib/index.js b/lib/index.js index a6bcc3f..a9efcc5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -16,77 +16,13 @@ 'use strict'; -var readMasterPid = require('./utils.js').readMasterPid, - getLogger = require('./utils.js').getLogger, +var readMasterPid = require('./utils').readMasterPid, + getLogger = require('./utils').getLogger, when = require('when'), assert = require('assert'), os = require('os'), _ = require('underscore'); -var Cluster = exports.Cluster = function Cluster(options) { - - exports.getLogger = process.getLogger = options.getLogger || getLogger; - assert.ok(process.getLogger); - - // Trap all uncaught exception here. - process.on('uncaughtException', function (error) { - - process.getLogger(__filename).error(error.stack || error); - }); - - var emitter = require('./emitter'); - this.options = { - 'emitter': emitter, - 'noWorkers': os.cpus().length, - 'monCreateServer': require('./monitor').monCreateServer, - 'monApp': require('./monitor').monApp, - 'monPort': 8081, - 'createServer': require('http').createServer, - 'app': null,//must be provided by the options - 'port': 8080, - 'warmUp': function(){ - - }, - 'markOld': null, //should be a function determine if worker is old or not - 'stopTimeout': 60000,//1 min - 'debug': { - 'webPort': 8082, - 'debugPort': 5858, - 'saveLiveEdit': false, - 'hidden':[] - }, - 'ecv': { - 'root': '/ecv', - 'mode': 'control', - 'disable': true, - 'markUp': '/ecv/enable', - 'markDown': '/ecv/disable', - 'emitter': emitter - } - }; - - _.extend(this.options.ecv, options.ecv || {}); - _.extend(this.options.debug, options.debug || {}); - _.extend(this.options, _.omit(options, 'ecv', 'debug')); - - assert.ok(this.options.monCreateServer); - assert.ok(this.options.monApp); - assert.ok(this.options.monPort); - assert.ok(this.options.createServer); - assert.ok(this.options.app); - assert.ok(this.options.port); - assert.notEqual(this.options.port, this.options.monPort, "monitor port & application port cannot use the same!"); - assert.notEqual(this.options.port, this.options.debugPort, "debug port & application port cannot use the same!"); - assert.notEqual(this.options.monPort, this.options.debugPort, "monitor port & debug port cannot use the same!"); - - _.extend(this, { - 'on': _.bind(emitter.on, emitter), - 'once': _.bind(emitter.once, emitter), - 'removeListener': _.bind(emitter.removeListener, emitter), - 'emit': _.bind(emitter.emit, emitter) - }); -}; - /** * @return promise of Server starts * @@ -112,27 +48,76 @@ var Cluster = exports.Cluster = function Cluster(options) { * masterOrWorker.emitter;//gives the event emitter in use of the cluster * masterOrWorker.useCache();//gives the cache user promise, which after resolved would allow users to access cluster caching */ -Cluster.prototype.listen = function() { +exports.listen = function listen(options) { + + exports.getLogger = process.getLogger = options.getLogger || getLogger; + assert.ok(process.getLogger); - var Master = require('./master.js').Master; + // Trap all uncaught exception here. + process.on('uncaughtException', function (error) { + + process.getLogger(__filename).error(error.stack || error); + }); - return new Master(process, this.options).listen(); + var emitter = require('./emitter'), + actualOptions = { + 'emitter': emitter, + 'noWorkers': os.cpus().length, + 'monCreateServer': require('./monitor').monCreateServer, + 'monApp': require('./monitor').monApp, + 'monPort': 8081, + 'createServer': require('http').createServer, + 'app': null,//must be provided by the options + 'port': 8080, + 'warmUp': function(){ + + }, + 'markOld': null, //should be a function determine if worker is old or not + 'stopTimeout': 60000,//1 min + 'debug': { + 'webPort': 8082, + 'debugPort': 5858, + 'saveLiveEdit': false, + 'hidden':[] + }, + 'ecv': { + 'root': '/ecv', + 'mode': 'control', + 'disable': true, + 'markUp': '/ecv/enable', + 'markDown': '/ecv/disable', + 'emitter': emitter + }, + 'cache': { + 'enable': true, + 'mode': 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + } + }; + + _.extend(actualOptions.ecv, options.ecv || {}); + _.extend(actualOptions.debug, options.debug || {}); + _.extend(actualOptions.cache, options.debug || {}); + _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache')); + + assert.ok(actualOptions.monCreateServer); + assert.ok(actualOptions.monApp); + assert.ok(actualOptions.monPort); + assert.ok(actualOptions.createServer); + assert.ok(actualOptions.app); + assert.ok(actualOptions.port); + assert.notEqual(actualOptions.port, actualOptions.monPort, "monitor port & application port cannot use the same!"); + assert.notEqual(actualOptions.port, actualOptions.debugPort, "debug port & application port cannot use the same!"); + assert.notEqual(actualOptions.monPort, actualOptions.debugPort, "monitor port & debug port cannot use the same!"); + + var Master = require('./master').Master; + + return new Master(process, actualOptions).listen(); }; /** - * asynchronously shutdown the master process and let Master finishes its workers on behalf of the cluster - * the master's pid is persisted under ./pids with the pattern of 'master.pid' + * experimental support to run anything, no need to be a server */ -Cluster.prototype.shutdown = function () { - - var masterPid = readMasterPid(); - - process.kill(masterPid, 'SIGINT'); +exports.run = function run(options){ - //in case the graceful shutdown doesn't complete, send the TERM signal instead. - setTimeout(function(){ - process.kill(masterPid, 'SIGTERM'); - }, - this.stopTimeout); }; diff --git a/lib/master.js b/lib/master.js index ba90d8f..8995ead 100644 --- a/lib/master.js +++ b/lib/master.js @@ -7,12 +7,12 @@ var _ = require('underscore'), assert = require('assert'), util = require('util'), BigNumber = require('bignumber.js'), - Worker = require('./worker.js').Worker, - Puppet = require('./puppet.js').Puppet, - rejectIfPortBusy = require('./utils.js').rejectIfPortBusy, - writePid = require('./utils.js').writePid, - startInspector = require('./utils.js').startInspector, - enable = require('./ecv.js').enable; + Worker = require('./worker').Worker, + Puppet = require('./puppet').Puppet, + rejectIfPortBusy = require('./utils').rejectIfPortBusy, + writePid = require('./utils').writePid, + startInspector = require('./utils').startInspector, + enable = require('./ecv').enable; var masterDeferred = when.defer(), masterPromise = exports.master = masterDeferred.promise; @@ -44,9 +44,20 @@ Master.prototype.initialize = function(proc, options){ 'port': options.monPort, 'warmUp': function(){ - _this.fork(_this.options, { - 'CACHE_MANAGER': true - }); + if(options.cache.enable){ + + if(options.cache.mode === 'standalone'){ + _this.fork(_this.options, { + 'CACHE_MANAGER': true + }); + } + else{ + var mgr = require('./cache-mgr'), + svr = mgr.createServer(mgr.app); + + svr.listen(mgr.port, mgr.afterServerStarted); + } + } enable(options.monApp, options.ecv); @@ -165,7 +176,7 @@ Master.prototype.initialize = function(proc, options){ } else if(proc.env.CACHE_MANAGER){ - var manager = require('./cache-mgr.js'); + var manager = require('./cache-mgr'); _.extend(options, { 'createServer': manager.createServer, 'app': manager.app, @@ -220,11 +231,6 @@ Master.prototype.listen = function(){ }); }; -Master.prototype.useCache = function useCache(domain){ - - return require('./cache-usr.js').user(domain); -}; - Master.prototype.debug = function debug(pid){ var _this = this, diff --git a/lib/monitor.js b/lib/monitor.js index e8e912e..b9b9ad2 100644 --- a/lib/monitor.js +++ b/lib/monitor.js @@ -164,7 +164,7 @@ exports.monCreateServer = function createServer(app){ masterPromise.then(function(){ - require('./cache-usr.js').user().then(function(usr){ + require('./cache-usr').user().then(function(usr){ usr.ns() .then(function(namespaces){ diff --git a/lib/shutdown.js b/lib/shutdown.js index cc13d20..5ce4fbd 100644 --- a/lib/shutdown.js +++ b/lib/shutdown.js @@ -1,5 +1,5 @@ 'use strict'; -var readMasterPid = require('./utils.js').readMasterPid; +var readMasterPid = require('./utils').readMasterPid; process.kill(readMasterPid(), 'SIGINT'); diff --git a/lib/worker.js b/lib/worker.js index 16e418f..a36f7c8 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -142,11 +142,6 @@ Worker.prototype.listen = function(){ }); }; -Worker.prototype.useCache = function useCache(domain){ - - return require('./cache-usr.js').user(domain); -}; - Worker.prototype.whenConnected = function whenConnected(conn) { var _this = this; From 7aef21eabaf4bced9ba71dd2a0a7c7b6e4d73acf Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 15:20:38 -0700 Subject: [PATCH 059/182] ~ adding 'isMaster', 'isWorker' api to give same api for 'cluster' ~ 'workers' isn't provided because cluster2 doesn't know the workers, only the created master knows. --- lib/index.js | 153 +++++++++++++++++++++++++---------------------- lib/master.js | 4 +- lib/worker.js | 4 +- test/api-test.js | 31 ++++++++++ 4 files changed, 120 insertions(+), 72 deletions(-) create mode 100644 test/api-test.js diff --git a/lib/index.js b/lib/index.js index a9efcc5..520b9d7 100644 --- a/lib/index.js +++ b/lib/index.js @@ -48,76 +48,89 @@ var readMasterPid = require('./utils').readMasterPid, * masterOrWorker.emitter;//gives the event emitter in use of the cluster * masterOrWorker.useCache();//gives the cache user promise, which after resolved would allow users to access cluster caching */ -exports.listen = function listen(options) { - - exports.getLogger = process.getLogger = options.getLogger || getLogger; - assert.ok(process.getLogger); - - // Trap all uncaught exception here. - process.on('uncaughtException', function (error) { - - process.getLogger(__filename).error(error.stack || error); - }); - - var emitter = require('./emitter'), - actualOptions = { - 'emitter': emitter, - 'noWorkers': os.cpus().length, - 'monCreateServer': require('./monitor').monCreateServer, - 'monApp': require('./monitor').monApp, - 'monPort': 8081, - 'createServer': require('http').createServer, - 'app': null,//must be provided by the options - 'port': 8080, - 'warmUp': function(){ - - }, - 'markOld': null, //should be a function determine if worker is old or not - 'stopTimeout': 60000,//1 min - 'debug': { - 'webPort': 8082, - 'debugPort': 5858, - 'saveLiveEdit': false, - 'hidden':[] - }, - 'ecv': { - 'root': '/ecv', - 'mode': 'control', - 'disable': true, - 'markUp': '/ecv/enable', - 'markDown': '/ecv/disable', - 'emitter': emitter - }, - 'cache': { - 'enable': true, - 'mode': 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master - } - }; - - _.extend(actualOptions.ecv, options.ecv || {}); - _.extend(actualOptions.debug, options.debug || {}); - _.extend(actualOptions.cache, options.debug || {}); - _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache')); - - assert.ok(actualOptions.monCreateServer); - assert.ok(actualOptions.monApp); - assert.ok(actualOptions.monPort); - assert.ok(actualOptions.createServer); - assert.ok(actualOptions.app); - assert.ok(actualOptions.port); - assert.notEqual(actualOptions.port, actualOptions.monPort, "monitor port & application port cannot use the same!"); - assert.notEqual(actualOptions.port, actualOptions.debugPort, "debug port & application port cannot use the same!"); - assert.notEqual(actualOptions.monPort, actualOptions.debugPort, "monitor port & debug port cannot use the same!"); - - var Master = require('./master').Master; - - return new Master(process, actualOptions).listen(); -}; +module.exports = { -/** - * experimental support to run anything, no need to be a server - */ -exports.run = function run(options){ + 'listen': function listen(options) { -}; + exports.getLogger = process.getLogger = options.getLogger || getLogger; + assert.ok(process.getLogger); + + // Trap all uncaught exception here. + process.on('uncaughtException', function (error) { + + process.getLogger(__filename).error(error.stack || error); + }); + + var emitter = require('./emitter'), + actualOptions = { + 'emitter': emitter, + 'noWorkers': os.cpus().length, + 'monCreateServer': require('./monitor').monCreateServer, + 'monApp': require('./monitor').monApp, + 'monPort': 8081, + 'createServer': require('http').createServer, + 'app': null,//must be provided by the options + 'port': 8080, + 'warmUp': function(){ + + }, + 'markOld': null, //should be a function determine if worker is old or not + 'stopTimeout': 60000,//1 min + 'debug': { + 'webPort': 8082, + 'debugPort': 5858, + 'saveLiveEdit': false, + 'hidden':[] + }, + 'ecv': { + 'root': '/ecv', + 'mode': 'control', + 'disable': true, + 'markUp': '/ecv/enable', + 'markDown': '/ecv/disable', + 'emitter': emitter + }, + 'cache': { + 'enable': true, + 'mode': 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + } + }; + + _.extend(actualOptions.ecv, options.ecv || {}); + _.extend(actualOptions.debug, options.debug || {}); + _.extend(actualOptions.cache, options.debug || {}); + _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache')); + + assert.ok(actualOptions.monCreateServer); + assert.ok(actualOptions.monApp); + assert.ok(actualOptions.monPort); + assert.ok(actualOptions.createServer); + assert.ok(actualOptions.app); + assert.ok(actualOptions.port); + assert.notEqual(actualOptions.port, actualOptions.monPort, "monitor port & application port cannot use the same!"); + assert.notEqual(actualOptions.port, actualOptions.debugPort, "debug port & application port cannot use the same!"); + assert.notEqual(actualOptions.monPort, actualOptions.debugPort, "monitor port & debug port cannot use the same!"); + var Master = require('./master').Master; + + return new Master(process, actualOptions).listen(); + }, + + /** + * experimental support to run anything, no need to be a server + */ + 'run': function run(options){ + + }, + + get isMaster(){ + + return require('cluster').isMaster; + }, + + get isWorker(){ + + return require('cluster').isWorker; + } + +}; diff --git a/lib/master.js b/lib/master.js index 8995ead..20851d2 100644 --- a/lib/master.js +++ b/lib/master.js @@ -126,7 +126,9 @@ Master.prototype.initialize = function(proc, options){ 'puppets': { }, - 'status': require('./status') + 'status': require('./status'), + 'isMaster': true, + 'isWorker': false }); cluster.on('fork', function(worker){//interestingly, on fork or #fork could complete in disorder... diff --git a/lib/worker.js b/lib/worker.js index a36f7c8..42c9f5a 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -42,7 +42,9 @@ var Worker = exports.Worker = function(proc, options){ 'error': { 'count': 0, 'fatal': 0 - } + }, + 'isMaster': false, + 'isWorker': true }); gc.onGC(_.bind(_this.whenGC, _this)); diff --git a/test/api-test.js b/test/api-test.js new file mode 100644 index 0000000..f59d8c7 --- /dev/null +++ b/test/api-test.js @@ -0,0 +1,31 @@ +'use strict'; + +var should = require('should'); + +describe('cluster2', function(){ + + describe('#isMaster', function(){ + + it('should assert true', function(done){ + + var cluster2 = require('../lib/index'); + cluster2.isMaster.should.equal(true); + cluster2.isWorker.should.equal(false); + + done(); + + }); + + }); + + describe('#listen', function(){ + + it('should start listening app', function(done){ + + done(); + + }); + + }); + +}); \ No newline at end of file From 135235a662583c5b7f0b5b03cea390bb0ee2a4d1 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 15:31:44 -0700 Subject: [PATCH 060/182] ~ fix #markOld --- lib/master.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/master.js b/lib/master.js index 20851d2..e0965a2 100644 --- a/lib/master.js +++ b/lib/master.js @@ -82,8 +82,7 @@ Master.prototype.initialize = function(proc, options){ //besides, even if markOld succeeded, we should not immediately start a successor and kill the original, that task must be //queued to make sure no more than one old worker gets collected at the same time - var _this = this, - pid = heartbeat.pid, + var pid = heartbeat.pid, puppet = _this.puppets[pid], currTPS = heartbeat.durations / heartbeat.transactions; From c304ec98f7ed0f853174bcfa6969eb5fc6517c4d Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 15:47:40 -0700 Subject: [PATCH 061/182] + persistence meta: lastModified, lastPersisted to avoid unneeded persistence --- lib/cache-mgr.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 8d079ac..04f88c1 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -30,7 +30,9 @@ var success = common.status.success, '': { //meta of meta namespace itself 'value': { //meta value 'persist': true, //persist true - 'expire': 0 //never expire + 'expire': 0, //never expire + 'lastModified': 0, + 'lastPersisted': 0 } } } @@ -97,12 +99,15 @@ var manager = { if(write){ + meta.lastModified = Date.now(); + var notify = common.serialize({ 'token': CHN, 'namespace': namespace, 'key': key, 'value': cache[key]['value'] }); + _.each(conns, function(c){ common.write(c, notify); }); @@ -151,6 +156,8 @@ var manager = { delete cache[key]; delete cache[key + '/lock'];//locker released too + metaOfNs(namespace).lastModified = Date.now(); + common.write(conn, common.serialize({ 'type': DEL, 'token': token, @@ -165,6 +172,7 @@ var manager = { 'key': key, 'value': value }); + _.each(conns, function(c){ common.write(c, notify); }); @@ -307,7 +315,7 @@ module.exports = { }); } - if(persist){ + if(persist && (meta.lastPersisted < meta.lastModified)){ cachesToPersist[namespace] = cache; } }); @@ -325,6 +333,8 @@ module.exports = { logger.info('[cache][maintain] persisted:%s %s', persistence, err ? 'with error' : 'successfully'); + metaOfNs(namespace).lastPersisted = Date.now(); + waitForPersist.resolve(!err); }); From 064059c5a02ef4f12dc67ab247d5bc7ce5b53324 Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 15:49:18 -0700 Subject: [PATCH 062/182] + --- lib/cache-usr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 778b8f6..786f6d9 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -6,7 +6,7 @@ var _ = require('underscore'), when = require('when'), timeout = require('when/timeout'), fs = require('graceful-fs'), - common = require('./cache-common.js'); + common = require('./cache-common'); var success = common.status.success, failure = common.status.failure, From 3352821c8f802159a5956b74b0de5c081aff4b7c Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 18:17:35 -0700 Subject: [PATCH 063/182] + experimental support for #run compared with #listen --- lib/cache-usr.js | 8 ++++++-- lib/index.js | 50 +++++++++++++++++++++++++++++++++++++++++++++--- lib/master.js | 38 ++++++++++++++++++++++-------------- lib/worker.js | 18 +++++++++++++++++ test/api-test.js | 12 +++++++++++- 5 files changed, 106 insertions(+), 20 deletions(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 786f6d9..b7f823c 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -209,8 +209,12 @@ var user = process.user || { 'wait': wait }) .then(function(){ - + //set succeeded tillGet.resolve(value); + }, + function(error){ + //set failed + tillGet.reject(error); }); }, //error handling @@ -230,7 +234,7 @@ var user = process.user || { } else{//got nothing - tillGet.resolve(null); + tillGet.resolve(null);//no value, but resolved } }; diff --git a/lib/index.js b/lib/index.js index 520b9d7..84f424b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -98,7 +98,7 @@ module.exports = { _.extend(actualOptions.ecv, options.ecv || {}); _.extend(actualOptions.debug, options.debug || {}); - _.extend(actualOptions.cache, options.debug || {}); + _.extend(actualOptions.cache, options.cache || {}); _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache')); assert.ok(actualOptions.monCreateServer); @@ -108,8 +108,8 @@ module.exports = { assert.ok(actualOptions.app); assert.ok(actualOptions.port); assert.notEqual(actualOptions.port, actualOptions.monPort, "monitor port & application port cannot use the same!"); - assert.notEqual(actualOptions.port, actualOptions.debugPort, "debug port & application port cannot use the same!"); - assert.notEqual(actualOptions.monPort, actualOptions.debugPort, "monitor port & debug port cannot use the same!"); + assert.notEqual(actualOptions.port, actualOptions.debug.debugPort, "debug port & application port cannot use the same!"); + assert.notEqual(actualOptions.monPort, actualOptions.debug.debugPort, "monitor port & debug port cannot use the same!"); var Master = require('./master').Master; @@ -121,6 +121,50 @@ module.exports = { */ 'run': function run(options){ + exports.getLogger = process.getLogger = options.getLogger || getLogger; + assert.ok(process.getLogger); + + // Trap all uncaught exception here. + process.on('uncaughtException', function (error) { + + process.getLogger(__filename).error(error.stack || error); + }); + + var emitter = require('./emitter'), + actualOptions = { + 'emitter': emitter, + 'noWorkers': os.cpus().length, + 'monCreateServer': require('./monitor').monCreateServer, + 'monApp': require('./monitor').monApp, + 'monPort': 8081, + 'runnable': options.runnable, + 'markOld': null, //should be a function determine if worker is old or not + 'stopTimeout': 60000,//1 min + 'debug': { + 'webPort': 8082, + 'debugPort': 5858, + 'saveLiveEdit': false, + 'hidden':[] + }, + 'cache': { + 'enable': true, + 'mode': 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + } + }; + + _.extend(actualOptions.debug, options.debug || {}); + _.extend(actualOptions.cache, options.cache || {}); + _.extend(actualOptions, _.omit(options, 'debug', 'cache')); + + assert.ok(actualOptions.monCreateServer); + assert.ok(actualOptions.monApp); + assert.ok(actualOptions.monPort); + assert.ok(actualOptions.runnable); + assert.notEqual(actualOptions.monPort, actualOptions.debug.debugPort, "monitor port & debug port cannot use the same!"); + + var Master = require('./master').Master; + + return new Master(process, actualOptions).run(); }, get isMaster(){ diff --git a/lib/master.js b/lib/master.js index e0965a2..e32e9c0 100644 --- a/lib/master.js +++ b/lib/master.js @@ -39,6 +39,7 @@ Master.prototype.initialize = function(proc, options){ 'process': proc, 'emitter': options.emitter, 'logger': process.getLogger(__filename), + 'runnable': options.runnable, 'createServer': options.monCreateServer, 'app': options.monApp, 'port': options.monPort, @@ -155,23 +156,25 @@ Master.prototype.initialize = function(proc, options){ process.once('SIGINT', _.bind(_this.whenStop, _this)); process.once('SIGTERM', _.bind(_this.whenExit, _this)); - assert.ok(_this.createServer); - assert.ok(_this.app); - assert.ok(_this.port); + if(!_this.runnable){//if not runnable, it must have server application + assert.ok(_this.createServer); + assert.ok(_this.app); + assert.ok(_this.port); - when.all([ - rejectIfPortBusy('localhost', options.port), - rejectIfPortBusy('localhost', options.monPort), - rejectIfPortBusy('localhost', _this['debug.debugPort']), - rejectIfPortBusy('localhost', _this['debug.webPort']) - ]) - .otherwise(function(error){ + when.all([ + rejectIfPortBusy('localhost', options.port), + rejectIfPortBusy('localhost', options.monPort), + rejectIfPortBusy('localhost', _this['debug.debugPort']), + rejectIfPortBusy('localhost', _this['debug.webPort']) + ]) + .otherwise(function(error){ - _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port; error:%j', - [options.port, options.monPort, _this['debug.debugPort'], _this['debug.webPort'], error]); + _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port; error:%j', + [options.port, options.monPort, _this['debug.debugPort'], _this['debug.webPort'], error]); - process.exit(-1); - }); + process.exit(-1); + }); + } return _this; } @@ -232,6 +235,13 @@ Master.prototype.listen = function(){ }); }; +Master.prototype.run = function(){ + + this.warmUp(); + + return this; +}; + Master.prototype.debug = function debug(pid){ var _this = this, diff --git a/lib/worker.js b/lib/worker.js index 42c9f5a..81026b9 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -18,6 +18,7 @@ var Worker = exports.Worker = function(proc, options){ 'process': proc, 'logger': proc.getLogger(__filename), 'options': options, + 'runnable': options.runnable, 'createServer': options.createServer, 'app': options.app, 'port': options.port, @@ -144,6 +145,23 @@ Worker.prototype.listen = function(){ }); }; +Worker.prototype.run = function(){ + + var _this = this, + runnable = _this.runnable, + debug = _this.debug, + wait = _this.timeout; + + assert.ok(runnable); + + if(!debug){ + runnable(); + } + else{ + _this.emitter.once('run', runnable); + } +}; + Worker.prototype.whenConnected = function whenConnected(conn) { var _this = this; diff --git a/test/api-test.js b/test/api-test.js index f59d8c7..4771a06 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -15,7 +15,7 @@ describe('cluster2', function(){ done(); }); - + }); describe('#listen', function(){ @@ -28,4 +28,14 @@ describe('cluster2', function(){ }); + describe('#run', function(){ + + it('should start running the given runnable', function(done){ + + done(); + + }); + + }); + }); \ No newline at end of file From a92a5281824c5e97ea9afd4adc8e3fb2fc2f31db Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 25 Sep 2013 18:27:45 -0700 Subject: [PATCH 064/182] Update README.md --- README.md | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 46a26e7..33d1584 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ You'll also find redundant features like: multiple app/port support, ecv on work * **`cluster`** ```javascript -var Cluster = require('cluster2').Cluster; +var listen = require('cluster2').listen; -var runtime = new Cluster({ +listen({ 'noWorkers': 1, //default number of cpu cores 'createServer': require('http').createServer, @@ -30,9 +30,7 @@ var runtime = new Cluster({ 'root': '/ecv' } 'heartbeatInterval': 5000 //heartbeat rate -}); - -runtime.listen() +}) .then(function(resolved){ //cluster started //resolved is an object which embeds server, app, port, etc. @@ -44,6 +42,38 @@ runtime.listen() ``` +## emitter + +Cluster used to be an emitter itself, which isn't very much helpful, and forced event register/emit to be delayed till the cluster instance is created. +Even if it's created, accessing the instance from different modules require the instance to be passed down, or global, neither looks appealing. +The new cluster-emitter is designed to work with cluster not cluster2 instance at all (in fact, we eliminated the cluster2 instance as you see the api above) +The emitter also makes communications between worker & master (or reverse) as simple as a normal EventEmitter. + +```javascript +var emitter = require('cluster2/emitter'); + +emitter.on('event', function callback(){ + //an event callback +}); + +emitter.once('event', function callbackOnce(){ + //another event callback +}); + +emitter.removeListener('event', callback); +emitter.removeListener('event', callbackOnce); +emitter.removeAllListeners('event'); + +emitter.emit('event', null, 'arg0', 'arg1'); +//the 'null' value above defaults to the default target of the event +//it varies in master and worker runtime, in master it's the same as saying +emitter.emit('event', ['self'].concat(_.map(cluster.workers, function(w){return w.process.pid;})), 'arg0', 'arg1'); +//as this indicates, the master's emit target by default is everybody, master itself and all active workers +//and in worker runtime, the null value is intepreted as worker itself and master +emitter.emit('event', ['self', 'master'], 'arg0', 'arg1'); + +``` + ## debug Ever imagined debugging to be simpler? Here's the good news, we've carefully designed the debugging process from the ground up of the new cluster. From 6f1c1c971d109883a67220793e626e9d846e7119 Mon Sep 17 00:00:00 2001 From: huz Date: Wed, 25 Sep 2013 18:29:25 -0700 Subject: [PATCH 065/182] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 33d1584..e3bacbf 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ It's like having a memcached process, only this is node, and you can debug it to * **`cache`** ```javascript -require('cluster/cache').use('cache-name', { +require('cluster2/cache').use('cache-name', { 'persist': true,//default false 'expire': 60000 //in ms, default 0, meaning no expiration }) @@ -196,7 +196,7 @@ It works nicely with our monitor capability (via debug middleware) * **`register`** ```javascript -require('cluster/status') +require('cluster2/status') .register('status-name', function(){ return 'view';//view function @@ -209,14 +209,14 @@ require('cluster/status') * **`statuses`** ```javascript -require('cluster/status') +require('cluster2/status') .statuses(); //return names of registered statuses ``` * **`getStatus`** ```javascript -require('cluster/status') +require('cluster2/status') .getStatus('status-name') .then(function(status){ //got status @@ -229,7 +229,7 @@ require('cluster/status') * **`setStatus`** ```javascript -require('cluster/status') +require('cluster2/status') .setStatus('status-name', 'value') .then(function(set){ From 938e77e31e3ea5044469510963ddb3fed1606bdc Mon Sep 17 00:00:00 2001 From: huzhou Date: Wed, 25 Sep 2013 19:54:42 -0700 Subject: [PATCH 066/182] + markOld bugfix, and API updates --- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++- lib/master.js | 6 +++-- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e3bacbf..4117f22 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ This is a completely overhaul, not expected to be backward compatible, but the f You'll see that we've simplified the api a great deal, the listen method takes no arguments at all, and all dancing parts could be injected through the construation. That's based on the adoption of Promise A+ (when.js). -You'll also find redundant features like: multiple app/port support, ecv on workers removed, to keep code clean. +You'll also find redundant features like: multiple app/port support, ecv on workers removed, none cluster mode removed, to keep code clean. * **`cluster`** @@ -74,6 +74,42 @@ emitter.emit('event', ['self', 'master'], 'arg0', 'arg1'); ``` +## ecv + +ECV is a preserved feature, but we've simplified that too. Most of the use cases we've seen doesn't really need an ECV for each worker process, in fact +that could be very confusing. To let tools view the cluster as an entirety, ECV is to run only in master runtime, it still supports the 'monitor' vs. 'control' mode. + +```javascript + +//ecv control could be used as such +var enable = require('cluster2/ecv').enable; + +enable(app); + +//more use cases just let cluster2 enables it by passing configurations to the #listen +var listen = require('cluster2').listen; + +listen({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'monPort': 9091, + 'debug': { //node-inspector integration + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'control',//could be 'monitor' or 'control' + 'root': '/ecv', + 'markUp': '/ecv/markUp', + 'markDown': '/ecv/markDown' + } + 'heartbeatInterval': 5000 //heartbeat rate +}) +``` + ## debug Ever imagined debugging to be simpler? Here's the good news, we've carefully designed the debugging process from the ground up of the new cluster. @@ -117,6 +153,29 @@ cache.keys({ .then(function(keys){ //the keys resolved is an array of all cached keys:string[] from the cache-manager's view }); + +//to use the cache, we assume u've started the cluster2 with caching enabled, and you can select how cache manager should be run +listen({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'monPort': 9091, + 'debug': { //node-inspector integration + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'control', + 'root': '/ecv' + }, + 'cache': { + 'enable': true,//true by default + 'mode': 'standalone'//as a standalone worker process by default, otherwise will crush with the master process + } + 'heartbeatInterval': 5000 //heartbeat rate +}) ``` * **`get`** diff --git a/lib/master.js b/lib/master.js index e32e9c0..d68f9d1 100644 --- a/lib/master.js +++ b/lib/master.js @@ -95,8 +95,10 @@ Master.prototype.initialize = function(proc, options){ 'tps': currTPS, 'cpu': heartbeat.cpu, 'memory': heartbeat.memory, - 'gc.incremental': heartbeat.gc.incremental, - 'gc.full': heartbeat.gc.full + 'gc': { + 'incremental': heartbeat.gc.incremental, + 'full': heartbeat.gc.full + } };//remember the peak of each puppet if(currTPS >= peak.tps){ From 92e8986135191006e2a559c6cc7ab768f0e43431 Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 26 Sep 2013 01:27:25 -0700 Subject: [PATCH 067/182] extracted assertOld to utils and added unit test for it --- lib/master.js | 54 +++------------------------- lib/puppet.js | 2 +- lib/utils.js | 39 ++++++++++++++++++++ lib/worker.js | 4 +-- test/utils-test.js | 89 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 134 insertions(+), 54 deletions(-) diff --git a/lib/master.js b/lib/master.js index d68f9d1..89fd316 100644 --- a/lib/master.js +++ b/lib/master.js @@ -12,19 +12,20 @@ var _ = require('underscore'), rejectIfPortBusy = require('./utils').rejectIfPortBusy, writePid = require('./utils').writePid, startInspector = require('./utils').startInspector, + assertOld = require('./utils').assertOld, enable = require('./ecv').enable; var masterDeferred = when.defer(), masterPromise = exports.master = masterDeferred.promise; -var Master = exports.Master = function(proc, options){ +var Master = exports.Master = _.once(function(proc, options){ var _this = this.initialize(proc, options); masterDeferred.resolve(_this); return _this; -}; +}); Master.prototype.initialize = function(proc, options){ @@ -70,54 +71,7 @@ Master.prototype.initialize = function(proc, options){ _this.markUp(); }, 'noWorkers': options.noWorkers, - 'markOld': options.markOld || function(heartbeat){ - - //TODO markOld heuristic - //when a worker has exceeds certain threshold of TPS we start sampling and identify when TPS could reach its plateau - //for each heartbeat, if the TPS goes up, whether CPU/memory/GC goes up/down, we take it as progress to its plateau - //once a plateau is identified, we will compare the upcoming TPS, CPU, memory, GC to determine if it's an old age - //that is when the TPS drop over a given percentage, say 10%, along with CPU, memory, GC growth, that's when we mark - //this worker as old, as its performance degrades possibly related to GC - //the 2nd step could be more conservative, using 2 consecutive occurances of the scenario as the criteria instead of 1. - //this is the current state of the heuristic, should work for most of the cases, and will be interesting to see how generalized it is. - //besides, even if markOld succeeded, we should not immediately start a successor and kill the original, that task must be - //queued to make sure no more than one old worker gets collected at the same time - - var pid = heartbeat.pid, - puppet = _this.puppets[pid], - currTPS = heartbeat.durations / heartbeat.transactions; - - if(currTPS <= 2){//TPS too low, no good for sampling as the 1st phase. - return false; - } - - var peak = puppet.peak = puppet.peak || { - 'tps': currTPS, - 'cpu': heartbeat.cpu, - 'memory': heartbeat.memory, - 'gc': { - 'incremental': heartbeat.gc.incremental, - 'full': heartbeat.gc.full - } - };//remember the peak of each puppet - - if(currTPS >= peak.tps){ - peak.tps = Math.max(currTPS.tps, peak.tps); - peak.cpu = Math.max(currTPS.cpu, peak.cpu); - peak.memory = Math.max(currTPS.memory, peak.memory); - peak.gc.incremental = Math.max(currTPS.gc.incremental, peak.gc.incremental); - peak.gc.full = Math.max(currTPS.gc.full, peak.gc.full); - } - else if(currTPS < peak.tps * 0.9 //10% tps drop - && heartbeat.cpu > peak.cpu - && heartbeat.memory > peak.memory - && heartbeat.gc.incremental > peak.gc.incremental - && heartbeat.gc.full > peak.gc.full){ - return true; - } - - return false; - }, + 'assertOld': options.assertOld || assertOld, 'dyingQueue': null,//a chain of old workers to be collected, it's a FIFO, which guarantees that no more than one old worker will be collected at any time. 'stopTimeout': options.stopTimeout, 'debug.debugPort': options.debug.debugPort, diff --git a/lib/puppet.js b/lib/puppet.js index a5c3d51..f0ee0d9 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -77,7 +77,7 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a puppet should //enter an old state from active - if(master.markOld(heartbeat)){ + if(master.assertOld(heartbeat)){ var dieDeferred = when.defer(), diePromise = null, diff --git a/lib/utils.js b/lib/utils.js index 4d08150..c8a7d3c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -194,3 +194,42 @@ exports.getLogger = function getLogger(category){ return loggers[category]; }; +var peaks = {}; + +exports.assertOld = function assertOld(heartbeat){ + + var pid = heartbeat.pid, + currTPS = heartbeat.tps || (heartbeat.durations / heartbeat.transactions); + + if(currTPS <= 2){//TPS too low, no good for sampling as the 1st phase. + return false; + } + + var peak = peaks[pid] = peaks[pid] || { + 'tps': currTPS, + 'cpu': heartbeat.cpu, + 'memory': heartbeat.memory, + 'gc': { + 'incremental': heartbeat.gc.incremental, + 'full': heartbeat.gc.full + } + };//remember the peak of each puppet + + if(currTPS >= peak.tps){ + peak.tps = Math.max(heartbeat.tps, peak.tps); + peak.cpu = Math.max(heartbeat.cpu, peak.cpu); + peak.memory = Math.max(heartbeat.memory, peak.memory); + peak.gc.incremental = Math.max(heartbeat.gc.incremental, peak.gc.incremental); + peak.gc.full = Math.max(heartbeat.gc.full, peak.gc.full); + } + else if(currTPS < peak.tps * 0.9 //10% tps drop + && heartbeat.cpu > peak.cpu + && heartbeat.memory > peak.memory + && heartbeat.gc.incremental > peak.gc.incremental + && heartbeat.gc.full > peak.gc.full){ + + return true; + } + + return false; +}; diff --git a/lib/worker.js b/lib/worker.js index 81026b9..c4b38a3 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -8,7 +8,7 @@ var _ = require('underscore'), gc = require('nodefly-gcinfo'), assert = require('assert'); -var Worker = exports.Worker = function(proc, options){ +var Worker = exports.Worker = _.once(function(proc, options){ var _this = this, emitter = _this.emitter = options.emitter; @@ -77,7 +77,7 @@ var Worker = exports.Worker = function(proc, options){ }); _this.whenHeartbeat(); -}; +}); Worker.prototype.listen = function(){ diff --git a/test/utils-test.js b/test/utils-test.js index 70e93cd..6ab0260 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -1,7 +1,7 @@ 'use strict'; var should = require('should'), - utils = require('../lib/utils.js'), + utils = require('../lib/utils'), path = require('path'), when = require('when'), fs = require('graceful-fs'), @@ -139,6 +139,93 @@ describe('utils', function(){ done(); }); }); + + describe('#assertOld', function(){ + + it('should use the heuristic to determine when gc is hurting tps', function(done){ + + //whenever tps grow up, whether or not other metrics goes up/down assertion should be false. + var pid = Math.floor(process.pid * (1 + Math.random())), + assertOld = utils.assertOld; + + _.each(_.range(0, 1000), function(ith){ + + assertOld({ + 'pid': pid, + 'tps': ith, + 'cpu': ith, + 'memory': ith, + 'gc': { + 'incremental': ith, + 'full': ith + } + }).should.equal(false); + }); + + done(); + }); + + it('should assert true whenever a degradation of more than 10% happens', function(done){ + + var pid = Math.floor(process.pid * (1 + Math.random())), + assertOld = utils.assertOld; + + assertOld({ + 'pid': pid, + 'tps': 50, + 'cpu': 50, + 'memory': 1000000000, + 'gc': { + 'incremental': 100, + 'full': 10 + } + }).should.equal(false); + + debugger; + assertOld({ + 'pid': pid, + 'tps': 40,//over 10% + 'cpu': 55,//higher + 'memory': 1100000000, + 'gc': { + 'incremental': 110, + 'full': 11 + } + }).should.equal(true); + + done(); + }); + + it('should give 10% margin for tolerance', function(done){ + + var pid = Math.floor(process.pid * (1 + Math.random())), + assertOld = utils.assertOld; + + assertOld({ + 'pid': pid, + 'tps': 50, + 'cpu': 50, + 'memory': 1000000000, + 'gc': { + 'incremental': 100, + 'full': 10 + } + }).should.equal(false); + + assertOld({ + 'pid': pid, + 'tps': 48,//less than 10% + 'cpu': 55,//higher + 'memory': 1100000000, + 'gc': { + 'incremental': 110, + 'full': 11 + } + }).should.equal(false); + + done(); + }); + }); after(function(done){ From e65cca66089ebab5390d6c8fddc5d378d014c855 Mon Sep 17 00:00:00 2001 From: huzhou Date: Thu, 26 Sep 2013 11:30:41 -0700 Subject: [PATCH 068/182] + added stat to cache.js & cache-usr.js --- lib/cache-usr.js | 31 ++++++++++++++++++++++++++++++- lib/cache.js | 14 ++++++++++++++ test/cache-test.js | 14 ++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index b7f823c..a119882 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -16,6 +16,7 @@ var success = common.status.success, SET = common.types.SET, DEL = common.types.DEL, INSPECT = common.types.INSPECT, + STAT = common.types.STAT, PONG = common.types.PONG, CHN = common.changeToken, nextToken = common.nextToken, @@ -31,6 +32,9 @@ var success = common.status.success, anyChanges = { }, + stats = { + + }, conn = null, //TODO, support connection pooling to speed up the cache operations if needed. reconnect = function reconnect(error){ @@ -176,6 +180,7 @@ var user = process.user || { if(success === status && value !== undefined){//got the value + user.stat(namespace, 'hit'); tillGet.resolve(value); } else if(loader){//must atomically load the value @@ -185,9 +190,11 @@ var user = process.user || { user.unwatch(namespace, key, watchOthers); if(changed !== undefined){ + user.stat(namespace, 'hit'); tillGet.resolve(changed); } else{ + user.stat(namespace, 'error'); tillGet.reject(new Error('loader failed')); } }; @@ -200,10 +207,13 @@ var user = process.user || { .then(function(set){ //only one of the concurrent writers will be given the set===true if(set){ + user.stat(namespace, 'miss'); user.unwatch(namespace, key, watchOthers);//unregister immediately as i'm about to write the value try{ //promise or value when(loader(), function(value){ + + user.stat(namespace, 'load'); //success value loaded user.set(namespace, key, value, { 'wait': wait @@ -214,11 +224,13 @@ var user = process.user || { }, function(error){ //set failed + user.stat(namespace, 'error'); tillGet.reject(error); }); }, //error handling function(error){ + user.stat(namespace, 'error'); tillGet.reject(error); }); } @@ -233,7 +245,7 @@ var user = process.user || { }); } else{//got nothing - + user.stat(namespace, 'miss'); tillGet.resolve(null);//no value, but resolved } }; @@ -389,6 +401,23 @@ var user = process.user || { changes[namespace][key] = _.without(changes[namespace][key] || [], callback); } }, + + 'stat': function(namespace, action){ + + var stat = stats[namespace] = stats[namespace] || { + + 'hit': 0, + 'miss': 0, + 'load': 0, + 'error': 0 + }; + + if(action){ + stat[action] += 1; + } + + return stat; + }, 'switchDomain': function(d){//only in case of cache-mgr down and needs to switch to a new one diff --git a/lib/cache.js b/lib/cache.js index de28a8d..d6f43d3 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -59,6 +59,20 @@ Cache.prototype.unwatch = function unwatch(key, onChange){ return this.usr.get(this.namespace, key, loader, options); }; +Cache.prototype.stat = function stat(){ + + var raw = this.usr.stat(this.namespace), + total = raw.hit + raw.miss + 1; + + _.extend(raw, { + 'hitRatio': raw.hit / total, + 'missRatio': raw.miss / total, + 'errorRatio': raw.error / total + }); + + return raw; +}; + module.exports = { 'use': function(namespace, options){ diff --git a/test/cache-test.js b/test/cache-test.js index 5d166b2..8fbe5ed 100644 --- a/test/cache-test.js +++ b/test/cache-test.js @@ -89,6 +89,13 @@ describe('cache', function(){ inspection[1].should.equal(false); inspection[2].should.equal(0); + var stat = usr.stat(namespace); + stat.should.be.ok; + stat.hit.should.equal(1); + stat.miss.should.equal(1); + stat.load.should.equal(0); + stat.error.should.equal(0); + done(); }, done); @@ -146,6 +153,13 @@ describe('cache', function(){ logger.info('[test] cache 2nd "get" with loader attempt should succeed given value:%j', value); value.should.equal('value'); + + var stat = cache.stat(); + stat.should.be.ok; + stat.hit.should.equal(0); + stat.miss.should.equal(2); + stat.load.should.equal(1); + stat.error.should.equal(0); done(); From 2ad35cabc1205c2f5e4cff7c2907c65a4923fa15 Mon Sep 17 00:00:00 2001 From: huzhou Date: Thu, 26 Sep 2013 11:36:13 -0700 Subject: [PATCH 069/182] + expose emitter, status, cache, monitor, ecv from index.js to allow either form of dependency declaration: require('cluster2/emitter') require('cluster2').emitter both will work the same --- lib/index.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index 84f424b..219a2ad 100644 --- a/lib/index.js +++ b/lib/index.js @@ -175,6 +175,30 @@ module.exports = { get isWorker(){ return require('cluster').isWorker; + }, + + get emitter(){ + + return require('./emitter'); + }, + + get status(){ + + return require('./status'); + }, + + get cacheManager(){ + + return require('./cache'); + }, + + get monitor(){ + + return require('./monitor'); + }, + + get ecv(){ + + return require('./ecv'); } - }; From a5c329540b9b02c3ae2e846ca2bf6ecbb81942e0 Mon Sep 17 00:00:00 2001 From: huzhou Date: Thu, 26 Sep 2013 14:36:46 -0700 Subject: [PATCH 070/182] refactorings --- lib/cache-mgr.js | 12 ++++++++++-- lib/puppet.js | 12 ++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index 04f88c1..c67675d 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -280,7 +280,8 @@ module.exports = { //register domain to where all other users and the master process could watch fs.writeFileSync(domainPath, domain); - var updateTask = function updateTask(){ + var nextUpdate = null, + updateTask = function updateTask(){ //expiration monitoring every 10 seconds var now = Date.now(), @@ -342,11 +343,18 @@ module.exports = { })) .ensure(function(){ - setTimeout(updateTask, 10000); + nextUpdate = setTimeout(updateTask, 10000); }) }; updateTask(); + + process.once('SIGINT', function(){ + + clearTimeout(nextUpdate); + + updateTask(); + }); return manager; } diff --git a/lib/puppet.js b/lib/puppet.js index f0ee0d9..c434a36 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -79,8 +79,8 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ if(master.assertOld(heartbeat)){ - var dieDeferred = when.defer(), - diePromise = null, + var waitToDie = when.defer(), + afterDeath = null, die = function(){ _this.activeState = _this.oldState; @@ -90,20 +90,20 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ master.emitter.emit('disconnect', ['master', worker.pid]); - dieDeferred.resolve(worker.pid); + waitToDie.resolve(worker.pid); - if(master.dyingQueue === diePromise){//last of dyingQueue resolved, clean up the dyingQueue + if(master.dyingQueue === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue master.dyingQueue = null; } }); }; if(!master.dyingQueue){//1st in the dying queue, - diePromise = master.dyingQueue = timeout(dieDeferred.promise, 60000);//1 min + afterDeath = master.dyingQueue = timeout(waitToDie.promise, 60000);//1 min die(); } else{ - diePromise = master.dyingQueue = timeout(master.dyingQueue, 60000).ensure(die); + afterDeath = master.dyingQueue = timeout(master.dyingQueue, 60000).ensure(die); } } }, From 9f643a8bc2e07ce2a128e073945c4cd95009e1db Mon Sep 17 00:00:00 2001 From: huzhou Date: Thu, 26 Sep 2013 20:40:52 -0700 Subject: [PATCH 071/182] + extracted deathQueue logic out of puppet.js and moved to utils.js for unit test, verified the sequence and guarantee that no more than one worker will suicide at the same time --- lib/puppet.js | 34 +++++---------------- lib/utils.js | 35 +++++++++++++++++++++ package.json | 5 +-- test/utils-test.js | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 31 deletions(-) diff --git a/lib/puppet.js b/lib/puppet.js index c434a36..38af6dc 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -1,9 +1,9 @@ 'use strict'; var when = require('when'), - timeout = require('when/timeout'), util = require('util'), - _ = require('underscore'); + _ = require('underscore'), + deathQueue = require('./utils').deathQueue; /** * Puppet is a projection of the worker at the Master's runtime, to simplify the state machine & control over workers. @@ -69,8 +69,8 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ 'disconnect': function(){ - worker.disconnect(); worker.suicide = true; + worker.disconnect(); }, 'whenHeartbeat': function(heartbeat){ @@ -79,32 +79,12 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ if(master.assertOld(heartbeat)){ - var waitToDie = when.defer(), - afterDeath = null, - die = function(){ - - _this.activeState = _this.oldState; + deathQueue(worker.process.pid, master.emitter, function(){//success function - var successor = master.fork(options, env); - //when successor is in place, the old worker could be discontinued finally - master.emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + _this.activeState = _this.oldState; - master.emitter.emit('disconnect', ['master', worker.pid]); - waitToDie.resolve(worker.pid); - - if(master.dyingQueue === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue - master.dyingQueue = null; - } - }); - }; - - if(!master.dyingQueue){//1st in the dying queue, - afterDeath = master.dyingQueue = timeout(waitToDie.promise, 60000);//1 min - die(); - } - else{ - afterDeath = master.dyingQueue = timeout(master.dyingQueue, 60000).ensure(die); - } + return master.fork(options, env); + }); } }, diff --git a/lib/utils.js b/lib/utils.js index c8a7d3c..14ee1d6 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -233,3 +233,38 @@ exports.assertOld = function assertOld(heartbeat){ return false; }; + +var deathOfPrevious = null; + +exports.deathQueue = function deathQueue(pid, emitter, success){ + + assert.ok(pid); + assert.ok(emitter); + assert.ok(success); + + var waitToDie = when.defer(), + afterDeath = null, + die = function(){ + + var successor = success(); + + //when successor is in place, the old worker could be discontinued finally + emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ + + emitter.emit('disconnect', ['master', pid], pid); + waitToDie.resolve(pid); + + if(deathOfPrevious === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue + deathOfPrevious = null; + } + }); + }; + + if(!deathOfPrevious){//1st in the dying queue, + afterDeath = deathOfPrevious = timeout(waitToDie.promise, 60000);//1 min + die(); + } + else{ + afterDeath = deathOfPrevious = timeout(deathOfPrevious, 60000).ensure(die); + } +}; diff --git a/package.json b/package.json index e656be2..24a2c20 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "email": "huzhou@ebay.com" }], "name": "cluster3", - "version": "0.1.0", + "version": "0.5.0", "engines": { "node": ">= 0.10.0" }, @@ -35,8 +35,5 @@ "stop": "node ./lib/shutdown.js", "poststop": "rm ./log/*.log; rm ./pids/*.pid", "test": "./node_modules/mocha/bin/mocha ./test/*-test.js" - }, - "optionalDependencies": { - } } diff --git a/test/utils-test.js b/test/utils-test.js index 6ab0260..eaeb832 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -225,8 +225,84 @@ describe('utils', function(){ done(); }); + }); + describe('#deathQueue', function(){ + + it('should let the suicide worker die if it is the 1st one in the queue', function(done){ + + var deathQueue = utils.deathQueue, + emitter = new (require('events').EventEmitter)(), + pid = Math.floor(process.pid * (1 + Math.random())), + util = require('util'); + + emitter.once('disconnect', function(targets, suicide){ + + suicide.should.equal(pid); + done(); + }); + + deathQueue(pid, emitter, function(){ + + var successor = pid + 1; + process.nextTick(function(){ + emitter.emit(util.format('worker-%d-listening', successor)); + }); + + return { + 'process': { + 'pid': successor + } + } + }); + + }); + + it('should let us queue the suicide workers one after another', function(done){ + + debugger; + var deathQueue = utils.deathQueue, + emitter = new (require('events').EventEmitter)(), + pid = Math.floor(process.pid * (1 + Math.random())), + util = require('util'), + expects = _.map(_.range(0, 10), function(ith){return pid + ith * 2;}); + + emitter.on('disconnect', function(targets, suicide){ + + suicide.should.equal(expects.shift()); + + if(!expects.length){ + done(); + } + }); + + _.each(_.range(0, 10), function(ith){ + + var ithPid = pid + ith * 2, + prevPid = ithPid - 2, + ithSuccessor = ithPid + 1; + + deathQueue(ithPid, emitter, function(){ + + process.nextTick(function(){ + + //because we queued the deaths, at the time this ith worker is to suicide, the i - 1 th worker should have been gone! + _.contains(expects, prevPid).should.equal(false); + emitter.emit(util.format('worker-%d-listening', ithSuccessor)); + }); + + return { + 'process': { + 'pid': ithSuccessor + } + } + }); + }); + }); + + }); + after(function(done){ var rmPatterns = [ From 06695d187c3d7e7eeb676d44062746c4045aebe2 Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 26 Sep 2013 21:20:36 -0700 Subject: [PATCH 072/182] - .js --- test/cache-test.js | 6 +++--- test/cluster-emitter-test.js | 4 ++-- test/cluster-status-test.js | 4 ++-- test/ecv-test.js | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/test/cache-test.js b/test/cache-test.js index 5d166b2..8fca22c 100644 --- a/test/cache-test.js +++ b/test/cache-test.js @@ -1,7 +1,7 @@ 'use strict'; var should = require('should'), - getLogger = require('../lib/utils.js').getLogger, + getLogger = require('../lib/utils').getLogger, logger = getLogger(__filename); describe('cache', function(){ @@ -11,7 +11,7 @@ describe('cache', function(){ process.getLogger = getLogger; - var mgr = require('../lib/cache-mgr.js'), + var mgr = require('../lib/cache-mgr'), svr = mgr.createServer(mgr.app); svr.listen(mgr.port, mgr.afterServerStarted); @@ -36,7 +36,7 @@ describe('cache', function(){ this.timeout(3000); - require('../lib/cache-usr.js').user() + require('../lib/cache-usr').user() .then(function(usr){ var namespace = 'ns-' + Date.now(); diff --git a/test/cluster-emitter-test.js b/test/cluster-emitter-test.js index 993d972..f0b6230 100644 --- a/test/cluster-emitter-test.js +++ b/test/cluster-emitter-test.js @@ -3,7 +3,7 @@ var should = require('should'), _ = require('underscore'), fork = require('child_process').fork, - getLogger = require('../lib/utils.js').getLogger; + getLogger = require('../lib/utils').getLogger; describe('cluster-emitter', function(){ @@ -63,7 +63,7 @@ describe('cluster-emitter', function(){ this.timeout(3000); var token = 't-' + Date.now(), - clusterRuntime = fork(require.resolve('./lib/cluster-emitter-runtime.js'), ['--token=' + token]); + clusterRuntime = fork(require.resolve('./lib/cluster-emitter-runtime'), ['--token=' + token]); clusterRuntime.on('message', function(msg){ diff --git a/test/cluster-status-test.js b/test/cluster-status-test.js index cc034eb..73d27b3 100644 --- a/test/cluster-status-test.js +++ b/test/cluster-status-test.js @@ -2,7 +2,7 @@ var should = require('should'), fork = require('child_process').fork, - getLogger = require('../lib/utils.js').getLogger; + getLogger = require('../lib/utils').getLogger; describe('cluster-status', function(){ @@ -140,7 +140,7 @@ describe('cluster-status', function(){ this.timeout(3000); var token = 't-' + Date.now(), - clusterRuntime = fork(require.resolve('./lib/cluster-status-runtime.js'), ['--token=' + token]); + clusterRuntime = fork(require.resolve('./lib/cluster-status-runtime'), ['--token=' + token]); clusterRuntime.on('message', function(msg){ diff --git a/test/ecv-test.js b/test/ecv-test.js index c4dd641..a31c43e 100644 --- a/test/ecv-test.js +++ b/test/ecv-test.js @@ -8,8 +8,8 @@ var should = require('should'), timeout = require('when/timeout'), _ = require('underscore'), EventEmitter = require('events').EventEmitter, - getLogger = require('../lib/utils.js').getLogger, - pickAvailablePort = require('../lib/utils.js').pickAvailablePort; + getLogger = require('../lib/utils').getLogger, + pickAvailablePort = require('../lib/utils').pickAvailablePort; function knock(port, path, assertions){ @@ -44,7 +44,7 @@ describe('ecv', function(){ this.timeout(3000); - var ecv = require('../lib/ecv.js'), + var ecv = require('../lib/ecv'), app = express(), server = http.createServer(app), emitter = new EventEmitter(); @@ -104,7 +104,7 @@ describe('ecv', function(){ this.timeout(5000); - var ecv = require('../lib/ecv.js'), + var ecv = require('../lib/ecv'), app = express(), server = http.createServer(app), emitter = new EventEmitter(); From 8c60ff4f3255a79181fbd8b479687721094fc4bc Mon Sep 17 00:00:00 2001 From: huz Date: Thu, 26 Sep 2013 23:36:42 -0700 Subject: [PATCH 073/182] fixed locking, added 'lock' support from mgr/usr, no adhoc '/lock' key needed --- lib/cache-common.js | 1 + lib/cache-mgr.js | 27 ++++++++++++++++++--- lib/cache-usr.js | 59 ++++++++++++++++++++++++++++----------------- test/utils-test.js | 2 -- 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/lib/cache-common.js b/lib/cache-common.js index 3be2f73..0f1caf8 100644 --- a/lib/cache-common.js +++ b/lib/cache-common.js @@ -51,6 +51,7 @@ module.exports = { 'NS' : 'ns', 'GET' : 'get', 'SET' : 'set', + 'LOCK': 'lock', 'DEL' : 'del', 'ALL' : 'all', 'INSPECT' : 'ins', diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index c67675d..b1237d3 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -18,6 +18,7 @@ var success = common.status.success, SET = common.types.SET, DEL = common.types.DEL, ALL = common.types.ALL, + LOCK = common.types.LOCK, INSPECT = common.types.INSPECT, PING = common.types.PING, PONG = common.types.PONG, @@ -76,15 +77,35 @@ var manager = { })); }, + 'lock': function(conn, token, namespace, key, value){ + + var cache = namespaces[namespace] = namespaces[namespace] || {}, + write = cache[key] === undefined; + + if(write){ + cache[key] = { + 'lock': value + }; + } + + common.write(conn, common.serialize({ + 'type': LOCK, + 'token': token, + 'key': key, + 'status': write ? success: failure + })); + }, + 'set': function(conn, token, namespace, key, value, overwrite){ var cache = namespaces[namespace] = namespaces[namespace] || {}, meta = metaOfNs(namespace), expire = meta.expire, old = cache[key], - write = old === undefined || overwrite; + write = (old === undefined || overwrite); cache[key] = write ? { + 'lock': old ? old.lock : null, 'value': value, 'expire': expire > 0 ? Date.now + expire : 0 //expire at } @@ -153,8 +174,7 @@ var manager = { entry = cache[key] || {}, value = entry.value; - delete cache[key]; - delete cache[key + '/lock'];//locker released too + delete cache[key];//locker released too metaOfNs(namespace).lastModified = Date.now(); @@ -300,7 +320,6 @@ module.exports = { if(entry.expire <= now){ delete cache[key]; - delete cache[key + '/lock']; var notify = common.serialize({ 'token': CHN, diff --git a/lib/cache-usr.js b/lib/cache-usr.js index a119882..5c138f0 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -15,6 +15,7 @@ var success = common.status.success, GET = common.types.GET, SET = common.types.SET, DEL = common.types.DEL, + LOCK = common.types.LOCK, INSPECT = common.types.INSPECT, STAT = common.types.STAT, PONG = common.types.PONG, @@ -200,13 +201,12 @@ var user = process.user || { }; user.watch(namespace, key, watchOthers); - user.set(namespace, key + '/lock', process.pid, { - 'wait': wait, - 'leaveIfNonNull': true + user.lock(namespace, key, { + 'wait': wait }) - .then(function(set){ + .then(function(locked){ //only one of the concurrent writers will be given the set===true - if(set){ + if(locked){ user.stat(namespace, 'miss'); user.unwatch(namespace, key, watchOthers);//unregister immediately as i'm about to write the value try{ @@ -236,10 +236,9 @@ var user = process.user || { } catch(e){ //in case loaded fail - when.join(user.set(namespace, key + '/lock', null), user.set(namespace, key, undefined)) - .ensure(function(){ - tillGet.reject(new Error('loader failed')); - }); + user.del(namespace, key).ensure(function(){ + tillGet.reject(new Error('loader failed')); + }); } } }); @@ -317,13 +316,8 @@ var user = process.user || { wait = options.wait, tillSet = when.defer(), handler = function(status, key){ - if(success === status){ - tillSet.resolve(true); - } - else{ - tillSet.resolve(false); - } + tillSet.resolve(success === status); }; handlers[token] = handler; @@ -342,6 +336,33 @@ var user = process.user || { }); }, + 'lock': function(namespace, key, options){//must guarantee that value has no '\r\n' in it (if it's a string or any complex type) + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillLock = when.defer(), + handler = function(status, key){ + + tillLock.resolve(success === status); + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': LOCK, + 'token': token, + 'namespace': namespace, + 'key': key, + 'value': process.pid + })); + + return (wait > 0 ? timeout(wait, tillLock.promise) : tillLock.promise).ensure(function(){ + delete handlers[token]; + }); + }, + /** * @param key string * @param wait number (timeout after wait expired) @@ -355,13 +376,7 @@ var user = process.user || { tillDel = when.defer(), handler = function(status, key, value){ - if(success === status){ - - tillDel.resolve(value); - } - else{ - tillDel.resolve(null); - } + tillDel.resolve(success === status ? value : null); }; handlers[token] = handler; diff --git a/test/utils-test.js b/test/utils-test.js index eaeb832..6873696 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -181,7 +181,6 @@ describe('utils', function(){ } }).should.equal(false); - debugger; assertOld({ 'pid': pid, 'tps': 40,//over 10% @@ -261,7 +260,6 @@ describe('utils', function(){ it('should let us queue the suicide workers one after another', function(done){ - debugger; var deathQueue = utils.deathQueue, emitter = new (require('events').EventEmitter)(), pid = Math.floor(process.pid * (1 + Math.random())), From 84dc850e0e5abf823fbe8be48e0d992b64435507 Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 27 Sep 2013 00:12:29 -0700 Subject: [PATCH 074/182] fixed npm test and refactorings of puppet.js --- lib/puppet.js | 12 +++--------- lib/utils.js | 9 ++++++--- test/cache-test.js | 2 -- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/lib/puppet.js b/lib/puppet.js index 38af6dc..d492ea8 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -69,13 +69,10 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ 'disconnect': function(){ - worker.suicide = true; worker.disconnect(); }, 'whenHeartbeat': function(heartbeat){ - //here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a puppet should - //enter an old state from active if(master.assertOld(heartbeat)){ @@ -101,8 +98,9 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ _this.oldState = { 'disconnect': function(){ - - worker.disconnect(); + + worker.suicide = true; + worker.disconnect(); }, 'whenExit': function(){ @@ -116,10 +114,6 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ _this.diedState = { - 'disconnect': function(){ - //already disconnected - }, - 'whenExit': function(){ //already exit, clean up delete master.puppets[_this.pid]; diff --git a/lib/utils.js b/lib/utils.js index 14ee1d6..66e7db6 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -194,6 +194,9 @@ exports.getLogger = function getLogger(category){ return loggers[category]; }; +//here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a puppet should +//enter an old state from active + var peaks = {}; exports.assertOld = function assertOld(heartbeat){ @@ -242,7 +245,7 @@ exports.deathQueue = function deathQueue(pid, emitter, success){ assert.ok(emitter); assert.ok(success); - var waitToDie = when.defer(), + var tillDeath = when.defer(), afterDeath = null, die = function(){ @@ -252,7 +255,7 @@ exports.deathQueue = function deathQueue(pid, emitter, success){ emitter.once(util.format('worker-%d-listening', successor.process.pid), function(){ emitter.emit('disconnect', ['master', pid], pid); - waitToDie.resolve(pid); + tillDeath.resolve(pid); if(deathOfPrevious === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue deathOfPrevious = null; @@ -261,7 +264,7 @@ exports.deathQueue = function deathQueue(pid, emitter, success){ }; if(!deathOfPrevious){//1st in the dying queue, - afterDeath = deathOfPrevious = timeout(waitToDie.promise, 60000);//1 min + afterDeath = deathOfPrevious = timeout(tillDeath.promise, 60000);//1 min die(); } else{ diff --git a/test/cache-test.js b/test/cache-test.js index 9091a6a..3da87b6 100644 --- a/test/cache-test.js +++ b/test/cache-test.js @@ -167,8 +167,6 @@ describe('cache', function(){ }, done); - done(); - }, done); }); From 7f2857cf602fdff12b81202405c25d4fc206ef69 Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 27 Sep 2013 00:53:16 -0700 Subject: [PATCH 075/182] just some refactorings --- lib/cache-usr.js | 2 -- lib/emitter.js | 6 +++++- lib/status.js | 20 ++++++++++---------- lib/utils.js | 12 ++++++------ 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 5c138f0..0d06a9f 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -9,7 +9,6 @@ var _ = require('underscore'), common = require('./cache-common'); var success = common.status.success, - failure = common.status.failure, NS = common.types.NS, ALL = common.types.ALL, GET = common.types.GET, @@ -17,7 +16,6 @@ var success = common.status.success, DEL = common.types.DEL, LOCK = common.types.LOCK, INSPECT = common.types.INSPECT, - STAT = common.types.STAT, PONG = common.types.PONG, CHN = common.changeToken, nextToken = common.nextToken, diff --git a/lib/emitter.js b/lib/emitter.js index b81cdd0..e2a7828 100644 --- a/lib/emitter.js +++ b/lib/emitter.js @@ -76,7 +76,7 @@ var logger = process.getLogger(__filename), }); } catch(error){ - logger.warn('[cluster2] master sending to worker failed'); + logger.warn('[cluster2] master sending to worker failed:%j', error); } }); @@ -145,9 +145,11 @@ var slaveEmitter = { 'once': function(event, handler){ var _this = this, handleOnce = function handleOnce(){ + handler.apply(null, arguments); _this.removeListener(event, handleOnce); }; + _this.on(event, handleOnce); }, @@ -176,6 +178,7 @@ if(cluster.isMaster){ cluster.on('fork', function(worker){ if(!worker.clusterEventHandler){ + worker.clusterEventHandler = function(message){ _.invoke(emitter.handlers[message.type] || [], 'apply', null, message.params); }; @@ -189,6 +192,7 @@ else{ var emitter = module.exports = slaveEmitter; process.on('message', function(message){ + _.each(emitter.handlers[message.type] || [], function(h){ h.apply(null, message.params); }); diff --git a/lib/status.js b/lib/status.js index 802bfb2..28c1e9f 100644 --- a/lib/status.js +++ b/lib/status.js @@ -26,7 +26,7 @@ module.exports = (function(emitter){ return r.pid === pid; })){ - logger.debug('[status] register status ignored due to existing registry'); + logger.info('[status] register status ignored due to existing registry'); } else{ registry[name].push({ @@ -60,7 +60,7 @@ module.exports = (function(emitter){ }); }); - logger.debug('[status] auto updated after worker:%j', registry); + logger.debug('[status] auto updated after worker:%j got disconnected', registry); }); return { @@ -86,9 +86,9 @@ module.exports = (function(emitter){ emitter.emit('del-status', ['master', 'self'], name, process.pid); - emitter.removeListener(util.format('get-status-%s', name)); + emitter.removeAllListeners(util.format('get-status-%s', name)); - emitter.removeListener(util.format('set-status-%s', name)); + emitter.removeAllListeners(util.format('set-status-%s', name)); }, 'statuses': function(){ @@ -100,12 +100,12 @@ module.exports = (function(emitter){ return when.map(registry[name], function(r){ - var got = when.defer(), + var tillGet = when.defer(), echo = util.format('get-status-%s-%d-%d', name, r.pid, Date.now()); emitter.once(echo, function(status){ - got.resolve({ + tillGet.resolve({ 'pid': r.pid, 'name': name, 'status': status @@ -114,7 +114,7 @@ module.exports = (function(emitter){ emitter.emit(util.format('get-status-%s', name), [r.pid], echo); - return timeout(got.promise, wait || 1000); + return timeout(tillGet.promise, wait || 1000); }); }, @@ -122,11 +122,11 @@ module.exports = (function(emitter){ return when.map(registry[name], function(r){ - var set = when.defer(), + var tillSet = when.defer(), echo = util.format('set-status-%s-%d-%d', name, r.pid, Date.now()); emitter.once(echo, function(status){ - set.resolve({ + tillSet.resolve({ 'pid': r.pid, 'name': name, 'status': status @@ -135,7 +135,7 @@ module.exports = (function(emitter){ emitter.emit(util.format('set-status-%s', name), [r.pid], value, echo); - return timeout(set.promise, wait || 1000); + return timeout(tillSet.promise, wait || 1000); }); } }; diff --git a/lib/utils.js b/lib/utils.js index 66e7db6..e539b37 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -237,7 +237,7 @@ exports.assertOld = function assertOld(heartbeat){ return false; }; -var deathOfPrevious = null; +var tillPrevDeath = null; exports.deathQueue = function deathQueue(pid, emitter, success){ @@ -257,17 +257,17 @@ exports.deathQueue = function deathQueue(pid, emitter, success){ emitter.emit('disconnect', ['master', pid], pid); tillDeath.resolve(pid); - if(deathOfPrevious === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue - deathOfPrevious = null; + if(tillPrevDeath === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue + tillPrevDeath = null; } }); }; - if(!deathOfPrevious){//1st in the dying queue, - afterDeath = deathOfPrevious = timeout(tillDeath.promise, 60000);//1 min + if(!tillPrevDeath){//1st in the dying queue, + afterDeath = tillPrevDeath = timeout(tillDeath.promise, 60000);//1 min die(); } else{ - afterDeath = deathOfPrevious = timeout(deathOfPrevious, 60000).ensure(die); + afterDeath = tillPrevDeath = timeout(tillPrevDeath, 60000).ensure(die); } }; From 0c222bd97997988e5f303cffdf6fa5269b33292f Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 27 Sep 2013 01:46:25 -0700 Subject: [PATCH 076/182] puppet bugfix and unit test --- lib/puppet.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/puppet.js b/lib/puppet.js index d492ea8..0e7e2da 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -34,11 +34,11 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ if(_this.debugging){ //we could enable debugging here - master.emitter.once('debug-started', function(){ + _this.emitter.once('debug-started', function(){ _this.emitter.emit('run', [_this.pid]); }); - master.emitter.once('debug-finished', function(){ + _this.emitter.once('debug-finished', function(){ _this.disconnect(); }); @@ -50,7 +50,7 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ _this.state = _this.activeState; //this is mainly for the old worker to be notified that the successor is ready - master.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); + _this.emitter.emit(util.format('worker-%d-listening', worker.process.pid), ['self']); }, 'whenHeartbeat': function(){ @@ -59,9 +59,13 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ 'whenExit': function(){ + _this.state = _this.diedState; + if(!worker.suicide){//accident, must be revived master.fork(options, env); } + //already exit, clean up + delete master.puppets[_this.pid]; } }; @@ -87,6 +91,8 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ 'whenExit': function(){ + _this.state = _this.diedState; + if(!worker.suicide){//accident, must be revived master.fork(options, env); } @@ -127,23 +133,22 @@ Puppet.prototype.debug = function(){ //debugger listening on port 5858 var _this = this, - buff = '', pid = _this.pid, worker = _this.worker, - waitForDebugPort = when.defer(); + tillDebugPortListen = when.defer(); _this.emitter.once('debug-port-listening', function(){ _this.logger.info('[debug] puppet: %d received debug-port-listening', pid); - waitForDebugPort.resolve(pid); + tillDebugPortListen.resolve(pid); }); worker.process.kill('SIGUSR1');//make it debug ready _this.logger.info('[debug] master sent signal SIGUSR1 to %d', pid); - return waitForDebugPort.promise; + return tillDebugPortListen.promise; }; Puppet.prototype.disconnect = function(){ From e744d0a952e1f28c0e9e580ebbc90c07b18a88b2 Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 27 Sep 2013 14:53:01 -0700 Subject: [PATCH 077/182] + cache persistence bugfix + cache 'namespace' chars shorten to 'ns' + cache refactorings --- lib/cache-mgr.js | 96 +++++++++++++++++++----------------------------- lib/cache-usr.js | 84 ++++++++++++++++++++++-------------------- 2 files changed, 81 insertions(+), 99 deletions(-) diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js index b1237d3..51c9ded 100644 --- a/lib/cache-mgr.js +++ b/lib/cache-mgr.js @@ -33,7 +33,7 @@ var success = common.status.success, 'persist': true, //persist true 'expire': 0, //never expire 'lastModified': 0, - 'lastPersisted': 0 + 'lastPersisted': -1 } } } @@ -71,7 +71,6 @@ var manager = { common.write(conn, common.serialize({ 'type': ALL, 'token': token, - 'namespace': namespace, 'keys': _.keys(cache), 'status': success })); @@ -122,19 +121,24 @@ var manager = { meta.lastModified = Date.now(); - var notify = common.serialize({ - 'token': CHN, - 'namespace': namespace, - 'key': key, - 'value': cache[key]['value'] - }); - - _.each(conns, function(c){ - common.write(c, notify); - }); + manager.notify(namespace, key, cache[key]['value']); } }, + 'notify': function(namespace, key, value){ + + var notify = common.serialize({ + 'token': CHN, + 'ns': namespace, + 'key': key, + 'value': value + }); + + _.each(conns, function(c){ + common.write(c, notify); + }); + }, + 'get': function(conn, token, namespace, key, value){ var cache = namespaces[namespace] || {}, @@ -186,16 +190,7 @@ var manager = { 'status': success })); - var notify = common.serialize({ - 'token': CHN, - 'namespace': namespace, - 'key': key, - 'value': value - }); - - _.each(conns, function(c){ - common.write(c, notify); - }); + manager.notify(namespace, key, value); }, 'ping': function(conn, token){ @@ -214,7 +209,8 @@ var manager = { module.exports = { 'createServer': net.createServer, - 'app':function(conn) { //'connection' listener + + 'app': function(conn) { //'connection' listener conns.push(conn); @@ -236,15 +232,11 @@ module.exports = { conn.counter += 1; - var command = common.deserialize(pack), - token = command.token, - namespace = command.namespace, - type = command.type, //['set', 'get', 'del', 'persist'] - key = command.key, //cache key - value = command.value, - overwrite = !command.leaveIfNonNull; // cache value + var command = common.deserialize(pack); - manager[type].apply(manager, [conn, token, namespace, key, value, overwrite]); + manager[command.type].apply(manager, [ + conn, command.token, command.ns, command.key, command.value, !command.leaveIfNonNull + ]); }); }//otherwise keep buffering... }); @@ -253,7 +245,7 @@ module.exports = { //this is to keep the connection open, just to send PING, and receive PONG, and will be extended to validate the health of the connection later manager.ping(conn, PONG); - }, 2000);//ping/pong every second + }, 3000);//ping/pong every 3secs conn.once('close', function(){ @@ -280,7 +272,7 @@ module.exports = { _.each(persists, function(p){ - var filter = /^(.+)\.cache$/, + var filter = /^(.*)\.cache$/, match = filter.exec(p); if(match && match[1]){ @@ -288,13 +280,6 @@ module.exports = { } }); - namespaces[''] = namespaces[''] || {}; - namespaces[''][''] = { //meta of meta namespace itself - 'value': { //meta value - 'persist': true, //persist true - 'expire': 0 //never expire - } - }; logger.info('[cache] manager loaded from all persistences'); //register domain to where all other users and the master process could watch @@ -307,30 +292,24 @@ module.exports = { var now = Date.now(), cachesToPersist = {}; - logger.info('[cache][maintain] at:%d upon namespaces:%j', now, _.keys(namespaces)); _.each(namespaces, function(cache, namespace){ var meta = metaOfNs(namespace), persist = meta.persist, expire = meta.expire; + logger.debug('[cache][maintain] at:%d upon namespace:%s meta:%j', now, namespace, meta); + if(expire > 0){ _.each(cache, function(entry, key){ if(entry.expire <= now){ - delete cache[key]; + var old = cache[key]; - var notify = common.serialize({ - 'token': CHN, - 'namespace': namespace, - 'key': key, - 'value': cache[key] - }); + delete cache[key]; - _.each(conns, function(c){ - common.write(c, notify); - }); + manager.notify(namespace, key, old); } }); } @@ -340,25 +319,25 @@ module.exports = { } }); - logger.info('[cache][maintain] expiration finished, and persist the following:%j', _.keys(cachesToPersist)); + logger.debug('[cache][maintain] expiration finished, and persist the following:%j', _.keys(cachesToPersist)); when.all(_.map(cachesToPersist, function(cache, namespace){ - var waitForPersist = when.defer(), + var tillPersist = when.defer(), persistence = path.join(persistPath, namespace + '.cache'); - logger.info('[cache][maintain] to persist namespace:%s to:%s', namespace, persistence); + logger.debug('[cache][maintain] to persist namespace:%s to:%s', namespace, persistence); fs.writeFile(persistence, common.serialize(cache), function(err){ - logger.info('[cache][maintain] persisted:%s %s', persistence, err ? 'with error' : 'successfully'); + logger.debug('[cache][maintain] persisted:%s %s', persistence, err ? 'with error' : 'successfully'); metaOfNs(namespace).lastPersisted = Date.now(); - waitForPersist.resolve(!err); + tillPersist.resolve(!err); }); - return timeout(waitForPersist, 10000);//too big? + return timeout(tillPersist, 10000);//too big? })) .ensure(function(){ @@ -371,8 +350,7 @@ module.exports = { process.once('SIGINT', function(){ clearTimeout(nextUpdate); - - updateTask(); + }); return manager; diff --git a/lib/cache-usr.js b/lib/cache-usr.js index 0d06a9f..e6532c4 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -65,16 +65,12 @@ var success = common.status.success, var response = common.deserialize(pack), token = response.token, - namespace = response.namespace, - namespaces = response.namespaces, + namespace = response.ns, key = response.key, - keys = response.keys, - value = response.value, - status = response.status, - persist = response.persist, - expire = response.expire; + value = response.value; if(token === CHN){ + changes[namespace] = changes[namespace] || {}; _.each(changes[namespace][key] || [], function(whenChange){ whenChange(value, key); @@ -83,19 +79,28 @@ var success = common.status.success, _.invoke(anyChanges[namespace] || [], 'call', null, value, key); } else if(token === PONG){//just to keep the connection open + common.write(connecting, common.serialize({ 'type': PONG, 'token': PONG })); } else{ - handlers[token].apply(user, [status, key || keys || namespaces, value, persist, expire]); + + handlers[token].apply(user, [ + response.status, + key || response.keys || response.namespaces, + value, + response.persist, + response.expire + ]); } }); } }); connecting.once('close', function(error){ + connecting.writable = false; connecting.destroy(); @@ -111,16 +116,16 @@ var user = process.user || { var token = nextToken(), wait = options.wait, - tillNamespaces = when.defer(), + tillNs = when.defer(), handler = function(status, namespaces){ if(success === status){ - tillNamespaces.resolve(namespaces || []); + tillNs.resolve(namespaces || []); } else{ - tillNamespaces.reject(new Error('failed to get namespaces')); + tillNs.reject(new Error('failed to get namespaces')); } }; @@ -131,7 +136,7 @@ var user = process.user || { 'token': token })); - return (wait > 0 ? timeout(wait, tillNamespaces.promise) : tillNamespaces.promise).ensure(function(){ + return (wait > 0 ? timeout(wait, tillNs.promise) : tillNs.promise).ensure(function(){ delete handlers[token]; }); }, @@ -160,7 +165,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': ALL, 'token': token, - 'namespace': namespace + 'ns': namespace })); return (wait > 0 ? timeout(wait, tillKeys.promise) : tillKeys.promise).ensure(function(){ @@ -175,7 +180,7 @@ var user = process.user || { var token = nextToken(), wait = options.wait, tillGet = when.defer(), - handler = function(status, key, value){ + handler = function handler(status, key, value){ if(success === status && value !== undefined){//got the value @@ -184,7 +189,7 @@ var user = process.user || { } else if(loader){//must atomically load the value - var watchOthers = function(changed){ + var watchOthers = function watchOthers(changed){ //unregister itself immediately user.unwatch(namespace, key, watchOthers); @@ -205,43 +210,42 @@ var user = process.user || { .then(function(locked){ //only one of the concurrent writers will be given the set===true if(locked){ + + var handleError = function handleError(error){ + throw error; + }; + user.stat(namespace, 'miss'); user.unwatch(namespace, key, watchOthers);//unregister immediately as i'm about to write the value try{ //promise or value when(loader(), function(value){ - user.stat(namespace, 'load'); - //success value loaded - user.set(namespace, key, value, { + user.stat(namespace, 'load'); + //success value loaded + user.set(namespace, key, value, { 'wait': wait }) - .then(function(){ - //set succeeded - tillGet.resolve(value); - }, - function(error){ - //set failed - user.stat(namespace, 'error'); - tillGet.reject(error); - }); - }, - //error handling - function(error){ - user.stat(namespace, 'error'); - tillGet.reject(error); - }); + .then( + _.bind(tillGet.resolve, tillGet, value), + handleError + ); + + }, + handleError); } catch(e){ //in case loaded fail + user.stat(namespace, 'error'); user.del(namespace, key).ensure(function(){ - tillGet.reject(new Error('loader failed')); + tillGet.reject(e); }); } } }); } - else{//got nothing + else{ + //got nothing user.stat(namespace, 'miss'); tillGet.resolve(null);//no value, but resolved } @@ -254,7 +258,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': GET, 'token': token, - 'namespace': namespace, + 'ns': namespace, 'key': key })); @@ -287,7 +291,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': INSPECT, 'token': token, - 'namespace': namespace, + 'ns': namespace, 'key': key })); @@ -323,7 +327,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': SET, 'token': token, - 'namespace': namespace, + 'ns': namespace, 'key': key, 'value': value, 'leaveIfNonNull': options.leaveIfNonNull @@ -351,7 +355,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': LOCK, 'token': token, - 'namespace': namespace, + 'ns': namespace, 'key': key, 'value': process.pid })); @@ -382,7 +386,7 @@ var user = process.user || { common.write(conn, common.serialize({ 'type': DEL, 'token': token, - 'namespace': namespace, + 'ns': namespace, 'key': key })); From 0f4b350713bb42e8a840778e0425ff4333669152 Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 27 Sep 2013 15:44:44 -0700 Subject: [PATCH 078/182] + fixed #listen promise rejected issue from both master & worker + refactorings + fixed status view in monitor for none object structure --- examples/cluster-demo.js | 8 ++++++-- lib/master.js | 11 ++++++++--- lib/public/views/workers.ejs | 32 ++++++++++++++++++++++++-------- lib/puppet.js | 1 + lib/worker.js | 1 + 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/examples/cluster-demo.js b/examples/cluster-demo.js index ff7dcf1..dd30bfb 100644 --- a/examples/cluster-demo.js +++ b/examples/cluster-demo.js @@ -45,7 +45,11 @@ listen({ }) .then(function(resolve){ - var masterOrWorker = resolve.master || resolve.worker; + require('../lib/status').register('worker', function(){ + return process.pid; + }); +}) +.otherwise(function(error){ - masterOrWorker.status.register('worker', process.pid); + console.trace(error); }); diff --git a/lib/master.js b/lib/master.js index 89fd316..4155566 100644 --- a/lib/master.js +++ b/lib/master.js @@ -134,7 +134,7 @@ Master.prototype.initialize = function(proc, options){ return _this; } - else if(proc.env.CACHE_MANAGER){ + else if(proc.env && proc.env.CACHE_MANAGER){ var manager = require('./cache-mgr'); _.extend(options, { @@ -150,7 +150,7 @@ Master.prototype.initialize = function(proc, options){ else{ _.extend(options, { - 'debug': process.env.debug + 'debug': process.env && process.env.debug }); return new Worker(proc, options); @@ -186,7 +186,12 @@ Master.prototype.listen = function(){ .then(function(resolve){ _this.logger.info('[master] warmUp'); - warmUp(); + try{ + warmUp(); + } + catch(e){ + _this.logger.warn('[master] warmUp error:' + e); + } return resolve; }); }; diff --git a/lib/public/views/workers.ejs b/lib/public/views/workers.ejs index 127ba1a..6f0c291 100644 --- a/lib/public/views/workers.ejs +++ b/lib/public/views/workers.ejs @@ -39,13 +39,21 @@ <%=status.name%> <%for(var w = 0, wlen = pids.length; w < wlen; w += 1){ - var pid = pids[w];%> + var pid = pids[w], + type = typeof status[pid];%> - <%for(var st in status[pid] || {}){%> + <%if(type === 'string' || type === 'number' || type === 'boolean' || type === 'null'){%>
    - <%=st%> : <%=JSON.stringify(status[pid][st])%> + <%=status[pid]%>
    - <%}%> + <%} + else{ + for(var st in status[pid] || {}){%> +
    + <%=st%> : <%=JSON.stringify(status[pid][st])%> +
    + <%} + }%> <%}%> @@ -98,13 +106,21 @@ socket.on('status-change', function(pids, statuses){ table += ''; - for(var st in status[pid] || {}){ + var type = typeof status[pid]; + + if(type === 'string' || type === 'number' || type === 'boolean' || type === 'null'){ - table += '
    ' + st + ' : '; - table += JSON.stringify(status[pid][st]); - table += '
    '; + table += '
    ' + status[pid] + '
    '; } + else{ + for(var st in status[pid] || {}){ + table += '
    ' + st + ' : '; + table += JSON.stringify(status[pid][st]); + table += '
    '; + } + } + table += '' }); diff --git a/lib/puppet.js b/lib/puppet.js index 0e7e2da..0ff2f16 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -14,6 +14,7 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ var _this = this; + env = env || {}; _.extend(_this, { 'logger': master.logger, 'emitter': master.emitter, diff --git a/lib/worker.js b/lib/worker.js index c4b38a3..e3dad03 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -2,6 +2,7 @@ var _ = require('underscore'), when = require('when'), + util = require('util'), timeout = require('when/timeout'), usage = require('usage'), BigNumber = require('bignumber.js'), From f9a3010dcd5f2e2c98b1f447fe77111cffc09e29 Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 27 Sep 2013 16:02:12 -0700 Subject: [PATCH 079/182] + fixed worker issue 'this.emitter' missing this scope + refactorings to reduce loc --- lib/worker.js | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/lib/worker.js b/lib/worker.js index e3dad03..b5399de 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -218,14 +218,9 @@ Worker.prototype.whenGC = function(usage, type){ var _this = this; - if('kGCTypeMarkSweepCompact' === type){ - _this.gc.full += 1; - } - else{ - _this.gc.incremental += 1; - } - - emitter.emit('gc', ['self', 'master'], usage, type); + _this.gc['kGCTypeMarkSweepCompact' === type ? 'full' : 'incremental'] += 1; + + _this.emitter.emit('gc', ['self', 'master'], usage, type); }; Worker.prototype.whenStop = function(){ @@ -234,26 +229,25 @@ Worker.prototype.whenStop = function(){ clearTimeout(_this.heartbeatTimer); - function gracefully(){ + (function gracefully(){ if(_this.liveConnections > 0){ - _this.logger.info('gracefully shutdown: %d pending on liveConnections: %d', process.pid, _this.liveConnections); + _this.logger.info('[worker] gracefully shutdown: %d pending on liveConnections: %d', process.pid, _this.liveConnections); setTimeout(gracefully, 500); } else{ - _this.logger.info('gracefully shutdown: %d', process.pid); + _this.logger.info('[worker] gracefully shutdown: %d', process.pid); process.exit(0); } - } - gracefully(); + })(); }; Worker.prototype.whenExit = function(){ - this.logger.warn('forced shutdown: %d', process.pid); + this.logger.warn('[worker] forced shutdown: %d', process.pid); process.exit(-1); }; From 703a10d2b7d549fb4971942097c52b32b7a62de4 Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 27 Sep 2013 18:54:15 -0700 Subject: [PATCH 080/182] + worker unit test & gc info bugfix --- lib/worker.js | 22 +++++--- package.json | 2 +- test/worker-test.js | 135 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 test/worker-test.js diff --git a/lib/worker.js b/lib/worker.js index b5399de..1f9c4b1 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -6,7 +6,7 @@ var _ = require('underscore'), timeout = require('when/timeout'), usage = require('usage'), BigNumber = require('bignumber.js'), - gc = require('nodefly-gcinfo'), + gc = require('node-gc'), assert = require('assert'); var Worker = exports.Worker = _.once(function(proc, options){ @@ -24,7 +24,7 @@ var Worker = exports.Worker = _.once(function(proc, options){ 'app': options.app, 'port': options.port, 'warmUp': options.warmUp, - 'debug': options.debug, + 'debug': options.debug || false, 'timeout': options.timeout || 5000, 'liveConnections': 0, 'totalConnections': 0, @@ -49,7 +49,13 @@ var Worker = exports.Worker = _.once(function(proc, options){ 'isWorker': true }); - gc.onGC(_.bind(_this.whenGC, _this)); + gc.on('scavenge', function(info) { + _this.whenGC('', 'incremental'); + }); + gc.on('marksweep', function(info) { + //got marked and sweeped + _this.whenGC('', 'full'); + }); process.once('disconnect', _.bind(_this.whenStop, _this, 'disconnect')); process.once('SIGINT', _.bind(_this.whenStop, _this, 'sigint')); process.once('SIGTERM', _.bind(_this.whenExit, _this)); @@ -211,15 +217,17 @@ Worker.prototype.whenHeartbeat = function(){ _this.error.fatal = 0; }); - _this.heartbeatTimer = setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); + _this.nextHeartbeat = setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); }; Worker.prototype.whenGC = function(usage, type){ var _this = this; - _this.gc['kGCTypeMarkSweepCompact' === type ? 'full' : 'incremental'] += 1; - + _this.logger.info('[worker] gc usage:%s, type:%s', usage, type); + + _this.gc[type] += 1; + _this.emitter.emit('gc', ['self', 'master'], usage, type); }; @@ -227,7 +235,7 @@ Worker.prototype.whenStop = function(){ var _this = this; - clearTimeout(_this.heartbeatTimer); + clearTimeout(_this.nextHeartbeat); (function gracefully(){ diff --git a/package.json b/package.json index 24a2c20..d0dc00a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "socket.io": "~0.9.16", "ejs": "~0.8.4", "node-inspector": "~0.4.0", - "nodefly-gcinfo": "~0.0.15", + "node-gc": "~0.2.0", "bignumber.js": "~1.1.1" }, "devDependencies": { diff --git a/test/worker-test.js b/test/worker-test.js new file mode 100644 index 0000000..b3f730b --- /dev/null +++ b/test/worker-test.js @@ -0,0 +1,135 @@ +'use strict'; + +var should = require('should'), + express = require('express'), + request = require('request'), + util = require('util'), + _ = require('underscore'), + getLogger = require('../lib/utils').getLogger, + pickAvailablePort = require('../lib/utils').pickAvailablePort, + Worker = require('../lib/worker').Worker, + EventEmitter = require('events').EventEmitter; + +describe('worker', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#construction', function(){ + + it('should create a worker instance', function(done){ + + this.timeout(30000); + + var logger = process.getLogger(); + + pickAvailablePort(8000, 8099).then(function(port){ + + logger.info('[test] port picked:%d', port); + + var emitter = new EventEmitter(), + app = express(), + warmed = false, + worker = new Worker(process, { + 'emitter': emitter, + 'createServer': require('http').createServer, + 'app': app, + 'port': port, + 'warmUp': function(){ + warmed = true; + } + }); + + logger.info('[test] worker created'); + + var memory = []; + app.get('/', function(req, res){ + + memory.push(memory);//this should let GC kick in quickly + + res.send(200); + }); + + logger.info('[test] app created'); + + worker.should.be.ok; + worker.isMaster.should.equal(false); + worker.isWorker.should.equal(true); + worker.pid.should.equal(process.pid); + worker.debug.should.not.be.ok; + worker.liveConnections.should.equal(0); + worker.totalConnections.should.equal(0); + worker.status.should.be.ok; + worker.gc.should.be.ok; + worker.gc.incremental.should.equal(0); + worker.gc.full.should.equal(0); + worker.error.should.be.ok; + worker.error.fatal.should.equal(0); + worker.error.count.should.equal(0); + + _.isFunction(worker.listen).should.equal(true); + _.isFunction(worker.run).should.equal(true); + _.isFunction(worker.whenGC).should.equal(true); + _.isFunction(worker.whenHeartbeat).should.equal(true); + _.isFunction(worker.whenStop).should.equal(true); + _.isFunction(worker.whenExit).should.equal(true); + + worker.listen().then(function(resolve){ + + resolve.should.be.ok; + resolve.server.should.be.ok; + resolve.app.should.equal(app); + resolve.port.should.equal(port); + should.not.exist(resolve.master); + resolve.worker.should.equal(worker); + warmed.should.equal(true); + + var hit = util.format('http://localhost:%d/', port); + + request.get(hit, function(err, response, body){ + + should.not.exist(err); + response.should.be.ok; + response.statusCode.should.equal(200); + + //now we'll verify gc + emitter.on('gc', function(targets, usage, type){ + + logger.info('[test] gc happended'); + + type.should.be.ok; + + numOfGCs += 1; + }); + + var numOfGCs = 0, + load = function load(){ + request.get(hit, function(err, response, body){ + + should.not.exist(err); + response.should.be.ok; + response.statusCode.should.equal(200); + + if(numOfGCs < 2){ + load(); + } + else{ + //now we'll verify heartbeat + done(); + } + }); + }; + + load(); + }); + + }, done); + }); + + }); + }); + +}); \ No newline at end of file From 56e9f7ddb24153609e751ca3f4c033411ee312bb Mon Sep 17 00:00:00 2001 From: huzhou Date: Fri, 27 Sep 2013 19:49:07 -0700 Subject: [PATCH 081/182] + refactorings --- examples/cluster-demo.js | 4 ++++ lib/cache-usr.js | 4 ++-- lib/master.js | 14 +++++++------- lib/monitor.js | 17 ++++++++++++----- lib/worker.js | 2 +- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/examples/cluster-demo.js b/examples/cluster-demo.js index dd30bfb..9632994 100644 --- a/examples/cluster-demo.js +++ b/examples/cluster-demo.js @@ -41,6 +41,10 @@ listen({ 'webPort': 9092, 'saveLiveEdit': true }, + /*'cache': { + 'enable': true, + 'mode': 'master' + },*/ 'heartbeatInterval': 5000 }) .then(function(resolve){ diff --git a/lib/cache-usr.js b/lib/cache-usr.js index e6532c4..9191180 100644 --- a/lib/cache-usr.js +++ b/lib/cache-usr.js @@ -464,7 +464,7 @@ var tillExists = function(path){ 'encoding': 'utf-8' }, function(err, d){ - logger.info('switching domain:%s', d); + logger.info('[cache] switching domain:%s', d); user.switchDomain(d); }); }); @@ -481,7 +481,7 @@ exports.user = function(domain){ if(!process.userPromise){//each process needs at most one cache user - logger.info('cache user created'); + logger.info('[cache] user created'); tillExists(common.domainPath); diff --git a/lib/master.js b/lib/master.js index 4155566..d88f3a4 100644 --- a/lib/master.js +++ b/lib/master.js @@ -101,7 +101,7 @@ Master.prototype.initialize = function(proc, options){ }); cluster.on('exit', function(worker){ - _this.logger.info('master detects exit of worker:' + worker.process.pid); + _this.logger.info('[master] detects exit of worker:' + worker.process.pid); _this.puppets[worker.process.pid].whenExit(); }); @@ -225,7 +225,7 @@ Master.prototype.debug = function debug(pid){ _.each(_this.puppets, function(puppet){ if(!puppet.cacheManager && pid !== puppet.pid){ - _this.logger.info('debug fresh, disconnecting:%j vs pid:%j', puppet.pid, pid); + _this.logger.info('[master][debug] fresh, disconnecting:%j vs pid:%j', puppet.pid, pid); puppet.disconnect(); } }); @@ -246,7 +246,7 @@ Master.prototype.debug = function debug(pid){ var debugging = _this.puppets[pid]; - _this.logger.info('[debug] going to debug live:%d status:%s', pid, debugging !== null); + _this.logger.info('[master][debug] going to debug live:%d status:%s', pid, debugging !== null); ready = debugging.debug(); @@ -258,7 +258,7 @@ Master.prototype.debug = function debug(pid){ ready.then(function(){//must wait for the signal to be sent, and child process ready to accept connection on 5858 - _this.logger.info('[debug] master starting inspector'); + _this.logger.info('[master][debug] starting inspector'); var inspector = startInspector(_this['debug.webPort'], _this['debug.debugPort'], @@ -271,7 +271,7 @@ Master.prototype.debug = function debug(pid){ if(msg.event === 'SERVER.LISTENING'){ var inspectorUrl = msg.address.url; - _this.logger.debug('[debug] master got inspector url:%s', inspectorUrl); + _this.logger.debug('[master][debug] got inspector url:%s', inspectorUrl); _this.emitter.emit('debug-inspector', ['master'], inspectorUrl); inspector.removeListener('message', inspectorListener); @@ -304,7 +304,7 @@ Master.prototype.markDown = function markDown(){ var _this = this; //mark down ecv - _this.logger.info('[ecv] master marking down'); + _this.logger.info('[master][ecv] marking down'); _this.emitter.emit('warning', ['self'], { 'command': 'disable' }); @@ -314,7 +314,7 @@ Master.prototype.markUp = function markUp(){ var _this = this; //mark up ecv - _this.logger.info('[ecv] master marking up'); + _this.logger.info('[master][ecv] marking up'); _this.emitter.emit('warning', ['self'], { 'command': 'enable' }); diff --git a/lib/monitor.js b/lib/monitor.js index b9b9ad2..8119dbc 100644 --- a/lib/monitor.js +++ b/lib/monitor.js @@ -26,6 +26,8 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ return next(); } + logger.info('[monitor][index] renders'); + res.render('index', { }); @@ -55,14 +57,19 @@ exports.monCreateServer = function createServer(app){ var workers = _.once(function tick(){ masterPromise.then(function(master){ - var pids = _.keys(master.puppets), - promises = _.map(master.status.statuses(), function(status){ - return master.status.getStatus(status); - }); - when.all(promises) + var pids = _.keys(master.puppets); + + logger.info('[monitor][workers] pids:%j', pids); + + when.map(master.status.statuses(), function(status){ + + return master.status.getStatus(status); + }) .then(function(statusesOfWorkers){ + logger.info('[monitor][workers] statusesOfWorkers:%j', statusesOfWorkers); + _.each(statusesOfWorkers, function(statusOfWorkers){ _.each(statusOfWorkers, function(statusOfWorker){ diff --git a/lib/worker.js b/lib/worker.js index 1f9c4b1..a044e7f 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -228,7 +228,7 @@ Worker.prototype.whenGC = function(usage, type){ _this.gc[type] += 1; - _this.emitter.emit('gc', ['self', 'master'], usage, type); + _this.emitter.emit('gc', ['self'], usage, type); }; Worker.prototype.whenStop = function(){ From 78fa95754fbc291b7867b9a20b71e753fd325846 Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 27 Sep 2013 20:42:54 -0700 Subject: [PATCH 082/182] puppet unit test --- test/puppet-test.js | 122 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 test/puppet-test.js diff --git a/test/puppet-test.js b/test/puppet-test.js new file mode 100644 index 0000000..ca90314 --- /dev/null +++ b/test/puppet-test.js @@ -0,0 +1,122 @@ +'use strict'; + +var should = require('should'), + _ = require('underscore'), + EventEmitter = require('events').EventEmitter, + Puppet = require('../lib/puppet').Puppet, + getLogger = require('../lib/utils').getLogger; + +describe('puppet', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#contructor', function(){ + + it('should create a puppet instance', function(done){ + + var emitter = new EventEmitter(), + pid = Math.floor(process.pid * (1 + Math.random())), + logger = getLogger(), + master = { + 'logger': logger, + 'emitter': emitter, + 'puppets': {}, + + 'fork': function(){ + + } + }, + worker = { + 'process': { + 'pid': pid + }, + + 'disconnect': function(){ + + process.nextTick(function(){ + + emitter.emit('disconnect', worker); + + process.nextTick(function(){ + + emitter.emit('exit', worker); + }); + }); + } + }, + puppet = new Puppet(master, worker, {}, {}); + + master.puppets[pid] = puppet; + + puppet.should.be.ok; + + _.each(['disconnect', 'whenOnline', 'whenListening', 'whenExit', 'whenHeartbeat'], function(m){ + _.isFunction(puppet[m]).should.equal(true); + }); + + _.each(['forkedState', 'activeState', 'oldState', 'diedState'], function(s){ + puppet[s].should.be.ok; + }); + + emitter.once('online', function(worker){ + + puppet.whenOnline(); + }); + + emitter.once('listening', function(worker){ + + puppet.whenListening(); + }); + + emitter.once('heartbeat', function(worker, heartbeat){ + + puppet.whenHeartbeat(); + }); + + emitter.once('disconnect', function(worker){ + + puppet.disconnect(); + }); + + emitter.once('exit', function(worker){ + + puppet.whenExit(); + }); + + puppet.state.should.equal(puppet.forkedState); + + emitter.once('online', function(worker){ + + puppet.worker.should.equal(worker); + puppet.state.should.equal(puppet.forkedState); + + emitter.once('listening', function(worker){ + + puppet.worker.should.equal(worker); + puppet.state.should.equal(puppet.activeState); + + emitter.once('exit', function(worker){ + + puppet.worker.should.equal(worker); + puppet.state.should.equal(puppet.diedState); + + done(); + }); + + emitter.emit('exit', worker); + }); + + emitter.emit('listening', worker); + }); + + emitter.emit('online', worker); + + }); + + }); + +}); \ No newline at end of file From 379e71571c44415cdbf3421d216f05707ddc28f9 Mon Sep 17 00:00:00 2001 From: huz Date: Fri, 27 Sep 2013 21:20:33 -0700 Subject: [PATCH 083/182] fix monitor server issue conflict between node-gc & socket.io? --- lib/monitor.js | 16 +- lib/worker.js | 27 +- npm-shrinkwrap.json | 636 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 4 files changed, 662 insertions(+), 19 deletions(-) create mode 100644 npm-shrinkwrap.json diff --git a/lib/monitor.js b/lib/monitor.js index 8119dbc..e61de26 100644 --- a/lib/monitor.js +++ b/lib/monitor.js @@ -26,7 +26,7 @@ var debugMiddleware = exports.debugMiddleware = function(req, res, next){ return next(); } - logger.info('[monitor][index] renders'); + logger.debug('[monitor][index] renders'); res.render('index', { @@ -60,7 +60,7 @@ exports.monCreateServer = function createServer(app){ var pids = _.keys(master.puppets); - logger.info('[monitor][workers] pids:%j', pids); + logger.debug('[monitor][workers] pids:%j', pids); when.map(master.status.statuses(), function(status){ @@ -68,7 +68,7 @@ exports.monCreateServer = function createServer(app){ }) .then(function(statusesOfWorkers){ - logger.info('[monitor][workers] statusesOfWorkers:%j', statusesOfWorkers); + logger.debug('[monitor][workers] statusesOfWorkers:%j', statusesOfWorkers); _.each(statusesOfWorkers, function(statusOfWorkers){ @@ -93,7 +93,7 @@ exports.monCreateServer = function createServer(app){ } else{ - logger.info('[monitor][workers] detects workers changed:%j from:%j', pids, socket.knownPids); + logger.debug('[monitor][workers] detects workers changed:%j from:%j', pids, socket.knownPids); socket.knownPids = pids;//update pids fs.readFile(path.join(__dirname, '/public/views/workers.ejs'), { @@ -132,7 +132,7 @@ exports.monCreateServer = function createServer(app){ watchings.push(namespace); usr.watch(namespace, null, function(value, key){ - logger.info('[monitor][cache][%s] detects change of:%s', namespace, key); + logger.debug('[monitor][cache][%s] detects change of:%s', namespace, key); usr.inspect(namespace, key).then(function(status){ logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); @@ -155,7 +155,7 @@ exports.monCreateServer = function createServer(app){ 'caches': [] }); - logger.info('[monitor][cache][%s] renders empty caches view', namespace); + logger.debug('[monitor][cache][%s] renders empty caches view', namespace); _.invoke(sockets, 'emit', 'caches', { 'view': 'html', 'namespace': namespace, @@ -176,7 +176,7 @@ exports.monCreateServer = function createServer(app){ usr.ns() .then(function(namespaces){ - logger.info('[monitor][cache] existing namespaces:%s', namespaces); + logger.debug('[monitor][cache] existing namespaces:%s', namespaces); _.each(namespaces || [], function(namespace){ @@ -184,7 +184,7 @@ exports.monCreateServer = function createServer(app){ usr.keys(namespace).then(function(keys){ - logger.info('[monitor][cache][%s] existing keys:%s', namespace, keys); + logger.debug('[monitor][cache][%s] existing keys:%s', namespace, keys); when.map(keys, function(k){ diff --git a/lib/worker.js b/lib/worker.js index a044e7f..97de539 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -5,8 +5,8 @@ var _ = require('underscore'), util = require('util'), timeout = require('when/timeout'), usage = require('usage'), + memwatch = require('memwatch'), BigNumber = require('bignumber.js'), - gc = require('node-gc'), assert = require('assert'); var Worker = exports.Worker = _.once(function(proc, options){ @@ -38,6 +38,8 @@ var Worker = exports.Worker = _.once(function(proc, options){ }, 'gc': { + 'historicIncremental': 0, + 'historicFull': 0, 'incremental': 0, 'full': 0 }, @@ -49,13 +51,13 @@ var Worker = exports.Worker = _.once(function(proc, options){ 'isWorker': true }); - gc.on('scavenge', function(info) { - _this.whenGC('', 'incremental'); - }); - gc.on('marksweep', function(info) { - //got marked and sweeped - _this.whenGC('', 'full'); + memwatch.on('stats', function(stats){ + + if(stats['num_full_gc'] > _this.historicFull || stats['num_inc_gc'] > _this.historicIncremental){ + _this.whenGC(stats); + } }); + process.once('disconnect', _.bind(_this.whenStop, _this, 'disconnect')); process.once('SIGINT', _.bind(_this.whenStop, _this, 'sigint')); process.once('SIGTERM', _.bind(_this.whenExit, _this)); @@ -220,13 +222,18 @@ Worker.prototype.whenHeartbeat = function(){ _this.nextHeartbeat = setTimeout(_.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); }; -Worker.prototype.whenGC = function(usage, type){ +Worker.prototype.whenGC = function(stats){ - var _this = this; + var _this = this, + full = stats['num_full_gc'] - _this.historicFull, + incr = stats['num_inc_gc'] - _this.historicIncremental, + type = full ? 'full' : 'incremental'; - _this.logger.info('[worker] gc usage:%s, type:%s', usage, type); + _this.logger.info('[worker] gc usage:%j, type:%s', usage, type); _this.gc[type] += 1; + _this.historicFull = full; + _this.historicIncremental = incr; _this.emitter.emit('gc', ['self'], usage, type); }; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json new file mode 100644 index 0000000..5507cd0 --- /dev/null +++ b/npm-shrinkwrap.json @@ -0,0 +1,636 @@ +{ + "name": "cluster3", + "version": "0.5.0", + "dependencies": { + "underscore": { + "version": "1.4.4", + "from": "underscore@~1.4.4" + }, + "usage": { + "version": "0.3.8", + "from": "usage@~0.3.8", + "dependencies": { + "bindings": { + "version": "1.1.1", + "from": "bindings@1.x.x" + } + } + }, + "when": { + "version": "2.3.0", + "from": "when@~2.3.0" + }, + "winston": { + "version": "0.7.2", + "from": "winston@~0.7.2", + "dependencies": { + "async": { + "version": "0.2.9", + "from": "async@0.2.x" + }, + "colors": { + "version": "0.6.2", + "from": "colors@0.6.x" + }, + "cycle": { + "version": "1.0.2", + "from": "cycle@1.0.x" + }, + "eyes": { + "version": "0.1.8", + "from": "eyes@0.1.x" + }, + "pkginfo": { + "version": "0.3.0", + "from": "pkginfo@0.3.x" + }, + "request": { + "version": "2.16.6", + "from": "request@2.16.x", + "dependencies": { + "form-data": { + "version": "0.0.10", + "from": "form-data@~0.0.3", + "dependencies": { + "combined-stream": { + "version": "0.0.4", + "from": "combined-stream@~0.0.4", + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "from": "delayed-stream@0.0.5" + } + } + } + } + }, + "mime": { + "version": "1.2.11", + "from": "mime@~1.2.7" + }, + "hawk": { + "version": "0.10.2", + "from": "hawk@~0.10.2", + "dependencies": { + "hoek": { + "version": "0.7.6", + "from": "hoek@0.7.x" + }, + "boom": { + "version": "0.3.8", + "from": "boom@0.3.x" + }, + "cryptiles": { + "version": "0.1.3", + "from": "cryptiles@0.1.x" + }, + "sntp": { + "version": "0.1.4", + "from": "sntp@0.1.x" + } + } + }, + "node-uuid": { + "version": "1.4.1", + "from": "node-uuid@~1.4.0" + }, + "cookie-jar": { + "version": "0.2.0", + "from": "cookie-jar@~0.2.0" + }, + "aws-sign": { + "version": "0.2.0", + "from": "aws-sign@~0.2.0" + }, + "oauth-sign": { + "version": "0.2.0", + "from": "oauth-sign@~0.2.0" + }, + "forever-agent": { + "version": "0.2.0", + "from": "forever-agent@~0.2.0" + }, + "tunnel-agent": { + "version": "0.2.0", + "from": "tunnel-agent@~0.2.0" + }, + "json-stringify-safe": { + "version": "3.0.0", + "from": "json-stringify-safe@~3.0.0" + }, + "qs": { + "version": "0.5.6", + "from": "qs@~0.5.4" + } + } + }, + "stack-trace": { + "version": "0.0.7", + "from": "stack-trace@0.0.x" + } + } + }, + "graceful-fs": { + "version": "2.0.1", + "from": "graceful-fs@~2.0.0" + }, + "request": { + "version": "2.21.0", + "from": "request@~2.21.0", + "dependencies": { + "qs": { + "version": "0.6.5", + "from": "qs@~0.6.0" + }, + "json-stringify-safe": { + "version": "4.0.0", + "from": "json-stringify-safe@~4.0.0" + }, + "forever-agent": { + "version": "0.5.0", + "from": "forever-agent@~0.5.0" + }, + "tunnel-agent": { + "version": "0.3.0", + "from": "tunnel-agent@~0.3.0" + }, + "http-signature": { + "version": "0.9.11", + "from": "http-signature@~0.9.11", + "dependencies": { + "assert-plus": { + "version": "0.1.2", + "from": "assert-plus@0.1.2" + }, + "asn1": { + "version": "0.1.11", + "from": "asn1@0.1.11" + }, + "ctype": { + "version": "0.5.2", + "from": "ctype@0.5.2" + } + } + }, + "hawk": { + "version": "0.13.1", + "from": "hawk@~0.13.0", + "dependencies": { + "hoek": { + "version": "0.8.5", + "from": "hoek@0.8.x" + }, + "boom": { + "version": "0.4.2", + "from": "boom@0.4.x", + "dependencies": { + "hoek": { + "version": "0.9.1", + "from": "hoek@0.9.x" + } + } + }, + "cryptiles": { + "version": "0.2.2", + "from": "cryptiles@0.2.x" + }, + "sntp": { + "version": "0.2.4", + "from": "sntp@0.2.x", + "dependencies": { + "hoek": { + "version": "0.9.1", + "from": "hoek@0.9.x" + } + } + } + } + }, + "aws-sign": { + "version": "0.3.0", + "from": "aws-sign@~0.3.0" + }, + "oauth-sign": { + "version": "0.3.0", + "from": "oauth-sign@~0.3.0" + }, + "cookie-jar": { + "version": "0.3.0", + "from": "cookie-jar@~0.3.0" + }, + "node-uuid": { + "version": "1.4.1", + "from": "node-uuid@~1.4.0" + }, + "mime": { + "version": "1.2.11", + "from": "mime@~1.2.9" + }, + "form-data": { + "version": "0.0.8", + "from": "form-data@0.0.8", + "dependencies": { + "combined-stream": { + "version": "0.0.4", + "from": "combined-stream@~0.0.4", + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "from": "delayed-stream@0.0.5" + } + } + }, + "async": { + "version": "0.2.9", + "from": "async@~0.2.7" + } + } + } + } + }, + "express": { + "version": "3.1.2", + "from": "express@~3.1.0", + "dependencies": { + "connect": { + "version": "2.7.5", + "from": "connect@2.7.5", + "dependencies": { + "qs": { + "version": "0.5.1", + "from": "qs@0.5.1" + }, + "formidable": { + "version": "1.0.11", + "from": "formidable@1.0.11" + }, + "buffer-crc32": { + "version": "0.1.1", + "from": "buffer-crc32@0.1.1" + }, + "bytes": { + "version": "0.2.0", + "from": "bytes@0.2.0" + }, + "pause": { + "version": "0.0.1", + "from": "pause@0.0.1" + } + } + }, + "commander": { + "version": "0.6.1", + "from": "commander@0.6.1" + }, + "range-parser": { + "version": "0.0.4", + "from": "range-parser@0.0.4" + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@~0.3.4" + }, + "cookie": { + "version": "0.0.5", + "from": "cookie@0.0.5" + }, + "buffer-crc32": { + "version": "0.2.1", + "from": "buffer-crc32@~0.2.1" + }, + "fresh": { + "version": "0.1.0", + "from": "fresh@0.1.0" + }, + "methods": { + "version": "0.0.1", + "from": "methods@0.0.1" + }, + "send": { + "version": "0.1.0", + "from": "send@0.1.0", + "dependencies": { + "mime": { + "version": "1.2.6", + "from": "mime@1.2.6" + } + } + }, + "cookie-signature": { + "version": "1.0.0", + "from": "cookie-signature@1.0.0" + }, + "debug": { + "version": "0.7.2", + "from": "debug@*" + } + } + }, + "socket.io": { + "version": "0.9.16", + "from": "socket.io@~0.9.16", + "dependencies": { + "socket.io-client": { + "version": "0.9.16", + "from": "socket.io-client@0.9.16", + "dependencies": { + "uglify-js": { + "version": "1.2.5", + "from": "uglify-js@1.2.5" + }, + "ws": { + "version": "0.4.31", + "from": "ws@0.4.x", + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "commander@~0.6.1" + }, + "nan": { + "version": "0.3.2", + "from": "nan@~0.3.0" + }, + "tinycolor": { + "version": "0.0.1", + "from": "tinycolor@0.x" + }, + "options": { + "version": "0.0.5", + "from": "options@>=0.0.5" + } + } + }, + "xmlhttprequest": { + "version": "1.4.2", + "from": "xmlhttprequest@1.4.2" + }, + "active-x-obfuscator": { + "version": "0.0.1", + "from": "active-x-obfuscator@0.0.1", + "dependencies": { + "zeparser": { + "version": "0.0.5", + "from": "zeparser@0.0.5" + } + } + } + } + }, + "policyfile": { + "version": "0.0.4", + "from": "policyfile@0.0.4" + }, + "base64id": { + "version": "0.1.0", + "from": "base64id@0.1.0" + }, + "redis": { + "version": "0.7.3", + "from": "redis@0.7.3" + } + } + }, + "ejs": { + "version": "0.8.4", + "from": "ejs@~0.8.4" + }, + "node-inspector": { + "version": "0.4.0", + "from": "node-inspector@~0.4.0", + "dependencies": { + "express": { + "version": "3.3.8", + "from": "express@~3.3", + "dependencies": { + "connect": { + "version": "2.8.8", + "from": "connect@2.8.8", + "dependencies": { + "qs": { + "version": "0.6.5", + "from": "qs@0.6.5" + }, + "formidable": { + "version": "1.0.14", + "from": "formidable@1.0.14" + }, + "bytes": { + "version": "0.2.0", + "from": "bytes@0.2.0" + }, + "pause": { + "version": "0.0.1", + "from": "pause@0.0.1" + }, + "uid2": { + "version": "0.0.2", + "from": "uid2@0.0.2" + } + } + }, + "commander": { + "version": "1.2.0", + "from": "commander@1.2.0", + "dependencies": { + "keypress": { + "version": "0.1.0", + "from": "keypress@0.1.x" + } + } + }, + "range-parser": { + "version": "0.0.4", + "from": "range-parser@0.0.4" + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@0.3.5" + }, + "cookie": { + "version": "0.1.0", + "from": "cookie@0.1.0" + }, + "buffer-crc32": { + "version": "0.2.1", + "from": "buffer-crc32@0.2.1" + }, + "fresh": { + "version": "0.2.0", + "from": "fresh@0.2.0" + }, + "methods": { + "version": "0.0.1", + "from": "methods@0.0.1" + }, + "send": { + "version": "0.1.4", + "from": "send@0.1.4", + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "mime@~1.2.9" + } + } + }, + "cookie-signature": { + "version": "1.0.1", + "from": "cookie-signature@1.0.1" + }, + "debug": { + "version": "0.7.2", + "from": "debug@*" + } + } + }, + "async": { + "version": "0.2.9", + "from": "async@~0.2.8" + }, + "glob": { + "version": "3.2.6", + "from": "glob@~3.2.1", + "dependencies": { + "minimatch": { + "version": "0.2.12", + "from": "minimatch@~0.2.11", + "dependencies": { + "lru-cache": { + "version": "2.3.1", + "from": "lru-cache@2" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@~1.0.0" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2" + } + } + }, + "rc": { + "version": "0.3.1", + "from": "rc@~0.3.0", + "dependencies": { + "optimist": { + "version": "0.3.7", + "from": "optimist@~0.3.4", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@~0.0.2" + } + } + }, + "deep-extend": { + "version": "0.2.6", + "from": "deep-extend@~0.2.5" + }, + "ini": { + "version": "1.1.0", + "from": "ini@~1.1.0" + } + } + } + } + }, + "memwatch": { + "version": "0.2.2", + "from": "memwatch@~0.2.0" + }, + "bignumber.js": { + "version": "1.1.1", + "from": "bignumber.js@~1.1.1" + }, + "should": { + "version": "1.2.2", + "from": "should@~1.2.2" + }, + "optimist": { + "version": "0.6.0", + "from": "optimist@~0.6.0", + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@~0.0.2" + }, + "minimist": { + "version": "0.0.5", + "from": "minimist@~0.0.1" + } + } + }, + "mocha": { + "version": "1.11.0", + "from": "mocha@~1.11.0", + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "commander@0.6.1" + }, + "growl": { + "version": "1.7.0", + "from": "growl@1.7.x" + }, + "jade": { + "version": "0.26.3", + "from": "jade@0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "from": "mkdirp@0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" + } + } + }, + "diff": { + "version": "1.0.2", + "from": "diff@1.0.2" + }, + "debug": { + "version": "0.7.2", + "from": "debug@*" + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@0.3.5" + }, + "ms": { + "version": "0.3.0", + "from": "ms@0.3.0" + }, + "glob": { + "version": "3.2.1", + "from": "glob@3.2.1", + "dependencies": { + "minimatch": { + "version": "0.2.12", + "from": "minimatch@~0.2.11", + "dependencies": { + "lru-cache": { + "version": "2.3.1", + "from": "lru-cache@2" + }, + "sigmund": { + "version": "1.0.0", + "from": "sigmund@~1.0.0" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@~1.2.0" + }, + "inherits": { + "version": "1.0.0", + "from": "inherits@1" + } + } + } + } + } + } +} diff --git a/package.json b/package.json index d0dc00a..89b2bb5 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "socket.io": "~0.9.16", "ejs": "~0.8.4", "node-inspector": "~0.4.0", - "node-gc": "~0.2.0", + "memwatch": "~0.2.0", "bignumber.js": "~1.1.1" }, "devDependencies": { From 3066596a8400666061a7550280258322cf32a123 Mon Sep 17 00:00:00 2001 From: huz Date: Sat, 28 Sep 2013 00:34:45 -0700 Subject: [PATCH 084/182] temp fix node-gc & socket.io conflict, added gc monitor option, added master unit test --- lib/index.js | 11 +- lib/master.js | 10 +- lib/public/views/index.ejs | 2 +- lib/worker.js | 35 +- npm-shrinkwrap.json | 636 ------------------------------------- package.json | 2 +- test/master-test.js | 97 ++++++ test/worker-test.js | 5 +- 8 files changed, 139 insertions(+), 659 deletions(-) delete mode 100644 npm-shrinkwrap.json create mode 100644 test/master-test.js diff --git a/lib/index.js b/lib/index.js index 219a2ad..82145cd 100644 --- a/lib/index.js +++ b/lib/index.js @@ -93,13 +93,18 @@ module.exports = { 'cache': { 'enable': true, 'mode': 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + }, + 'gc': { + 'monitor': true, + 'explicit': false } }; _.extend(actualOptions.ecv, options.ecv || {}); _.extend(actualOptions.debug, options.debug || {}); _.extend(actualOptions.cache, options.cache || {}); - _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache')); + _.extend(actualOptions.gc, options.gc || {}); + _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache', 'gc')); assert.ok(actualOptions.monCreateServer); assert.ok(actualOptions.monApp); @@ -149,6 +154,10 @@ module.exports = { 'cache': { 'enable': true, 'mode': 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + }, + 'gc': { + 'monitor': true, + 'explicit': false } }; diff --git a/lib/master.js b/lib/master.js index d88f3a4..0b461c0 100644 --- a/lib/master.js +++ b/lib/master.js @@ -7,7 +7,6 @@ var _ = require('underscore'), assert = require('assert'), util = require('util'), BigNumber = require('bignumber.js'), - Worker = require('./worker').Worker, Puppet = require('./puppet').Puppet, rejectIfPortBusy = require('./utils').rejectIfPortBusy, writePid = require('./utils').writePid, @@ -61,6 +60,7 @@ Master.prototype.initialize = function(proc, options){ } } + options.ecv.emitter = options.ecv.emitter || options.emitter; enable(options.monApp, options.ecv); _.each(_.range(0, _this.noWorkers), function(ith){ @@ -136,7 +136,9 @@ Master.prototype.initialize = function(proc, options){ } else if(proc.env && proc.env.CACHE_MANAGER){ - var manager = require('./cache-mgr'); + var Worker = require('./worker').Worker, + manager = require('./cache-mgr'); + _.extend(options, { 'createServer': manager.createServer, 'app': manager.app, @@ -144,11 +146,13 @@ Master.prototype.initialize = function(proc, options){ 'warmUp': manager.afterServerStarted, 'debug': false }); - + return new Worker(proc, options); } else{ + var Worker = require('./worker').Worker; + _.extend(options, { 'debug': process.env && process.env.debug }); diff --git a/lib/public/views/index.ejs b/lib/public/views/index.ejs index 6ec6268..a46c23d 100644 --- a/lib/public/views/index.ejs +++ b/lib/public/views/index.ejs @@ -65,7 +65,7 @@ - - - - - - - - -<%- partial("header") %> - -
    -<%- body %> - - -
    - - diff --git a/public/views/logs.ejs b/public/views/logs.ejs deleted file mode 100644 index d9a0e38..0000000 --- a/public/views/logs.ejs +++ /dev/null @@ -1,22 +0,0 @@ -

    Log Files

    - - - - - - - - - - - - <% for(var i = 0; i < logs.length; i++) { %> - - - - - - - <% } %> - -
    FileSizeCreatedLast Modifled
    <%=logs[i].filename%><%=logs[i].stats.size%><%=logs[i].stats.ctime%><%=logs[i].stats.mtime%>
    diff --git a/test/cluster-test.js b/test/cluster-test.js deleted file mode 100644 index c195a36..0000000 --- a/test/cluster-test.js +++ /dev/null @@ -1,635 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -var spawn = require('child_process').spawn, - request = require('request'), - fs = require('fs'), - os = require('os'), - EventEmitter = require('events').EventEmitter, - when = require('when'), - util = require('util'), - _ = require('underscore'), - harbor = require('harbor')(3000, 5000); - -var debug = false; -function log() { - if(debug) { - console.log.apply(null, (arguments || []).join('')); - } -} -var test = 't', - ith = 0, - port = 3000, - monPort = 10000 - port; - -module.exports = { - - setUp: function (callback) { - - harbor.claim(test + (ith += 1), function(err, p){ - - port = p; - - harbor.claim(test + (ith += 1), function(err, p){ - - monPort = p; - - callback(); - }); - }); - }, - - 'start and then stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - stop(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, check heartbeat and stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - - var timeOut = setTimeout(function(){ - test.ok(false, "timeout and no heartbeat found"); - stop(emitter); - }, 5000); - - emitter.once('heartbeat', function(heartbeat){ - - console.log('got heartbeat!!!\j%j', heartbeat); - test.ok(heartbeat.pid); - //test.ok(heartbeat.uptime); - //test.ok(heartbeat.totalmem); - //test.ok(heartbeat.freemem); - - clearTimeout(timeOut); - stop(emitter); - }); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, check ecv and stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function() { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - setTimeout(function(){ - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - // Regex to match the expected response. Tricky part is the IPv4 match. - // Very naive exp to check numbers 0 - 255. - // (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? ) -> ( numbers 250 to 255 | numbers 200 to 249 | numbers 0 to 199) - // Same expression for each of the 4 IPs - var hostname = require('os').hostname(); - var re = new RegExp(util.format( - 'status=AVAILABLE&ServeTraffic=true&ip=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)&hostname=%s&port=%d&time=.*', - hostname, - port)); - - test.ok(re.exec(body) !== null, - util.format('expected:status=AVAILABLE&ServeTraffic=true&ip=&hostname=%s&port=%d&time=.*&error=%s&body=%s', hostname, port, error, body)); - - stop(emitter); - }) - }, 1000); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function() { - waitForStop.apply(null, [emitter, test, 0, 100]); - }); - - emitter.on('stopped', function() { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function(err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }) - - emitter.emit('starting'); - }, - - 'start and then shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - shutdown(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - - 'start, send traffic, get responses, and then shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - var respCount = 0; - for(var i = 0; i < 10; i++) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - if(error) { - test.ok(false, 'got error from server') - } - else { - respCount++; - if(respCount === 10) { - return shutdown(emitter); - } - } - }); - } - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, graceful shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - var respCount = 0; - - emitter.on('started', function () { - for(var i = 0; i < 2000; i++) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - if(error) { - test.ok(false, 'got error from server') - } - else { - respCount++; - } - }); - } - // Send shutdown while requests are in-flight - setTimeout(function() { - shutdown(emitter); - }, 10); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - // Ensure that all in-flight requests are handled - test.equals(respCount, 2000); - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, check recycle on threshold, shutdown': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - var respCount = 0, errCount = 0; - emitter.on('started', function () { - var paths = fs.readdirSync('./pids'); - - // connThreshold is 10. So, sending 20+ requests without pooling would cause - // recycle - for(var i = 0; i < 100; i++) { - request({ - uri: util.format('http://localhost:%d', port), - headers: { - 'connection': 'close' - } - }, function (error, response, body) { - if(error) { - test.ok(false, error.message || 'got error from server') - } - else { - respCount++; - } - if(respCount === 100) { - // Wait for process recycling to complete - setTimeout(function() { - // Before shutting down, check the pids again - var pathsEnd = fs.readdirSync('./pids'); - test.ok(pathsEnd.length > paths.length, 'Expected more processes'); - shutdown(emitter); - }, 5000); - } - }); - } - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.ok(respCount + errCount, 2000); - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, abrupt stop': function (test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - var respCount = 0, errCount = 0; - emitter.on('started', function () { - for(var i = 0; i < 2000; i++) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - if(error) { - errCount++; - } - else { - respCount++; - } - }); - } - // Send shutdown while requests are in-flight - stop(emitter); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - // Ensure that all in-flight requests are handled - test.ok(respCount + errCount, 2000); - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }); - - emitter.emit('starting'); - }, - - 'start, disable, enable and stop': function(test) { - var emitter = new EventEmitter(), child = start(emitter); - - emitter.on('starting', function () { - waitForStart(child, emitter, test, 0, 100); - }); - - emitter.on('started', function () { - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - // Regex to match the expected response. Tricky part is the IPv4 match. - // Very naive exp to check numbers 0 - 255. - // (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? ) -> ( numbers 250 to 255 | numbers 200 to 249 | numbers 0 to 199) - // Same expression for each of the 4 IPs - var hostname = require('os').hostname(); - var re = new RegExp(util.format( - 'status=AVAILABLE&ServeTraffic=true&ip=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)&hostname=%s&port=%d&time=.*', - hostname, - port)); - var result = re.exec(body); - test.ok(result !== null, - util.format('expected:status=AVAILABLE&ServeTraffic=true&ip=&hostname=%s&port=%d&time=.*', hostname, port)); - - request({uri: util.format('http://localhost:%d/ecv/disable', port), method: 'POST'}, function (error, response, body) { - // Wait for signal to propagate to workers - setTimeout(function() { - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - re = new RegExp(util.format( - 'status=DISABLED&ServeTraffic=false&ip=(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)&hostname=%s&port=%d&time=.*', - hostname, - port)); - var result = re.exec(body); - test.ok(result !== null, - util.format('expected:status=AVAILABLE&ServeTraffic=false&ip=&hostname=%s&port=%d&time=.*', hostname, port)); - request({uri: util.format('http://localhost:%d/ecv/enable', port), method: 'POST'}, function (error, response, body) { - if(error) { - test.ok(false, 'could not enable again'); - } - setTimeout(function() { - request(util.format('http://localhost:%d/ecv', port), function (error, response, body) { - if(error) { - test.ok(false, 'ecv did not succeed'); - } - stop(emitter); - }); - }, 200); - }); - }); - - }, 200); - }); - }); - }); - - emitter.on('start failure', function (error) { - log('Failed to start ', error.stack || error); - test.ok(false, 'failed to start') - }); - - emitter.on('stopping', function () { - waitForStop.apply(null, [emitter, test, 0, 100]) - }); - - emitter.on('stopped', function () { - log('Stopped'); - // Assert that there are 0 pids. - fs.readdir('./pids', function (err, paths) { - test.equal(paths.length, 0); - }); - test.done(); - }) - - emitter.emit('starting'); - } -} - -// Start the cluster -function start(emitter) { - log('Starting'); - var env = {}; - _.extend(env, process.env); - _.extend(env, { - port:port, - monPort:monPort, - heartbeatInterval:100 - }); - var start = spawn('node', ['test/lib/server.js'], { - env: env, - stdio: ['pipe', 1, 2, 'ipc']//enable piped stdout, and ipc for messaging - }); - - start.on('message', function(message){ - - if(message.type === 'heartbeat'){ - emitter.emit(message.type, message); - } - }); - - start.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - return start; -} - -function stop(emitter) { - log('Stopping'); - var stop = spawn('node', ['test/lib/stop.js']); - - stop.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - stop.stdout.setEncoding('utf8'); - stop.stdout.on('data', function (data) { - log(data); - }); - emitter.emit('stopping'); -} - -function shutdown(emitter) { - log('Shutting down'); - var shutdown = spawn('node', ['test/lib/shutdown.js']); - shutdown.on('exit', function (code, signal) { - log('Process exited with signal ', signal, ' and code ', code); - }); - - shutdown.stdout.setEncoding('utf8'); - shutdown.stdout.on('data', function (data) { - log(data); - }); - emitter.emit('stopping'); -} - -/* -function waitForStart(child, emitter, test, current, max) { - current++; - if(current < max) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - log('Waiting for server to start'); - if(error) { - log('Error: ', error.stack || error); - if(error.code === 'ECONNREFUSED') { - setTimeout(function () { - waitForStart.apply(null, [child, emitter, test, current, max]) - }, 100); - } - } - else { - emitter.emit('started'); - } - }); - } - else { - test.ok(false, 'Server did not start. Giving up'); - test.done(); - } -} -*/ - -function waitForStart(child, emitter, test) { - - var deferred = when.defer(); - var timeOut = setTimeout(function(){ - deferred.reject(new Error("timeout")); - }, 3000); - - var handler = function(message){ - if(message.ready){ - clearTimeout(timeOut); - child.removeListener("message", handler); - - setTimeout(function(){ - deferred.resolve(message); - }, 2000); - } - if(message.type === 'heartbeat'){ - emitter.emit('heartbeat', message); - } - }; - child.on("message", handler); - - deferred.promise - .then(function(){ - emitter.emit("started"); - }) - .otherwise(function(error){ - test.ok(false, error); - test.done(); - }); -} - -function waitForStop(emitter, test, current, max) { - current++; - if(current < max) { - request(util.format('http://localhost:%d', port), function (error, response, body) { - log('Waiting for server to stop'); - if(error) { - emitter.emit('stopped'); - } - else { - setTimeout(function () { - waitForStop.apply(null, [emitter, test, current, max]) - }, 100); - } - }); - } - else { - test.ok(false, 'Server did not start. Giving up'); - test.done(); - } -} - - diff --git a/test/component-status-test.js b/test/component-status-test.js deleted file mode 100644 index 05ed56e..0000000 --- a/test/component-status-test.js +++ /dev/null @@ -1,102 +0,0 @@ -// 'use strict'; - -// var componentStatus = require('../lib/component-status.js').componentStatus, -// should = require('should'); - -// describe('component-status', function(){ - -// describe('#register', function(){ - -// it('should allow registration', function(done){ - -// componentStatus.register('health', function(params){ -// return 'i am healthy\n'; -// }); - -// componentStatus.reducer('health', function(memoize, health){ -// return { -// value : memoize && health -// }; -// }); - -// componentStatus.getComponents().should.include('health'); - -// componentStatus.getStatus('health', { -// done : function(status){ -// status.should.be.ok; -// done(); -// } -// }); -// }); - -// it('should allow update of status of the updater is given', function(done){ -// var trafficEnabled = true; -// componentStatus.register('traffic-enabled', -// function(params){ -// return trafficEnabled; -// }, -// 'array', -// function(params, value){ -// trafficEnabled = value; -// }); - -// componentStatus.getStatus('traffic-enabled', { -// 'done': function(status){ -// status.should.be.ok; -// status[0].should.be.ok; - -// componentStatus.setStatus('traffic-enabled', { -// 'done': function(){ - -// componentStatus.getStatus('traffic-enabled', { -// 'done': function(status){ - -// status.should.be.ok; -// status[0].should.not.be.ok; - -// done(); -// } -// }); -// } -// }, false); -// } -// }); -// }); - -// it('should allow update of status of the updater is given from worker', function(done){ -// var trafficEnabled = true; -// componentStatus.register('traffic-enabled', -// function(params){ -// return trafficEnabled; -// }, -// 'array', -// function(params, value){ -// trafficEnabled = value; -// }); - -// componentStatus.getStatus('traffic-enabled', { -// 'worker': process.pid, -// 'done': function(status){ -// status.should.be.ok; -// status[0].should.be.ok; - -// componentStatus.setStatus('traffic-enabled', { -// 'worker': process.pid, -// 'done': function(){ - -// componentStatus.getStatus('traffic-enabled', { -// 'worker': process.pid, -// 'done': function(status){ - -// status.should.be.ok; -// status[0].should.not.be.ok; - -// done(); -// } -// }); -// } -// }, false); -// } -// }); -// }); -// }); diff --git a/test/lib/server.js b/test/lib/server.js deleted file mode 100644 index ac8ee7f..0000000 --- a/test/lib/server.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'), - express = require('express'); - -var server = express.createServer(); -var serving = true; -server.get('/', function(req, res) { - res.send('hello'); - if(!serving) { - req.connection.end(); - } -}); - -// test nanny feature -server.get('/nanny-feature-test', function (req, res) { - // the first worker that handles the request will run away - res.send(process.pid + ''); - console.log('worker ' + process.pid + ' will run away after 2s'); - setTimeout(function () { - console.log('worker ' + process.pid + ' runs away'); - clearInterval(process.heartbeat); - }, 2000); -}); - -server.on('close', function() { - serving = false; -}) - -var c = new Cluster({ - timeout: 300 * 1000, - port: process.env["port"] || 3000, - monPort: process.env["monPort"] || 10000 - process.env["port"] || 3001, - cluster: true, - noWorkers: process.env["noWorkers"] || 2, - connThreshold: 10, - ecv: { - control: true - }, - heartbeatInterval: process.env["heartbeatInterval"] || 1000, - maxHeartbeatDelay: process.env["maxHeartbeatDelay"] || 3000 -}); - -c.on('died', function(pid) { - //console.log('Worker ' + pid + ' died'); - process.send({ - pid: pid, - dead: true - }) -}); - -c.on('forked', function(pid) { - //console.log('Worker ' + pid + ' forked'); -}); - -c.on('listening', function(pid){ - //console.log('Worker ' + pid + ' listening'); - process.send({ - ready: true - }); -}); - -c.on('SIGKILL', function() { - //console.log('Got SIGKILL'); - process.send({ - 'signal':'SIGKILL' - }); -}); - -c.on('SIGTERM', function(event) { - //console.log('Got SIGTERM - shutting down'); - console.log(event); - process.send({ - 'signal':'SIGTERM' - }); -}); - -c.on('SIGINT', function() { - //console.log('Got SIGINT'); - process.send({ - 'signal':'SIGINT' - }); -}); - -c.on('heartbeat', function(heartbeat){ - - //console.log('Got HEARTBEAT:%j', heartbeat); - heartbeat.type = 'heartbeat'; - process.send(heartbeat); -}); - -c.listen(function(cb) { - cb(server); -}); diff --git a/test/lib/shutdown.js b/test/lib/shutdown.js deleted file mode 100644 index d122ae0..0000000 --- a/test/lib/shutdown.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'); -var c = new Cluster(); -c.shutdown(); \ No newline at end of file diff --git a/test/lib/stop.js b/test/lib/stop.js deleted file mode 100644 index febe6b9..0000000 --- a/test/lib/stop.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'); -var c = new Cluster(); -c.stop(); \ No newline at end of file diff --git a/test/lib/wsserver.js b/test/lib/wsserver.js deleted file mode 100644 index 4b36154..0000000 --- a/test/lib/wsserver.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2012 eBay Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var Cluster = require('../../lib/index.js'), - WebSocketServer = require('websocket').server, - http = require("http"); - -var server = http.createServer(function(request, response) { - console.log((new Date()) + ' Received request for ' + request.url); - response.writeHead(200); - response.end(); -}); - -var wsServer = new WebSocketServer({ - httpServer: server, - // You should not use autoAcceptConnections for production - // applications, as it defeats all standard cross-origin protection - // facilities built into the protocol and the browser. You should - // *always* verify the connection's origin and decide whether or not - // to accept it. - autoAcceptConnections: false -}); - -function originIsAllowed(origin) { - // put logic here to detect whether the specified origin is allowed. - return true; -} - -wsServer.on('request', function(request) { - if (!originIsAllowed(request.origin)) { - // Make sure we only accept requests from an allowed origin - request.reject(); - console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); - return; - } - - var connection = request.accept('echo-protocol', request.origin); - console.log((new Date()) + ' Connection accepted.'); - connection.on('message', function(message) { - - if (message.type === 'utf8') { - console.log('Process:' + process.pid + ' Received Message: ' + message.utf8Data); - connection.sendUTF(message.utf8Data); - } - else if (message.type === 'binary') { - console.log('Process:' + process.pid + ' Received Binary Message of ' + message.binaryData.length + ' bytes'); - connection.sendBytes(message.binaryData); - } - }); - connection.on('close', function(reasonCode, description) { - console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); - - wsServer.close(); - }); -}); - -server.on('close', function() { - serving = false; -}) - -var c = new Cluster({ - timeout: 300 * 1000, - port: process.env["port"] || 3000, - monPort: process.env["monPort"] || 10000 - process.env["port"] || 3001, - cluster: true, - noWorkers: process.env["noWorkers"] || 2, - connThreshold: 10, - ecv: { - control: true - }, - heartbeatInterval: 1000 -}); - -c.on('died', function(pid) { - console.log('Worker ' + pid + ' died'); - process.send({ - dead: true - }) -}); - -c.on('forked', function(pid) { - console.log('Worker ' + pid + ' forked'); -}); - -c.on('listening', function(pid){ - console.log('Worker ' + pid + ' listening'); - process.send({ - ready: true - }); -}); - -c.on('SIGKILL', function() { - console.log('Got SIGKILL'); - process.send({ - 'signal':'SIGKILL' - }); -}); - -c.on('SIGTERM', function(event) { - console.log('Got SIGTERM - shutting down'); - console.log(event); - process.send({ - 'signal':'SIGTERM' - }); -}); - -c.on('SIGINT', function() { - console.log('Got SIGINT'); - process.send({ - 'signal':'SIGINT' - }); -}); - -c.on('heartbeat', function(heartbeat){ - - heartbeat.type = 'heartbeat'; - process.send(heartbeat); -}); - -c.listen(function(cb) { - cb(server); -}); diff --git a/test/nanny-feature-test.js b/test/nanny-feature-test.js deleted file mode 100644 index a0d5d7b..0000000 --- a/test/nanny-feature-test.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict'; - -var should = require('should'), - request = require('request'), - _ = require('underscore'), - spawn = require('child_process').spawn, - nodeunit = require('nodeunit'), - EventEmitter = require('events').EventEmitter, - emitter = new EventEmitter(), - childProc; - -exports['Nanny Feature Test'] = { - setUp: function (callback) { - var env = {}; - _.extend(env, process.env); - _.extend(env, { - host: '127.0.0.1', - port: 3000, - monPort: 3001, - noWorkers: 2, - hearheatInterval: 500, - maxHeartbeatDelay: 1500 - }); - - childProc = spawn('node', ['test/lib/server.js'], { - env: env, - stdio: ['pipe', 1, 2, 'ipc'] - }); - - childProc.once('message', function (msg) { - if (msg.ready) { - //test.done(); - callback(); - } - }); - }, - - tearDown: function (callback) { - childProc.kill('SIGKILL'); - callback(); - }, - - 'worker runs away and gets killed & replacement has been created': function (test) { - var pid; - request.get('http://127.0.0.1:3000/nanny-feature-test', function (err, res, body) { - test.equal(err, null); - test.ok(body); - pid = parseInt(body); - console.log(pid); - }); - childProc.on('message', function (msg) { - if (msg.dead) { - console.log(msg.pid); - test.strictEqual(msg.pid, pid); - request.get('http://127.0.0.1:3001/ComponentStatus?component=worker', function (err, res, body) { - console.log(body); - var pids = body.substring(1, body.length - 1).split(','); - test.strictEqual(pids.length, 3); // master & 2 workers - test.done(); - }); - } - }); - }, - - /*'New worker created to replace the killed worker': function (test) { - request.get('http://127.0.0.1:3001/ComponentStatus?component=worker', function (err, res, body) { - var pids = body.substring(1, body.length - 1).split(','); - test.strictEqual(pids.length, 3); // master & 2 workers - test.done(); - }); - }*/ -}; diff --git a/test/wscluster-test.js b/test/wscluster-test.js deleted file mode 100644 index d2cb241..0000000 --- a/test/wscluster-test.js +++ /dev/null @@ -1,234 +0,0 @@ -// /* -// * Copyright 2012 eBay Software Foundation -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// */ - -// 'use strict'; - -// var spawn = require('child_process').spawn, -// request = require('request'), -// fs = require('fs'), -// os = require('os'), -// EventEmitter = require('events').EventEmitter, -// util = require('util'), -// _ = require('underscore'), -// when = require('when'), -// WebSocketClient = require("websocket").client; - -// var debug = false; -// function log() { -// if(debug) { -// console.log.apply(null, (arguments || []).join('')); -// } -// } -// var port = 3000, -// monPort = 10000 - port; - -// module.exports = { - -// setUp: function (callback) { -// //to ensure that occupying ports won't cause all test cases to fail -// fs.exists("./ports", function(exists){ -// if(!exists){ -// fs.writeFileSync("./ports", port); -// } -// fs.readFile("./ports", -// function(err, data){ -// port = parseInt(data, 10) + 1; -// if(port >= 5000){ -// port = 3000; -// } -// monPort = 10000 - port; -// fs.writeFile("./ports", "" + port, { -// encoding : "utf8" -// }, -// function(){ -// callback(); -// }); -// }); -// }); -// }, - -// tearDown: function(callback){ -// callback(); -// }, - -// 'start and then stop': function(test) { -// var emitter = new EventEmitter(), child = start(emitter); - -// emitter.on('starting', function() { -// waitForStart(child, emitter, test, 0, 100); -// }); - -// emitter.on('started', function () { -// //create 10 clients and verify that the websocket has been opened and served by different cluster workers. -// _.each(_.range(0, 10), function(e){ -// var client = new WebSocketClient(); -// client.on('connectFailed', function(error) { -// console.log('Connect Error: ' + error.toString()); -// }); - -// client.on('connect', function(connection) { -// console.log('WebSocket client connected'); -// connection.on('error', function(error) { -// console.log("Connection Error: " + error.toString()); -// }); -// connection.on('close', function() { -// console.log('echo-protocol Connection Closed'); -// }); -// connection.on('message', function(message) { -// if (message.type === 'utf8') { -// console.log("Received: '" + message.utf8Data + "'"); -// } -// }); - -// var now = new Date().getTime(); -// function sendNumber() { -// if (connection.connected) { -// var number = Math.round(Math.random() * 0xFFFFFF); -// connection.sendUTF(number.toString()); -// } -// if(new Date().getTime() - now < 10000){ -// setTimeout(sendNumber, 1000); -// } -// else{ -// stop(emitter); -// } -// } -// sendNumber(); -// }); - -// client.connect('ws://localhost:' + port + '/', 'echo-protocol'); -// }); -// }); - -// emitter.on('start failure', function (error) { -// log('Failed to start ', error.stack || error); -// test.ok(false, 'failed to start') -// }); - -// emitter.on('stopping', function() { -// waitForStop.apply(null, [emitter, test, 0, 100]) -// }); - -// emitter.on('stopped', function() { -// log('Stopped'); -// // Assert that there are 0 pids. -// fs.readdir('./pids', function(err, paths) { -// //test.equal(paths.length, 0); -// }); - -// test.done(); -// }); - -// emitter.emit('starting'); -// } -// } - -// // Start the cluster -// function start(emitter) { -// log('Starting'); -// var env = {}; -// _.extend(env, process.env); -// _.extend(env, { -// port:port, -// monPort:monPort -// }); -// var start = spawn('node', ['test/lib/wsserver.js'], { -// env: env, -// stdio: ['pipe', 1, 2, 'ipc']//enable piped stdout, and ipc for messaging -// }); -// start.on('exit', function (code, signal) { -// log('Process exited with signal ', signal, ' and code ', code); -// }); - -// return start; -// } - -// function stop(emitter) { -// log('Stopping'); -// var stop = spawn('node', ['test/lib/stop.js']); -// stop.on('exit', function (code, signal) { -// log('Process exited with signal ', signal, ' and code ', code); -// }); - -// stop.stdout.setEncoding('utf8'); -// stop.stdout.on('data', function (data) { -// log(data); -// }); -// emitter.emit('stopping'); -// } - -// function shutdown(emitter) { -// log('Shutting down'); -// var shutdown = spawn('node', ['test/lib/shutdown.js']); -// shutdown.on('exit', function (code, signal) { -// log('Process exited with signal ', signal, ' and code ', code); -// }); - -// shutdown.stdout.setEncoding('utf8'); -// shutdown.stdout.on('data', function (data) { -// log(data); -// }); -// emitter.emit('stopping'); -// } - -// function waitForStart(child, emitter, test) { - -// var deferred = when.defer(); -// var timeOut = setTimeout(function(){ -// deferred.reject(new Error("timeout")); -// }, 3000); - -// child.on("message", function(message){ -// if(message.ready){ -// clearTimeout(timeOut); -// deferred.resolve(); -// } -// if(message.type === 'heartbeat'){ -// emitter.emit('heartbeat', message); -// } -// }); - -// deferred.promise.then(function(){ -// emitter.emit("started"); -// }) -// .otherwise(function(error){ -// test.ok(false, error); -// test.done(); -// }); -// } - -// function waitForStop(emitter, test, current, max) { -// current++; -// if(current < max) { -// request(util.format('http://localhost:%d', port), function (error, response, body) { -// log('Waiting for server to stop'); -// if(error) { -// emitter.emit('stopped'); -// } -// else { -// setTimeout(function () { -// waitForStop.apply(null, [emitter, test, current, max]) -// }, 100); -// } -// }); -// } -// else { -// test.ok(false, 'Server did not start. Giving up'); -// test.done(); -// } -// } - - From 603db02cf9cb862c15e8103e429901e230e6ea86 Mon Sep 17 00:00:00 2001 From: zhuwang Date: Sat, 2 Nov 2013 19:10:32 -0700 Subject: [PATCH 138/182] Clean the branch --- .gitignore | 1 + .npmignore | 4 + .travis.yml | 6 +- README.md | 637 ++++++++++++++++++++++++++ cache.js | 3 + emitter.js | 3 + examples/cluster-demo.js | 60 +++ examples/cluster-longrun.js | 112 +++++ examples/cluster-run.js | 40 ++ examples/public/stylesheets/style.css | 7 + examples/routes/index.js | 20 + examples/views/index.dust | 4 + examples/views/layout.dust | 16 + lib/cache-common.js | 92 ++++ lib/cache-mgr.js | 384 ++++++++++++++++ lib/cache-usr.js | 495 ++++++++++++++++++++ lib/cache.js | 192 ++++++++ lib/ecv.js | 89 ++++ lib/emitter.js | 240 ++++++++++ lib/index.js | 318 +++++++++++++ lib/master.js | 462 +++++++++++++++++++ lib/monitor.js | 327 +++++++++++++ lib/public/images/live-debugging.png | Bin 0 -> 853836 bytes lib/puppet.js | 188 ++++++++ lib/status.js | 142 ++++++ lib/utils.js | 454 ++++++++++++++++++ lib/views/caches.ejs | 54 +++ lib/views/index.ejs | 84 ++++ lib/views/workers.ejs | 133 ++++++ lib/worker.js | 318 +++++++++++++ package.json | 43 ++ shutdown.js | 67 +++ status.js | 3 + test/api-test.js | 52 +++ test/cache-test.js | 193 ++++++++ test/cluster-emitter-test.js | 77 ++++ test/cluster-status-test.js | 156 +++++++ test/ecv-test.js | 192 ++++++++ test/lib/cluster-emitter-runtime.js | 119 +++++ test/lib/cluster-status-runtime.js | 125 +++++ test/master-test.js | 113 +++++ test/puppet-test.js | 131 ++++++ test/utils-test.js | 468 +++++++++++++++++++ test/worker-test.js | 152 ++++++ 44 files changed, 6775 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 cache.js create mode 100644 emitter.js create mode 100644 examples/cluster-demo.js create mode 100644 examples/cluster-longrun.js create mode 100644 examples/cluster-run.js create mode 100644 examples/public/stylesheets/style.css create mode 100644 examples/routes/index.js create mode 100644 examples/views/index.dust create mode 100644 examples/views/layout.dust create mode 100644 lib/cache-common.js create mode 100644 lib/cache-mgr.js create mode 100644 lib/cache-usr.js create mode 100644 lib/cache.js create mode 100644 lib/ecv.js create mode 100644 lib/emitter.js create mode 100644 lib/index.js create mode 100644 lib/master.js create mode 100644 lib/monitor.js create mode 100644 lib/public/images/live-debugging.png create mode 100644 lib/puppet.js create mode 100644 lib/status.js create mode 100644 lib/utils.js create mode 100644 lib/views/caches.ejs create mode 100644 lib/views/index.ejs create mode 100644 lib/views/workers.ejs create mode 100644 lib/worker.js create mode 100644 package.json create mode 100644 shutdown.js create mode 100644 status.js create mode 100644 test/api-test.js create mode 100644 test/cache-test.js create mode 100644 test/cluster-emitter-test.js create mode 100644 test/cluster-status-test.js create mode 100644 test/ecv-test.js create mode 100644 test/lib/cluster-emitter-runtime.js create mode 100644 test/lib/cluster-status-runtime.js create mode 100644 test/master-test.js create mode 100644 test/puppet-test.js create mode 100644 test/utils-test.js create mode 100644 test/worker-test.js diff --git a/.gitignore b/.gitignore index 00bd4da..080625b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ reports target docs logs +log cluster-cache-domain cluster-cache-persist ports diff --git a/.npmignore b/.npmignore index bbb769f..ac7d04a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,7 +1,11 @@ *.iml .travis.yml +.idea node_modules test +examples +log +pids cluster-cache-domain cluster-cache-persist ports \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index e216e48..bafc11b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,10 @@ language: node_js node_js: - - 0.8 + - 0.10 + +branches: + only: + - cluster3 before_script: - "npm install" diff --git a/README.md b/README.md new file mode 100644 index 0000000..2c25730 --- /dev/null +++ b/README.md @@ -0,0 +1,637 @@ +cluster2 +=============== + +This is a completely overhaul, not expected to be backward compatible, but the features should cover the most popular while some changes are on their way: + +## simplification + +You'll see that we've simplified the api a great deal, no more cluster class, instance to worry, a single #listen method to take all dancing parts. +And those configurable pieces mostly have reasonable defaults, and could be easily set from command line arguments. For example, `--port=8080`, `--cache.enable` etc. +Also we've adopted Promise A+ (when.js). style to replace the callbacks, we like it for the fewer level of nested code, a lot. +You'll also find some redundant features like: multiple app/port support, ecv on workers, none cluster mode, all removed to keep code compact. + +* **`cluster`** + +```javascript +var listen = require('cluster2').listen; + +listen({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, //your express app + 'port': 9090, //express app listening port + 'configureApp': function(app){ + //register your routes, middlewares to the app, must return value or promise + return app; + }, + 'warmUp': function(app){ + //warm up your application, must return value or promise + return app; + }, + 'debug': { //node-inspector integration + 'webPort': 9092, //node-inspector web listening port + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'control', + 'root': '/ecv' + }, + 'cache': { + 'enable': true, //check cache section + 'mode': 'standalone' //default creates a standalone worker specific to run as cache manager, otherwise use master to run + }, + 'gc': { + 'monitor': true, //will reflect the gc (incremental, full) in heartbeat, this conflicts with socket.io somehow + 'idle-noitification': false, //for performance reason, we'll disable node idle notification to v8 by default + 'explicit': false //yet impl, meant to expose gc() as a global function + }, + 'monCreateServer': require('http').createServer, //tell master what mon app server should be created as + 'monConfigureApp': function(monApp){//could overwrite with your own monitor app, and configure it + return monApp; + }, + 'monApp': monApp, + 'monPort': 9091, //monitoring app listening port + 'maxAge': 3600, //worker's max life in seconds, default is 3 days + 'heartbeatInterval': 5000 //heartbeat interval in MS +}) +.then(function(resolved){ + //cluster started + //resolved is an object which embeds server, app, port, etc. + //this is quite useful, you must understand that both master and workers will get to here (due to fork) + //if it's worker, it means the warmup of that worker process has been finished (and listening already happen of course) + //if it's master, it means all of the workers (noWorkers) asked to be created initially have all been warmed up + //and implicitly, the ecv if enabled, will return 200 to whoever polls for the status +}) +.otherwise(function(error){ + //cluster start error +}); +//the major change is the return of promise and the much simplified #listen (as all options pushed to construction) + +``` + +## application flow + +For this cluster2 to work perfect, you might need to accept some of the assumption we made of your application flow. It exists to make your life easier, so as for our middleware registration to work as expected. +The flow is as the following: + +* master starts `listen` +* master configures `monApp` with given `monConfigureApp` +* master starts `caching` service if enabled +* master creats server using `monCreateServer` and takes in configured `monApp` +* master starts server on the `monPort` and wait for `listening` event +* master starts forking workers +* worker starts `listen` +* worker configures `app` with given `configureApp` +* worker creates server using `createServer` and takes in configured `app` +* worker starts server on `port` and wait for `listening` event +* worker receives `listening` event and starts `warmup` +* worker waits for `warmup` to complete and notify master that it's ready to serve traffic +* worker resolves the `promise` returned by `listen` +* master receives notifications from all workers then mark up `ecv` +* master then resolves the `promise` returned by `listen` + +A few key points: +* The abstract pattern is the same for master & worker (different in what's done in each step): **listen** -> **configure app** -> **create server** -> **server listen** -> **warmup** -> **resolve promise** +* Caching service starts early, so that you could start using cache whether in master or worker, after **configure app** +* WarmUp is added as an explicit step to allow application to be performant when the traffic is on. +* Configure app, and warmup could return value (app) or promise which resolves to the app. + +A clear flow as above allows users to inject their middleware, routes, warm up their application in a deterministic manner. +And we could leverage this, so that we could safely register middleware like tps collection in front of users'. This makes testing much easier too, +as the promise won't be resolved till the server actually starts, no more timed waiting, event emitting etc. You're good to request anything by then. + +## emitter + +Cluster used to be an emitter itself, which isn't very much helpful, and forced event register/emit to be delayed till the cluster instance is created. +Even if it's created, accessing the instance from different modules require the instance to be passed down, or global, neither looks appealing. +The new cluster-emitter is designed to work with cluster not cluster2 instance at all (in fact, we eliminated the cluster2 instance as you see the api above) +The emitter also makes communications between worker & master (or reverse) as simple as a normal EventEmitter. + +```javascript +var emitter = require('cluster2/emitter'); + +emitter.on('event', function callback(){ + //an event callback +}); + +emitter.once('event', function callbackOnce(){ + //another event callback +}); + +emitter.removeListener('event', callback); +emitter.removeListener('event', callbackOnce); +emitter.removeAllListeners('event'); + +emitter.emit('event', 'arg0', 'arg1'); +//it varies in master and worker runtime, in master it's the same as saying +emitter.emitTo(['self'].concat(_.map(cluster.workers, function(w){return w.process.pid;})), ['event', 'arg0', 'arg1']); +//as this indicates, the master's emit target by default is everybody, master itself and all active workers +//and in worker runtime, it's intepreted as worker itself and master +emitter.emitTo(['self', 'master'], ['event', 'arg0', 'arg1']); +//you don't have to use the different `emitTo` method unless you have a different targets set from the default explained above. +//but in cause you need, it's also simplified as: +emitter.to(['master']).emit('event', 'arg0', 'arg1'); +//use to method to scope the target differently, the value should be an array of pids, or 'master', or 'self' + +``` + +## ecv + +ECV is a preserved feature, but we've simplified that too. Most of the use cases we've seen doesn't really need an ECV for each worker process, in fact +that could be very confusing. To let tools view the cluster as an entirety, ECV is to run only in master runtime, it still supports the 'monitor' vs. 'control' mode. + +```javascript + +//ecv control could be used as such +var enable = require('cluster2/ecv').enable; + +enable(app); + +//more use cases just let cluster2 enables it by passing configurations to the #listen +var listen = require('cluster2').listen; + +listen({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'monPort': 9091, + 'debug': { //node-inspector integration + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'control',//could be 'monitor' or 'control' + 'root': '/ecv', + 'markUp': '/ecv/markUp', + 'markDown': '/ecv/markDown' + }, + 'heartbeatInterval': 5000 //heartbeat rate +}); + +//alternatively + +listen({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'monPort': 9091, + 'debug': { //node-inspector integration + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'monitor',//could be 'monitor' or 'control' + 'root': '/ecv', + 'monitor': '/myapplication/route1', + 'validator': function(err, response, body){ + //to validate what we got from the monitor url + return true;//or false + } + }, + 'heartbeatInterval': 5000 //heartbeat rate +}); +``` + +## debug + +Ever imagined debugging to be simpler? Here's the good news, we've carefully designed the debugging process from the ground up of the new cluster. +With integration with ECV, worker lifecycle management, node-inspector, and bootstrap + websocket debug app (middleware to be exact). You're now +able to debug any running worker a few clicks away, same applies for a newly forked one. + +`http://localhost:9091/debug` (change host, port to your configured values) `debug` route is what we added as a middleware to the monitor app given. It presents an insight of the running workers, their health; in addition, the cluster cache status. You could hover on a worker pid to request a node-inspector based debug, the control flow is described at `__dirname/lib/public/images/live-debugging.png`. + +The experience is designed to be the same across different environments, whether dev, qa, or even production, the same debugging flow and mechanism would make diagnostics much more effective. + +## deps + +This is a preserved feature of cluster2, it simply list the npm ls result and give it under `http://localhost:9091/deps` route, which looks like the following. + +```javascript +{ + "name": "cluster2", + "version": "0.5.0", + "dependencies": { + "underscore": { + "version": "1.4.4", + "from": "underscore@~1.4.4" + }, + "usage": { + "version": "0.3.8", + "from": "usage@~0.3.8", + "dependencies": { + "bindings": { + "version": "1.1.1", + "from": "bindings@1.x.x" + } + } + }, + "when": { + "version": "2.3.0", + "from": "when@~2.3.0" + }, + "graceful-fs": { + "version": "2.0.1", + "from": "graceful-fs@~2.0.0" + }, + "gc-stats": { + "version": "0.0.1", + "from": "gc-stats@~0.0.1", + "resolved": "https://registry.npmjs.org/gc-stats/-/gc-stats-0.0.1.tgz" + }, + "bignumber.js": { + "version": "1.1.1", + "from": "bignumber.js@~1.1.1" + } + //... more dependencies not shown + } +} +``` + +## robustness + +This is sth we learned given the real experience of a node.js application, workers do get slower, whether that's memory leak, or GC becomes worse, it's easier to prepare +than to avoid. So as a step forward from the previous 'death watch', we're now proactively collecting performance statistics and to decide it a worker could be ended +before it gets slow. You could see the simple heurstic we put at `__dirname/lib/utils.js` # `assertOld` function. You can always overwrite this based on your application's characteristics, but this gives a good starting point based on heartbeat collected stats. + +```javascript + +exports.assertOld = function assertOld(maxAge){ + + maxAge = maxAge || 3600 * 24 * 3;//3 days + + return function(heartbeat){ + + return heartbeat.uptime >= maxAge; + }; +}; + +exports.assertBadGC = function assertBadGC(){ + + var peaks = {}; + + return function(heartbeat){ + + var pid = heartbeat.pid, + uptime = heartbeat.uptime, + currTPS = heartbeat.tps || (heartbeat.transactions * 1000 / heartbeat.cycle); + + if(currTPS <= 2){//intelligent heuristic, TPS too low, no good for sampling as the 1st phase. + return false; + } + + var peak = peaks[pid] = peaks[pid] || { + 'tps': currTPS, + 'cpu': heartbeat.cpu, + 'memory': heartbeat.memory, + 'gc': { + 'incremental': heartbeat.gc.incremental, + 'full': heartbeat.gc.full + } + };//remember the peak of each puppet + + if(currTPS >= peak.tps){ + peak.tps = Math.max(heartbeat.tps, peak.tps); + peak.cpu = Math.max(heartbeat.cpu, peak.cpu); + peak.memory = Math.max(heartbeat.memory, peak.memory); + peak.gc.incremental = Math.max(heartbeat.gc.incremental, peak.gc.incremental); + peak.gc.full = Math.max(heartbeat.gc.full, peak.gc.full); + } + else if(currTPS < peak.tps * 0.9 //10% tps drop + && heartbeat.cpu > peak.cpu + && heartbeat.memory > peak.memory + && heartbeat.gc.incremental > peak.gc.incremental + && heartbeat.gc.full >= peak.gc.full){//sorry, current gc.full is usually zero + + return true; + } + + return false; + } +}; + +{ + 'shouldKill': options.shouldKill || (function(){ //default assertions for killing a worker + + var assertions = [assertOld(_this.maxAge), assertBadGC()]; + + return function(heartbeat){ + + return _.some(assertions, function(a){ + + return a(heartbeat); + }); + }; + + })() +} + +``` + +Apart from the above mentioned proactive collection, we noticed another subtle issue in practice. When a worker is dead, its load will be distributed to the rest of alives certainly, that adds some stress to the alives, but when more than one worker died at the same time, the stress could become problem. +Therefore, to prevent such from happening when worker is marked to be replaced, we made it a FIFO, further explained in `__dirname/lib/utils` # `deathQueue` function. Its purpose is to guarantee that no more than one worker could commit suicide and be replaced at the same time. + +```javascript + +exports.deathQueue = (function(){ + + var tillPrevDeath = null, + queued = []; + + return function deathQueue(pid, emitter, success, options){ + + options = options || {}; + + assert.ok(pid); + assert.ok(emitter); + assert.ok(success); + + var wait = options.timeout || 60000, + death = util.format('worker-%d-died', pid), + logger = options.logger || { + 'debug' : function(){ + console.log.apply(console, arguments); + } + }; + + if(!_.contains(queued, pid)){ + + queued.push(pid); + + var tillDeath = when.defer(), + afterDeath = null, + die = function(){ + + var successor = success(); + + //when successor is in place, the old worker could be discontinued finally + emitter.once(util.format('worker-%d-warmup', successor.process.pid), function(){ + + logger.debug('[deathQueue] successor:%d of %d warmup', successor.process.pid, pid); + + emitter.to(['master', pid]).emit('disconnect', pid); + + emitter.once(death, function(){ + + logger.debug('[deathQueue] %d died', pid); + + tillDeath.resolve(pid); + + if(tillPrevDeath === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue + + logger.debug('[deathQueue] death queue cleaned up'); + + tillPrevDeath = null; + } + }); + + setTimeout(function(){ + + if(!exports.safeKill(pid, 'SIGTERM', logger)){//worker still there, should emit 'exit' eventually + + logger.debug('[deathQueue] worker:%d did not report death by:%d, kill by SIGTERM', pid, wait); + } + else{//suicide or accident already happended, process has run away + //we emit this from master on behalf of the run away process. + + logger.debug('[deathQueue] worker:%d probably ran away, emit:%s on behalf', death); + + emitter.to(['master']).emit(death); + } + + }, wait); + }); + }; + + if(!tillPrevDeath){//1st in the dying queue, + afterDeath = tillPrevDeath = tillDeath.promise;//1 min + die(); + } + else{ + afterDeath = tillPrevDeath = tillPrevDeath.ensure(die); + } + } + }; + +})(); + +``` + +Oh, one more thing, much as we hope that all workers will behave well, let us know when it's going to give up, in reality, they might not. +For an additional level of protection, we added a simple `nanny` monitor to our master, which simply collects each workers' last `heartbeat` event and check if any possible **runaway** happened. +Once detected, it will be treated the same as a suicide event, using the above `deathQueue`. This will ensure you won't have a cluster running fewer and fewer workers. + +```javascript + +exports.nanny = function nanny(puppets, emitter, success, options){ + + assert.ok(puppets); + assert.ok(emitter); + assert.ok(success); + + options = options || {}; + + var tolerance = options.tolerance, + now = Date.now(); + + _.each(puppets, function(p){ + + if(now - p.lastHeartbeat > tolerance){ + + exports.deathQueue(p.pid, emitter, success, options); + + } + }); +}; +``` + +## caching + +This is as exciting as debugging, it allows workers to share computation results, watch over changes, in a fast and reliable manner. +We tried work delegation to master once, and found it error-prone and difficult to code against, caching makes things so much simpler, using domain socket, so much faster. +The atomic getOrLoad syntax makes sharing efficient, running cache manager as another worker and persistence support make it disaster recoverable. +It's like having a memcached process, only this is node, and you can debug it too. + +* **`cache`** + +```javascript +var cache = require('cluster2/cache').use('cache-name', { + 'persist': true,//default false + 'expire': 60000 //in ms, default 0, meaning no expiration +}); + +``` +* **`keys`** + +```javascript +var cache;//assume the cache is in use as above + +cache.keys({ + 'wait': 100//this is a timeout option +}) +.then(function(keys){ +//the keys resolved is an array of all cached keys:string[] from the cache-manager's view +}); + +//to use the cache, we assume u've started the cluster2 with caching enabled, and you can select how cache manager should be run +listen({ + + 'noWorkers': 1, //default number of cpu cores + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'monPort': 9091, + 'debug': { //node-inspector integration + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'ecv': { + 'mode': 'control', + 'root': '/ecv' + }, + 'cache': { + 'enable': true,//true by default + 'mode': 'standalone'//as a standalone worker process by default, otherwise will crush with the master process + }, + 'heartbeatInterval': 5000 //heartbeat rate +}) +``` + +Note that, we allow you to use caching w/o cluster2, if you want to enable caching from none cluster2 runtime, the feature could be enabled via: + +```javascript + +//you can use this in unit test too as we did +require('cluster2/cache').enable({ + 'enable': true +}); + +``` + +* **`get`** +* with the loader, if concurrent `get` happens across the workers in a cluster, only one will be allowed to **load** while the rest will be in fact `watch` till that one finishes loading. +* this will reduce the stress upon the backend services which loads exact same data nicely + +```javascript +var cache; + +cache.get('cache-key-1', //key must be string + function(){ + return 'cache-value-loaded-1'; //value could be value or promise + }, + { + 'wait': 100//this is a timeout option + }) + .then(function(value){ + //the value resolved is anything already cached or the value newly loaded + //note, the loader will be called once and once only, if it failed, the promise of get will be rejected. + }) + .otherwise(function(error){ + + }); +``` +* **`set`** + +```javascript +var cache; + +cache.set('cache-key-1', //key must be string + 'cache-value-loaded-1', //value could be any json object + { + 'leaveIfNotNull': false,//default false, which allows set to overwrite existing values + 'wait': 100 + }) + .then(function(happens){ + //the happens resolved is a true/false value indicating if the value has been accepted by the cache manager + }) + .otherwise(function(error){ + + }); +``` +* **`del`** + +```javascript +var cache; + +cache.del('cache-key-1', //key must be string + { + 'wait': 100//this is a timeout option + }) + .then(function(value){ + //the old value deleted + }); +``` +* **`watch`** + +```javascript +var cache; + +cache.watch('cache-key-1', //key must be string or null (indicating watch everything) + function watching(value, key){ + //this is a callback which will be called anytime the associatd key has an updated value + }); +``` +* **`unwatch`** + +```javascript +var cache; + +cache.unwatch('cache-key-1', watching);//stop watching +``` + +## status + +This is a helpful piece evolved from the current cluster2, which is to allow applications to easily register status of any interest. +It allows each worker to register its own state, master would automatically aggregate all states from active workers. +It works nicely with our monitor capability (via debug middleware) + +* **`register`** + +```javascript +require('cluster2/status') + .register('status-name', + function(){ + return 'view';//view function + }, + function(value){ + //update function + }); +``` + +* **`statuses`** + +```javascript +require('cluster2/status') + .statuses(); //return names of registered statuses +``` + +* **`getStatus`** + +```javascript +require('cluster2/status') + .getStatus('status-name') + .then(function(status){ + //got status + }) + .otherwise(function(error){ + //err + }); +``` + +* **`setStatus`** + +```javascript +require('cluster2/status') + .setStatus('status-name', + 'value') + .then(function(set){ + //set or not + }) + .otherwise(function(error){ + //err + }); +``` diff --git a/cache.js b/cache.js new file mode 100644 index 0000000..64578b6 --- /dev/null +++ b/cache.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/cache'); \ No newline at end of file diff --git a/emitter.js b/emitter.js new file mode 100644 index 0000000..0595c6e --- /dev/null +++ b/emitter.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/emitter'); \ No newline at end of file diff --git a/examples/cluster-demo.js b/examples/cluster-demo.js new file mode 100644 index 0000000..95d78bf --- /dev/null +++ b/examples/cluster-demo.js @@ -0,0 +1,60 @@ +'use strict'; + +var listen = require('../lib/index').listen, + util = require('util'), + express = require('express'), + app = express(); + +listen({ + 'createServer': require('http').createServer, + 'app': app, + 'configureApp': function(){ + + //by the time, user application gets here, master already started, cache service started, caching is ready to be used. + + app.get('/', function(req, res){ + + var cache = require('../lib/cache').use('demo-cache'); + + var key = req.query.key, + val = req.query.value; + + if(!key){ + cache.get('key', function(){ + return 'value'; + }) + .then(function(value){ + res.send(util.format('hello from:%d whose cached value is:%j', process.pid, value), 200); + }); + } + else{ + console.log('[cache] set:%s=%j', key, val); + cache.set(key, val) + .then(function(set){ + res.send(util.format('[cache] set:%s to value:%j result:%s', key, val, set), 200); + }); + } + + }); + + return app;//in the end, the configured application (with middlewares, routes registered) should be returned + }, + 'debug': { + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'gc': { + 'monitor': true + } +}) +.then(function(resolve){ + + require('../lib/status').register('worker', function(){ + + return process.pid; + }); +}) +.otherwise(function(error){ + + console.trace(error); +}); diff --git a/examples/cluster-longrun.js b/examples/cluster-longrun.js new file mode 100644 index 0000000..3d54247 --- /dev/null +++ b/examples/cluster-longrun.js @@ -0,0 +1,112 @@ +'use strict'; + +var listen = require('../lib/index').listen, + util = require('util'), + path = require('path'), + express = require('express'), + store = new express.session.MemoryStore, + app = express(), + dust = require('dustjs-linkedin'), + cons = require('consolidate'), + routes = require('./routes'); + +listen({ + 'noWorkers': 3, + 'createServer': require('http').createServer, + 'app': app, + 'port': 8080, + 'monPort': 8081, + 'configureApp': function(app){ + + app.engine('dust', cons.dust); + + app.configure(function(){ + + app.set('template_engine', 'dust'); + app.set('domain', 'localhost'); + app.set('views', __dirname + '/views'); + app.set('view engine', 'dust'); + app.use(express.favicon()); + app.use(express.logger('dev')); + app.use(express.bodyParser()); + app.use(express.methodOverride()); + app.use(express.cookieParser('wigglybits')); + app.use(express.session({ + 'secret': 'whatever', + 'store': store + })); + app.use(express.session()); + app.use(app.router); + app.use(express.static(path.join(__dirname, 'public'))); + + //middleware + app.use(function(req, res, next){ + + if(req.session.user){ + req.session.logged_in = true; + } + + res.locals.message = req.flash(); + res.locals.session = req.session; + res.locals.q = req.body; + res.locals.err = false; + + next(); + }); + }); + + app.configure('development', function(){ + app.use(express.errorHandler()); + }); + + app.locals.inspect = util.inspect; + app.get('/', routes.index); + + return app; + }, + 'debug': { + 'webPort': 8082, + 'saveLiveEdit': true + }, + 'cache': { + 'enable': true, + 'mode': 'master' + }, + 'gc': { + 'monitor': true + }, + 'maxAge': 30,//1 minute, just to see how the workers get killed! + 'heartbeatInterval': 5000 +}) +.then(function(resolve){ + + require('../lib/status').register('worker', function(){ + return process.pid; + }); + + if(resolve.master){ //this means all workers have been warmed up! + + var request = require('request'), + _ = require('underscore'); + + (function round(){ + + _.each(_.range(0, 20), function(ith){ + + request.get('http://localhost:8080', function(err, response, body){ + + if(err || response.statusCode !== 200){ + console.log('[err:%j] response:%j and body:%s', err, response, body); + } + }); + }); + + setTimeout(round, 1000); + + })(); + } +}) +.otherwise(function(error){ + + console.trace(error); +}); diff --git a/examples/cluster-run.js b/examples/cluster-run.js new file mode 100644 index 0000000..b9a673c --- /dev/null +++ b/examples/cluster-run.js @@ -0,0 +1,40 @@ +'use strict'; + +var should = require('should'), + run = require('../lib/index').run; + +run({ + 'runnable': function(){ + + console.log('process:%d alive and runnable executed', process.pid); + //for user to put logic for testings here. + }, + 'noWorkers': 2, + 'debug': { + 'webPort': 9092, + 'saveLiveEdit': true + }, + 'cache': { + 'enable': true + }, + 'gc': { + 'monitor': true + } +}) +.then(function(resolve){ + + require('../lib/status').register('worker', function(){ + + return process.pid; + }); + + setTimeout(function(){ + //worker die in 1s, master die in 1s after promise resolved. + process.exit(0); + + }, 1000); +}) +.otherwise(function(error){ + + console.trace(error); +}); \ No newline at end of file diff --git a/examples/public/stylesheets/style.css b/examples/public/stylesheets/style.css new file mode 100644 index 0000000..f611ef8 --- /dev/null +++ b/examples/public/stylesheets/style.css @@ -0,0 +1,7 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} +a { + color: #00B7FF; +} \ No newline at end of file diff --git a/examples/routes/index.js b/examples/routes/index.js new file mode 100644 index 0000000..5560be8 --- /dev/null +++ b/examples/routes/index.js @@ -0,0 +1,20 @@ +/* + * GET home page. + */ + +exports.index = function(req, res){ + + var cache = require('../../lib/cache').use('template_engine'); + + res.locals.session = req.session; + + cache.get('engine', function(){ + return req.app.settings.template_engine; + }) + .then(function(engine){ + + res.render('index', { + 'title': 'Express with ' + engine + }); + }); +}; \ No newline at end of file diff --git a/examples/views/index.dust b/examples/views/index.dust new file mode 100644 index 0000000..a258ac3 --- /dev/null +++ b/examples/views/index.dust @@ -0,0 +1,4 @@ +{>layout/} +{ + + + {title} + + + +

    {title}

    + {+content} + This is the base content. + {/content} + + + \ No newline at end of file diff --git a/lib/cache-common.js b/lib/cache-common.js new file mode 100644 index 0000000..9b543e9 --- /dev/null +++ b/lib/cache-common.js @@ -0,0 +1,92 @@ +'use strict'; + +var util = require('util'); + +var increment = 0, + writer = function writer(conn){ + + var writerOfConn = conn.writerOfConn || (function createWriter(){ + + var buffer = [], + directWriter = { + + 'write': function write(message){ + + if(!conn.write(message + '\r\n')){//kernel buffer cannot hold further + + conn.writerOfConn = bufferWriter; + + conn.once('drain', function(){//wait till 'drain' event and write access open + + conn.writerOfConn = directWriter; + + while(buffer.length){ + + directWriter.write(buffer.shift()); + } + }); + } + } + }, + + bufferWriter = { + + 'write': function write(message){ + + buffer.push(message); + } + }; + + return directWriter; + })(); + + return writerOfConn; + }; + +module.exports = { + + 'domainPath': './cluster-cache-domain', + + 'persistPath': './cluster-cache-persist', + + 'status': { + 'success' : '1', + 'failure' : '-1' + }, + + 'types': { + 'NS' : 'ns', + 'GET' : 'get', + 'SET' : 'set', + 'LOCK' : 'lock', + 'DEL' : 'del', + 'ALL' : 'all', + 'INSPECT' : 'ins', + 'PING' : 'ping', + 'PONG' : 'pong' + }, + + 'serialize': function serialize(object){ + + return encodeURIComponent(JSON.stringify(object)); + }, + + 'deserialize': function deserialize(string){ + + return JSON.parse(decodeURIComponent(string)); + }, + + 'write': function(conn, message){ + + return writer(conn).write(message); + }, + + 'nextToken': function(){ + + return [process.pid, increment += 1].join('-'); + }, + + 'changeToken': 'chn' +}; + + diff --git a/lib/cache-mgr.js b/lib/cache-mgr.js new file mode 100644 index 0000000..cb5e413 --- /dev/null +++ b/lib/cache-mgr.js @@ -0,0 +1,384 @@ +'use strict'; + +var common = require('./cache-common'), + _ = require('underscore'), + fs = require('graceful-fs'), + os = require('os'), + net = require('net'), + util = require('util'), + path = require('path'), + when = require('when'), + timeout = require('when/timeout'), + ensureDir = require('./utils').ensureDir; + +var success = common.status.success, + failure = common.status.failure, + NS = common.types.NS, + GET = common.types.GET, + SET = common.types.SET, + DEL = common.types.DEL, + ALL = common.types.ALL, + LOCK = common.types.LOCK, + INSPECT = common.types.INSPECT, + PING = common.types.PING, + PONG = common.types.PONG, + CHN = common.changeToken, + domain = '/tmp/cache.socket.' + process.pid, + domainPath = common.domainPath, + persistPath = common.persistPath, + namespaces = { + '': { //meta namespace + '': { //meta of meta namespace itself + 'value': { //meta value + 'persist': true, //persist true + 'expire': 0, //never expire + 'lastModified': 0, + 'lastPersisted': -1 + } + } + } + }, + metaOfNs = function metaOfNs(namespace){ + + var entry = namespaces[''][namespace]; + + return entry ? entry.value : { + 'persist': false, + 'expire': 0 + };//default meta + }, + conns = [], + logger = process.getLogger(__filename); + +var manager = { + + 'domain': domain, + + 'ns': function(conn, token){ + + common.write(conn, common.serialize({ + 'type': NS, + 'token': token, + 'namespaces': _.keys(namespaces), + 'status': success + })); + }, + + 'all': function(conn, token, namespace){ + + var cache = namespaces[namespace] || {}; + + common.write(conn, common.serialize({ + 'type': ALL, + 'token': token, + 'keys': _.keys(cache), + 'status': success + })); + }, + + 'lock': function(conn, token, namespace, key, value){ + + var cache = namespaces[namespace] = namespaces[namespace] || {}, + write = cache[key] === undefined; + + if(write){ + cache[key] = { + 'lock': value + }; + } + + common.write(conn, common.serialize({ + 'type': LOCK, + 'token': token, + 'key': key, + 'status': write ? success: failure + })); + }, + + 'set': function(conn, token, namespace, key, value, overwrite){ + + var cache = namespaces[namespace] = namespaces[namespace] || {}, + meta = metaOfNs(namespace), + expire = meta.expire, + old = cache[key], + write = (old === undefined || overwrite); + + cache[key] = write ? { + 'lock': old ? old.lock : null, + 'value': value, + 'expire': expire > 0 ? Date.now + expire : 0 //expire at + } + : cache[key]; + + common.write(conn, common.serialize({ + 'type': SET, + 'token': token, + 'key': key, + 'status': write ? success: failure + })); + + if(write){ + + meta.lastModified = Date.now(); + + manager.notify(namespace, key, cache[key]['value']); + } + }, + + 'notify': function(namespace, key, value){ + + var notify = common.serialize({ + 'token': CHN, + 'ns': namespace, + 'key': key, + 'value': value + }); + + _.each(conns, function(c){ + common.write(c, notify); + }); + + if(namespace === '' + && value === undefined + && key !== ''){ + //dump the cache + delete namespaces[key]; + } + }, + + 'get': function(conn, token, namespace, key, value){ + + var cache = namespaces[namespace] || {}, + entry = cache[key] || {}, + result = { + 'type': GET, + 'token': token, + 'key': key, + 'value': entry.value || value,//default + 'status': success + }; + + common.write(conn, common.serialize(result)); + }, + + 'ins': function(conn, token, namespace, key){ + + var cache = namespaces[namespace] || {}, + meta = metaOfNs(namespace), + entry = cache[key], + result = { + 'type': INSPECT, + 'token': token, + 'key': key, + 'value': entry.value, + 'persist': meta.persist, + 'expire': meta.expire ? Date.now() - entry.expire : meta.expire, + 'status': success + }; + + common.write(conn, common.serialize(result)); + }, + + 'del': function(conn, token, namespace, key){ + + var cache = namespaces[namespace] || {}, + entry = cache[key] || {}, + value = entry.value; + + delete cache[key];//locker released too + + metaOfNs(namespace).lastModified = Date.now(); + + common.write(conn, common.serialize({ + 'type': DEL, + 'token': token, + 'key': key, + 'value': value, + 'status': success + })); + + manager.notify(namespace, key, undefined); + }, + + 'ping': function(conn, token){ + + common.write(conn, common.serialize({ + 'type': PING, + 'token': PONG + })); + }, + + 'pong': function(conn, token){ + //nothing + } +}; + +module.exports = { + + 'createServer': net.createServer, + + 'app': function(conn) { //'connection' listener + + conns.push(conn); + + var buff = ''; + + conn.setEncoding('utf-8'); + conn.counter = 0; + + conn.on('data', function(data){ + + buff += data; + + var packs = buff.split('\r\n'); + + if(packs.length > 1){ + buff = packs.pop();//whatever the last element is, could be empty string, or partial data, wait till next data arrives. + + _.each(packs, function(pack){ + + conn.counter += 1; + + var command = common.deserialize(pack); + + manager[command.type].apply(manager, [ + conn, command.token, command.ns, command.key, command.value, !command.leaveIfNonNull + ]); + }); + }//otherwise keep buffering... + }); + + var keepAlive = setInterval(function(){ + //this is to keep the connection open, just to send PING, and receive PONG, and will be extended to validate the health of the connection later + manager.ping(conn, PONG); + + }, 3000);//ping/pong every 3secs + + conn.once('close', function(){ + + logger.info('connection closed who has received:%d', conn.counter); + + conns = _.without(conns, conn); + conn.destroy(); + + clearInterval(keepAlive); + }); + }, + + 'port': domain, + + 'afterServerStarted': function() { //'listening' listener + + logger.info('[cache] manager started'); + + ensureDir(persistPath); + + var persistMeta = path.join(persistPath, '.cache'); + + if(fs.existsSync(persistMeta)){ + + namespaces[''] = common.deserialize(fs.readFileSync(persistMeta, {'encoding': 'utf-8'})); + } + + logger.info('[cache] manager loading from persistences: %j', namespaces['']); + + _.each(namespaces, function(cache, namespace){ + + var pathOfNs = path.join(persistPath, namespace + '.cache'); + + if(!metaOfNs(namespace).persist){ + + if(fs.existsSync(pathOfNs)){//dump the persisted cache + fs.unlinkSync(pathOfNs); + } + + delete namespaces[''][namespace];//dump from meta + } + else{ + + if(fs.existsSync(pathOfNs)){ + //load from persisted cache + namespaces[namespace] = common.deserialize(fs.readFileSync(pathOfNs, {'encoding': 'utf-8'})); + } + else{ + namespaces[namespace] = {};//empty cache + } + } + }); + + logger.info('[cache] manager loaded from all persistences'); + + //register domain to where all other users and the master process could watch + fs.writeFileSync(domainPath, domain); + + var nextUpdate = null, + updateTask = function updateTask(){ + + //expiration monitoring every 10 seconds + var now = Date.now(), + cachesToPersist = {}; + + _.each(namespaces, function(cache, namespace){ + + var meta = metaOfNs(namespace), + persist = meta.persist, + expire = meta.expire; + + logger.debug('[cache][maintain] at:%d upon namespace:%s meta:%j', now, namespace, meta); + + if(expire > 0){ + _.each(cache, function(entry, key){ + + if(entry.expire <= now){ + + var old = cache[key]; + + delete cache[key]; + + manager.notify(namespace, key, old); + } + }); + } + + if(persist && (meta.lastPersisted < meta.lastModified)){ + cachesToPersist[namespace] = cache; + } + }); + + logger.debug('[cache][maintain] expiration finished, and persist the following:%j', _.keys(cachesToPersist)); + + when.all(_.map(cachesToPersist, function(cache, namespace){ + + var tillPersist = when.defer(), + persistence = path.join(persistPath, namespace + '.cache'); + + logger.debug('[cache][maintain] to persist namespace:%s to:%s', namespace, persistence); + + fs.writeFile(persistence, common.serialize(cache), function(err){ + + logger.debug('[cache][maintain] persisted:%s %s', persistence, err ? 'with error' : 'successfully'); + + metaOfNs(namespace).lastPersisted = Date.now(); + + tillPersist.resolve(!err); + }); + + return timeout(tillPersist, 10000);//too big? + })) + .ensure(function(){ + + nextUpdate = setTimeout(updateTask, 10000); + }) + }; + + updateTask(); + + process.once('SIGINT', function(){ + + clearTimeout(nextUpdate); + + }); + + return manager; + } +}; diff --git a/lib/cache-usr.js b/lib/cache-usr.js new file mode 100644 index 0000000..9191180 --- /dev/null +++ b/lib/cache-usr.js @@ -0,0 +1,495 @@ +'use strict'; + +var _ = require('underscore'), + net = require('net'), + util = require('util'), + when = require('when'), + timeout = require('when/timeout'), + fs = require('graceful-fs'), + common = require('./cache-common'); + +var success = common.status.success, + NS = common.types.NS, + ALL = common.types.ALL, + GET = common.types.GET, + SET = common.types.SET, + DEL = common.types.DEL, + LOCK = common.types.LOCK, + INSPECT = common.types.INSPECT, + PONG = common.types.PONG, + CHN = common.changeToken, + nextToken = common.nextToken, + logger = process.getLogger(__filename), + domain = null, + userDeferred = when.defer(), + handlers = { + + }, + changes = { + + }, + anyChanges = { + + }, + stats = { + + }, + conn = null, + //TODO, support connection pooling to speed up the cache operations if needed. + reconnect = function reconnect(error){ + + var options = _.isString(domain) ? {'path': domain} : domain, + connecting = net.connect(options, + function(){ + connecting.writable = true; + conn = connecting; + if(!userDeferred.hasBeenResolved){ + userDeferred.resolve(process.user = user); + userDeferred.hasBeenResolved = true; + } + }), + buff = ''; + + connecting.setEncoding('utf-8'); + connecting.on('data', function(data){ + + buff += data; + + var packs = buff.split('\r\n'); + + if(packs.length > 1){ + + buff = packs.pop(); + + _.each(packs, function(pack){ + + var response = common.deserialize(pack), + token = response.token, + namespace = response.ns, + key = response.key, + value = response.value; + + if(token === CHN){ + + changes[namespace] = changes[namespace] || {}; + _.each(changes[namespace][key] || [], function(whenChange){ + whenChange(value, key); + }); + + _.invoke(anyChanges[namespace] || [], 'call', null, value, key); + } + else if(token === PONG){//just to keep the connection open + + common.write(connecting, common.serialize({ + 'type': PONG, + 'token': PONG + })); + } + else{ + + handlers[token].apply(user, [ + response.status, + key || response.keys || response.namespaces, + value, + response.persist, + response.expire + ]); + } + }); + } + }); + + connecting.once('close', function(error){ + + connecting.writable = false; + connecting.destroy(); + + reconnect(error); + }); + }; + +var user = process.user || { + + 'ns': function(options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillNs = when.defer(), + handler = function(status, namespaces){ + + if(success === status){ + + tillNs.resolve(namespaces || []); + } + else{ + + tillNs.reject(new Error('failed to get namespaces')); + } + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': NS, + 'token': token + })); + + return (wait > 0 ? timeout(wait, tillNs.promise) : tillNs.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + 'keys': function(namespace, options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillKeys = when.defer(), + handler = function(status, keys){ + + if(success === status){ + + tillKeys.resolve(keys || []); + } + else{ + + tillKeys.reject(new Error('failed to get keys')); + } + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': ALL, + 'token': token, + 'ns': namespace + })); + + return (wait > 0 ? timeout(wait, tillKeys.promise) : tillKeys.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + 'get': function(namespace, key, loader, options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillGet = when.defer(), + handler = function handler(status, key, value){ + + if(success === status && value !== undefined){//got the value + + user.stat(namespace, 'hit'); + tillGet.resolve(value); + } + else if(loader){//must atomically load the value + + var watchOthers = function watchOthers(changed){ + //unregister itself immediately + user.unwatch(namespace, key, watchOthers); + + if(changed !== undefined){ + user.stat(namespace, 'hit'); + tillGet.resolve(changed); + } + else{ + user.stat(namespace, 'error'); + tillGet.reject(new Error('loader failed')); + } + }; + + user.watch(namespace, key, watchOthers); + user.lock(namespace, key, { + 'wait': wait + }) + .then(function(locked){ + //only one of the concurrent writers will be given the set===true + if(locked){ + + var handleError = function handleError(error){ + throw error; + }; + + user.stat(namespace, 'miss'); + user.unwatch(namespace, key, watchOthers);//unregister immediately as i'm about to write the value + try{ + //promise or value + when(loader(), function(value){ + + user.stat(namespace, 'load'); + //success value loaded + user.set(namespace, key, value, { + 'wait': wait + }) + .then( + _.bind(tillGet.resolve, tillGet, value), + handleError + ); + + }, + handleError); + } + catch(e){ + //in case loaded fail + user.stat(namespace, 'error'); + user.del(namespace, key).ensure(function(){ + tillGet.reject(e); + }); + } + } + }); + } + else{ + //got nothing + user.stat(namespace, 'miss'); + tillGet.resolve(null);//no value, but resolved + } + }; + + + //local copy miss, fetch from master cache + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': GET, + 'token': token, + 'ns': namespace, + 'key': key + })); + + return (wait > 0 ? timeout(wait, tillGet.promise) : tillGet.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + 'inspect': function(namespace, key, options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillInspect = when.defer(), + handler = function(status, key, value, persist, expire){ + + if(success === status && value !== undefined){ + + tillInspect.resolve([value, persist, expire]); + } + else{ + tillInspect.reject(new Error('no value found for key')); + } + }; + + //local copy miss, fetch from master cache + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': INSPECT, + 'token': token, + 'ns': namespace, + 'key': key + })); + + return (wait > 0 ? timeout(wait, tillInspect.promise) : tillInspect.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + /** + * @param key string + * @param value Object + * @param options { + persist boolean (whether should survice cache-mgr failure) + expire number (time to live, default null, won't expire) + wait number (timeout after wait expired) + leaveIfNonNull boolean (true means the set will backout if the value exists, default as false, which will overwrite the value) + * } + */ + 'set': function(namespace, key, value, options){//must guarantee that value has no '\r\n' in it (if it's a string or any complex type) + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillSet = when.defer(), + handler = function(status, key){ + + tillSet.resolve(success === status); + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': SET, + 'token': token, + 'ns': namespace, + 'key': key, + 'value': value, + 'leaveIfNonNull': options.leaveIfNonNull + })); + + return (wait > 0 ? timeout(wait, tillSet.promise) : tillSet.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + 'lock': function(namespace, key, options){//must guarantee that value has no '\r\n' in it (if it's a string or any complex type) + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillLock = when.defer(), + handler = function(status, key){ + + tillLock.resolve(success === status); + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': LOCK, + 'token': token, + 'ns': namespace, + 'key': key, + 'value': process.pid + })); + + return (wait > 0 ? timeout(wait, tillLock.promise) : tillLock.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + /** + * @param key string + * @param wait number (timeout after wait expired) + */ + 'del': function(namespace, key, options){ + + options = options || {}; + + var token = nextToken(), + wait = options.wait, + tillDel = when.defer(), + handler = function(status, key, value){ + + tillDel.resolve(success === status ? value : null); + }; + + handlers[token] = handler; + + common.write(conn, common.serialize({ + 'type': DEL, + 'token': token, + 'ns': namespace, + 'key': key + })); + + return (wait > 0 ? timeout(wait, tillDel.promise) : tillDel.promise).ensure(function(){ + delete handlers[token]; + }); + }, + + 'watch': function(namespace, key, callback){ + + if(!key){ + anyChanges[namespace] = anyChanges[namespace] || []; + anyChanges[namespace].push(callback); + } + else{ + changes[namespace] = changes[namespace] || {}; + changes[namespace][key] = changes[namespace][key] || []; + changes[namespace][key].push(callback); + } + }, + + 'unwatch': function(namespace, key, callback){ + + if(!key){ + anyChanges[namespace] = _.without(anyChanges[namespace] || [], callback); + } + else{ + changes[namespace] = changes[namespace] || {}; + changes[namespace][key] = _.without(changes[namespace][key] || [], callback); + } + }, + + 'stat': function(namespace, action){ + + var stat = stats[namespace] = stats[namespace] || { + + 'hit': 0, + 'miss': 0, + 'load': 0, + 'error': 0 + }; + + if(action){ + stat[action] += 1; + } + + return stat; + }, + + 'switchDomain': function(d){//only in case of cache-mgr down and needs to switch to a new one + + if(d && domain !== d){ + + domain = d; + if(conn){ + conn.writable = false; + conn.end(); + } + reconnect(); + } + }, + + 'pong': function(){ + + } +}; + +//when the cache-mgr is created by a replacement process, the new domain will be written to the same file being watched below +var tillExists = function(path){ + fs.exists(path, function(exists){ + if(exists){ + fs.watchFile(path, + function(){ + fs.readFile(path, { + 'encoding': 'utf-8' + }, + function(err, d){ + logger.info('[cache] switching domain:%s', d); + user.switchDomain(d); + }); + }); + } + else{ + process.nextTick(function(){ + tillExists(path); + }); + } + }); +}; + +exports.user = function(domain){ + + if(!process.userPromise){//each process needs at most one cache user + + logger.info('[cache] user created'); + + tillExists(common.domainPath); + + user.switchDomain(domain || fs.readFileSync(common.domainPath, {'encoding':'utf-8'})); + + process.userPromise = userDeferred.promise; + } + + return process.userPromise; +}; + diff --git a/lib/cache.js b/lib/cache.js new file mode 100644 index 0000000..c31a479 --- /dev/null +++ b/lib/cache.js @@ -0,0 +1,192 @@ +'use strict'; + +var _ = require('underscore'), + when = require('when'), + timeout = require('when/timeout'), + pipeline = require('when/pipeline'), + logger = process.getLogger(__filename); + +var Cache = exports.Cache = function(namespace, usrAndMetaPromise){ + + _.extend(this, { + + 'namespace': namespace, + + 'getUsrAndMeta': function(){ + + return usrAndMetaPromise; + }, + + 'pipeKeys': function(usrAndMeta){ + + return usrAndMeta.usr.keys(namespace); + }, + + 'getPipeGet': function(key, loader, options){ + + return function(usrAndMeta){ + + return usrAndMeta.usr.get(namespace, key, loader, options); + }; + }, + + 'getPipeSet': function(key, value, options){ + + return function(usrAndMeta){ + + return usrAndMeta.usr.set(namespace, key, value, options); + }; + }, + + 'getPipeDel': function(key, options){ + + return function(usrAndMeta){ + + return usrAndMeta.usr.del(namespace, key, value, usrAndMeta.meta); + }; + }, + + 'getPipeWatch': function(key, onChange){ + + return function(usrAndMeta){ + + return usrAndMeta.usr.watch(namespace, key, onChange); + }; + }, + + 'getPipeUnwatch': function(key, onChange){ + + return function(usrAndMeta){ + + return usrAndMeta.usr.unwatch(namespace, key, onChange) + }; + }, + + 'pipeStat': function(usrAndMeta){ + + return usrAndMeta.usr.stat(namespace); + }, + + 'pipeDestroy': function(usrAndMeta){ + + return usrAndMeta.usr.del('', namespace); + } + }); +}; + +Cache.prototype.meta = function(){ + + return this.getUsrAndMeta().then(function(usrAndMeta){ + + return usrAndMeta.meta; + }); +} + +Cache.prototype.keys = function keys(){ + + return pipeline([this.getUsrAndMeta, this.pipeKeys]); +}; + +Cache.prototype.get = function get(key, loader, options){ + + return pipeline([this.getUsrAndMeta, this.getPipeGet(key, loader, options)]); +}; + +Cache.prototype.set = function set(key, value, options){ + + return pipeline([this.getUsrAndMeta, this.getPipeSet(key, value, options)]); +}; + +Cache.prototype.del = function del(key, options){ + + return pipeline([this.getUsrAndMeta, this.getPipeDel(key, options)]); +}; + +Cache.prototype.watch = function watch(key, onChange){ + + return pipeline([this.getUsrAndMeta, this.getPipeWatch(key, onChange)]); +}; + +Cache.prototype.unwatch = function unwatch(key, onChange){ + + return pipeline([this.getUsrAndMeta, this.getPipeUnwatch(key, onChange)]); +}; + +Cache.prototype.stat = function stat(){ + + return pipeline([this.getUsrAndMeta, this.pipeStat]); +}; + +Cache.prototype.destroy = function destroy(){ + + return pipeline([this.getUsrAndMeta, this.pipeDestroy]); +}; + +module.exports = { + + 'enable': _.once(function(options, master){ + + if(!options.enable || !require('cluster').isMaster || (process.cluster2 && process.cluster2.caching)){ + //only master is allowed to enable cache, caching could be enabled only once + return; + } + + process.cluster2 = process.cluster2 || {}; + process.cluster2.caching = options.enable; + + if(options.mode === 'standalone' && master){ + + master.fork(master.options, { + 'CACHE_MANAGER': true + }); + } + else{ + + var mgr = require('./cache-mgr'), + svr = mgr.createServer(mgr.app); + + svr.listen(mgr.port, mgr.afterServerStarted); + } + }), + + 'use': function(namespace, options){ + + var actualOptions = options || {}; + + _.defaults(actualOptions, { + 'persist': false, + 'expire': 0, + 'timeout': 3000 + }); + + return new Cache(namespace, pipeline([ + + function(domain){ + + logger.debug('[cache] using domain:%s', domain); + return require('./cache-usr').user(domain); + }, + + function(usr){ + + logger.debug('[cache] usr ready, and using namespace:%s & options:%j', namespace, actualOptions); + return when.join(usr, usr.get('', namespace, function(){ + + return actualOptions; + })); + }, + + function(resolve){ + + var usr = resolve[0], + meta = resolve[1]; + + logger.debug('[cache] namespace:%s reserved with meta:%j', namespace, meta); + return { + 'usr': usr, + 'meta': meta + }; + } + ], actualOptions.domain));//optional + } +}; diff --git a/lib/ecv.js b/lib/ecv.js new file mode 100644 index 0000000..2d714ca --- /dev/null +++ b/lib/ecv.js @@ -0,0 +1,89 @@ +'use strict'; + +//ecv is redesigned to be a simpler middleware of the monitoring app +//ecv should show a consistent view of the entire cluster +//ecv should have a root path, which is what the ops requests will be +//ecv should have 2 modes, monitor vs. controlled +//monitor mode requires a monitor url, a validator which allows ecv to issue request and let validator checks and decide if the ecv should be positive or negative +//controled mode is simply an on/off switch based on 2 more url routes (enable/disable) +var request = require('request'), + assert = require('assert'); + +var logger = process.getLogger(__filename); + +exports.enable = function enable(app, options){ + + var mode = options.mode || 'control', //default is control + disabled === false, therefore, ecv is mark up + root = options.root, + positive = options.positive || function(req, res){ + res.send(200); + }, + negative = options.negative || function(req, res){ + res.send(500); + }; + + assert.ok(root); + + logger.info('[ecv] enabled in the mode:%s', mode); + + if('monitor' === mode){ + + var monitor = options.monitor, //monitor must be given, and it's expected in full url format + validator = options.validator || function(error, response, body){ + + return !error && response.statusCode < 400; + }; + + assert.ok(monitor); + + app.use(function(req, res, next){ + + if(req.url !== root){ + + next(); + } + else{ + request.get(monitor, function(error, response, body){ + + (validator(error, response, body) ? positive : negative)(req, res); + }); + } + }); + } + else if('control' === mode){ + + var emitter = options.emitter, + markUp = options.markUp, + markDown = options.markDown; + + app.ecv = {'disabled': options.disabled}; + + app.use(function(req, res, next){ + + if(req.url === markDown){ + + app.ecv.disabled = true; + emitter.to(['master']).emit('markDown'); + logger.info('[ecv] traffic disabled'); + + negative(req, res); + } + else if(req.url === markUp){ + + app.ecv.disabled = false; + emitter.to(['master']).emit('markUp'); + logger.info('[ecv] traffic enabled'); + + positive(req, res); + } + else if(req.url !== root){ + + next(); + } + else{ + //just to tell if ecv is on/off + (app.ecv.disabled ? negative : positive)(req, res); + } + }); + } +} diff --git a/lib/emitter.js b/lib/emitter.js new file mode 100644 index 0000000..050bb1e --- /dev/null +++ b/lib/emitter.js @@ -0,0 +1,240 @@ +//cluster-emitter is a different EventEmitter which allows all messages send between master & slaves, with an additional parameters as 'target' +//the rest of the api should be the same as EventEmitter, so 'on', 'once', 'removeListener', 'removeAllListeners', 'emit' +'use strict'; + +var cluster = require('cluster'), + _ = require('underscore'); + +var logger = process.getLogger(__filename), + masterEmitter = { + + /** + * return active workers + */ + get workers(){ + + return cluster.workers; + }, + + 'handlers': { + //a map of event handlers + }, + + 'on': function(event, handler, duplicateAllowed){ + + var _this = this; + _this.handlers[event] = _this.handlers[event] || []; + + if(!_.contains(_this.handlers, handler) || duplicateAllowed){//avoid duplicates + _this.handlers[event].push(handler); + } + + _.each(_this.workers, function(worker){ + + if(!worker.clusterEventHandler){//this is the 1st time a handler is registered, must register it for all workers + worker.clusterEventHandler = function(message){ + _.invoke(_this.handlers[message.type] || [], 'apply', null, message.params); + }; + + worker.on('message', worker.clusterEventHandler); + } + }); + + if(_this.handlers[event].length === 1){//this is the 1st time a handler is registered, must register it for master process + process.on(event, function(){ + _.invoke(_this.handlers[event] || [], 'apply', null, arguments); + }); + } + }, + + 'once': function(event, handler){ + + var _this = this, + handleOnce = function handleOnce(){ + handler.apply(null, arguments); + _this.removeListener(event, handleOnce); + }; + + _this.on(event, handleOnce); + }, + + 'emit': function(){ + + var _this = this; + + return _this.emitTo(_.map(_this.workers, function(worker){ + return worker.process.pid; + }) + .concat(['self']), + arguments); + }, + + 'to': function(targets){ + + var _this = this; + + return { + 'emit': function(){ + + return _this.emitTo(targets, arguments); + } + }; + }, + + 'emitTo': function(targets, args){ + + args = _.toArray(args || []); + + var _this = this, + event = args.shift(); + + _.each(_.filter(_this.workers, function(worker){ + return _.contains(targets, worker.process.pid); + }), + function(worker){ + try{ + worker.send({ + 'type': event, + 'params': args + }); + } + catch(error){ + logger.warn('[cluster2] master sending to worker failed:%j', error); + } + }); + + if(_.contains(targets, 'master') || _.contains(targets, 'self') || _.contains(targets, process.pid)){ + + args.unshift(event); + process.emit.apply(process, args); + } + }, + + 'removeListener': function(event, handler){ + + var _this = this; + _this.handlers[event] = _.without(_this.handlers[event] || [], handler); + + if(_this.handlers[event].length === 0){ + process.removeAllListeners(event); + } + }, + + 'removeAllListeners': function(event){ + + this.handlers[event] = []; + process.removeAllListeners(event); + } +}; + +var slaveEmitter = { + + 'handlers': {}, + + 'on': function(event, handler){ + + var _this = this; + _this.handlers[event] = _this.handlers[event] || []; + _this.handlers[event].push(handler); + + if(_this.handlers[event].length === 1){ + + process.on(event, function(){ + + _.invoke(_this.handlers[event] || [], 'apply', null, arguments); + }); + } + }, + + 'once': function(event, handler){ + var _this = this, + handleOnce = function handleOnce(){ + + handler.apply(null, arguments); + _this.removeListener(event, handleOnce); + }; + + _this.on(event, handleOnce); + }, + + 'emit': function(){ + + return this.emitTo(['master', 'self'], arguments); + }, + + 'to': function(targets){ + + var _this = this; + + return { + 'emit': function(){ + return _this.emitTo(targets, arguments); + } + }; + }, + + 'emitTo': function(targets, args){ + + args = _.toArray(args || []); + + var event = args.shift(); + + if(_.contains(targets, 'master')){ + process.send({ + 'type': event, + 'params': args + }); + } + + if(_.contains(targets, 'self') || _.contains(targets, process.pid)){ + args.unshift(event); + process.emit.apply(process, args); + } + }, + + 'removeListener': function(event, handler){ + + var _this = this; + _this.handlers[event] = _.without(_this.handlers[event] || [], handler); + + if(_this.handlers[event].length === 0){ + process.removeAllListeners(event); + } + }, + + 'removeAllListeners': function(event){ + + this.handlers[event] = []; + process.removeAllListeners(event); + } +}; + +if(cluster.isMaster){ + + var emitter = module.exports = masterEmitter; + + //any newly forked worker must get a replication of the known event handlers + cluster.on('fork', function(worker){ + + if(!worker.clusterEventHandler){ + + worker.clusterEventHandler = function(message){ + _.invoke(emitter.handlers[message.type] || [], 'apply', null, message.params); + }; + + worker.on('message', worker.clusterEventHandler); + } + }); +} +else{ + + var emitter = module.exports = slaveEmitter; + + process.on('message', function(message){ + + _.each(emitter.handlers[message.type] || [], function(h){ + h.apply(null, message.params); + }); + }); +} + diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..ff0b846 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,318 @@ +/* + * Copyright 2012 eBay Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +var readMasterPid = require('./utils').readMasterPid, + getLogger = require('./utils').getLogger, + argv = require('optimist').argv, + when = require('when'), + path = require('path'), + os = require('os'), + _ = require('underscore'), + assert = require('assert'); + +process.getLogger = function defaultGetLogger(){ + + return { + + 'info': function(){ + console.log.apply(console, arguments); + }, + + 'debug': function(){ + console.log.apply(console, arguments); + } + } +}; + +process.cluster2 = { + +}; + +/** + * @return promise of Server starts + * + * listen will create the Master process, and delegate to its#listen + * it gives back a promise for the master's server to be started (monitoring application) + * + * the resolved promise will always give: + * { + * 'server': server, + * 'app': app, + * 'port': port, + * 'master': master, + * 'worker': worker + * } + * + * if cluster.isMaster === true, the promise will be resolved as monCreateServer, monApp, monPort, master, null + * otherwise, the promise instead will be resolved as createServer, app, port, null, worker + */ +module.exports = { + + /** + * + * @param options + * @return promise + * + * options is a map contains almost every configurable aspect of cluster. + *
      + *
    • emitter: the event driver of the entire cluster, usually being ./emitter, could be overwritten for test or other purposes
    • + *
    • noWorkers: the number of workers the cluster will spawn, default being from the value of '--noWorkers' in argv, otherwise the number of cpu cores on the machine
    • + *
    • monCreateServer: a function which creates the server for monitor application, default being http#createServer
    • + *
    • monApp: an express application to allow monitoring purpose of the entire cluster, default being ./monitor, which supports 'debug', 'ecv' features etc.
    • + *
    • monPort: the port to run the monitor application on, default being from the value of '--monPort' in argv, otherwise 8081
    • + *
    • monConfigureApp: a function to adapt the monitor application before monitor application starts, default doing nothing
    • + *
    • createServer: a function which creates the server for user application (running in workers), default beging http#createServer
    • + *
    • app: the user application to run across all workers, must be provided
    • + *
    • port: the port to run the user application on, default being from the value of '--port' in argv, otherwise 8080
    • + *
    • configureApp: a function to adapt the user application, usually to register all routes, middlewares, default doing nothing
    • + *
    • warmUp: a function to run after the user application started listening, usually to hit some routes to load caches, templates, resources for performance sake.
    • + *
    • shouldKill: a function to determine if a worker is going wild, and must be terminated (then replaced) based on collected heartbeat stats, default being a combination of ./utils#assertOld & ./utils#assertBadGC
    • + *
    • stopTimeout: an integer of MS to wait before further action upon a worker to be disconnected, default being from the value of '--stop-timeout' in argv, otherwise 1 minute
    • + *
    • ecv.root: a string for the url route ecv will be using in monitor application, default being from the value of '--ecv.root' in argv, otherwise '/ecv'
    • + *
    • ecv.mode: one of ['control', 'monitor'] options, default being from the value of '--ecv.mode' in argv, otherwise 'control'
    • + *
    • ecv.disable: a boolean value used in 'control' mode, telling whether ecv should start as 'disabled' or 'enabled', default being from the value of '--ecv.disable' in argv, otherwise true
    • + *
    • ecv.markUp: a string for the url route ecv will accept to 'enable' the traffic in 'control' mode, default beging from the value of '--ecv.mark-up' in argv, otherwise '/ecv/enable'
    • + *
    • ecv.markDown: a string for the url route ecv will accept to 'disable' the traffic in 'control' mode, default being from the value of '--ecv.mark-down' in argv, otherwise '/ecv/disable'
    • + *
    • ecv.monitor: a string for the url to be tested in 'monitor' mode, default being the value of '--ecv.monitor' in argv, otherwise '/'
    • + *
    • ecv.validator: a function to validate the http response from hitting the monitor url given, default being checking status code equal 200
    • + *
    • debug.debugPort: an integer of the port for node-inspector to connect to the user application process, default being from the value of '--debug.debug-port' in argv, otherwise 5858
    • + *
    • debug.webPort: an integer of port to run the node-inspector server, default being from the value of '--debug.web-port' in argv, otherwise 8082
    • + *
    • debug.saveLiveEdit: a boolean value whether or not allowing node-inspector's change should be saved to the file, default being from the value of '--debug.save-live-edit' in argv, otherwise false
    • + *
    • cache.enable: a boolean value whether or not caching service should be started for the cluster, default being from the value of '--cache.enable', otherwise true
    • + *
    • cache.mode: one of ['standalone', 'master'] options, which tells the caching service to be run as a process or within master, default being from the value of '--cache.mode' in argv, otherwise 'standalone'
    • + *
    • gc.monitor: a boolean value whether or not to monitor the GC stats of each worker, default being the value of '--trace-gc' in argv, otherwise true
    • + *
    • gc.idleNotification: a boolean value whether or not node should send 'idle' notification to v8, default being the opposite to the value of '--nouse-idle-notification', otherwise false
    • + *
    • nanny.enable: a boolean value whether or not nanny monitoring is needed, default being the value of '--nanny.enable' in argv, otherwise true
    • + *
    • nanny.tolerance: an integer of MS to wait from action upon suspicious run away workers, default being the value of '--nanny.tolerance' in argv, otherwise 3 mins
    • + *
    • maxAge: an integer of seconds to determine that a worker is to be terminated, used by ./utils#assertOld, default being the value of '--max-age' in argv, otherwise 3 days
    • + *
    • heartbeatInterval: an integer of MS for each worker to report its health, default being the value of '--heartbeat-interval' in argv, otherwise 1 min
    • + *
    + */ + 'listen': function listen(options) { + + exports.getLogger = process.getLogger = options.getLogger || getLogger; + + assert.ok(process.getLogger); + + // Trap all uncaught exception here. + process.on('uncaughtException', function (error) { + + process.getLogger(__filename).error(error.stack || error); + }); + + var emitter = require('./emitter'), + actualOptions = { + 'pids': argv.pids || path.join(process.cwd(), '/pids'), + 'emitter': emitter, + 'noWorkers': argv.noWorkers || os.cpus().length, + 'monCreateServer': require('./monitor').monCreateServer, + 'monApp': require('./monitor').monApp, + 'monPort': argv.monPort || 8081, + 'monConfigureApp': function(monApp){ + + return monApp; + }, + 'createServer': require('http').createServer, + 'configureApp': function(app){ //happens before server listen + + return app; + }, + 'app': null,//must be provided by the options + 'port': argv.port || 8080, + 'warmUp': function(app){ //happens after server listen + + return app; + }, + 'shouldKill': null, //should be a function determine if worker is old or not + 'stopTimeout': argv['stop-timeout'] || 60000,//1 min + 'debug': { + 'webPort': argv['debug.web-port'] || 8082, + 'debugPort': argv['debug.debug-port'] || 5858, + 'saveLiveEdit': argv['debug.save-live-edit'] || false, + 'hidden':[] + }, + 'ecv': { + 'root': argv['ecv.root'] || '/ecv', + 'mode': argv['ecv.mode'] || 'control', + 'disable': argv['ecv.disable'] || true, + 'markUp': argv['ecv.mark-up'] || '/ecv/enable', + 'markDown': argv['ecv.mark-down'] || '/ecv/disable', + 'monitor': argv['ecv.monitor'] || '/', + 'validator': function(err, response, body){ + return !err && response && response.statusCode === 200; + }, + 'emitter': emitter + }, + 'cache': { + 'enable': argv['cache.enable'] || true, + 'mode': argv['cache.mode'] || 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + }, + 'gc': { + 'monitor': argv['trace-gc'] || true, + 'idleNotification': !argv['nouse-idle-notification'] //idle notification by default, unless explicitly set in the argv + }, + 'nanny': { + 'enable': argv['nanny.enable'] || true, + 'tolerance': argv['nanny.tolerance'] || 60000 * 3 + }, + 'maxAge': argv['max-age'] || 60 * 60 * 24 * 3, //how long could a worker keep running, default will be 3 days + 'heartbeatInterval': argv['heartbeat-interval'] || 5000 + }; + + _.extend(actualOptions.ecv, options.ecv || {}); + _.extend(actualOptions.debug, options.debug || {}); + _.extend(actualOptions.cache, options.cache || {}); + _.extend(actualOptions.gc, options.gc || {}); + _.extend(actualOptions, _.omit(options, 'ecv', 'debug', 'cache', 'gc')); + + assert.ok(actualOptions.monCreateServer); + assert.ok(actualOptions.monApp); + assert.ok(actualOptions.monPort); + assert.ok(actualOptions.createServer); + assert.ok(actualOptions.app); + assert.ok(actualOptions.port); + assert.notEqual(actualOptions.port, actualOptions.monPort, "monitor port & application port cannot use the same!"); + assert.notEqual(actualOptions.port, actualOptions.debug.debugPort, "debug port & application port cannot use the same!"); + assert.notEqual(actualOptions.monPort, actualOptions.debug.debugPort, "monitor port & debug port cannot use the same!"); + + var Master = require('./master').Master; + + return new Master(process, actualOptions).listen(); + }, + + /** + * experimental support to run anything, no need to be a server + */ + 'run': function run(options){ + + exports.getLogger = process.getLogger = options.getLogger || getLogger; + + assert.ok(process.getLogger); + + // Trap all uncaught exception here. + process.on('uncaughtException', function (error) { + + process.getLogger(__filename).error(error.stack || error); + }); + + var emitter = require('./emitter'), + actualOptions = { + 'pids': argv.pids || path.join(process.cwd(), '/pids'), + 'emitter': emitter, + 'noWorkers': argv.noWorkers || os.cpus().length, + 'monCreateServer': require('./monitor').monCreateServer, + 'monConfigureApp': function(monApp){ + + return monApp; + }, + 'monApp': require('./monitor').monApp, + 'monPort': argv.monPort || 8081, + 'runnable': options.runnable, //runnable is a function to be called without scope (closure) + 'warmUp': function(runnable){ + return runnable; + }, + 'shouldKill': null, //should be a function determine if worker is old or not + 'stopTimeout': 60000,//1 min + 'debug': { + 'webPort': argv['debug.webPort'] || 8082, + 'debugPort': argv['debug.debugPort'] || 5858, + 'saveLiveEdit': argv.saveLiveEdit || false, + 'hidden':[] + }, + 'cache': { + 'enable': argv['cache.enable'] || true, + 'mode': argv['cache.mode'] || 'standalone' //a process will be allocated dedicated to it, otherwise crush that into master + }, + 'gc': { + 'monitor': argv['trace-gc'] || true, + 'idle-notification': !argv['nouse-idle-notification'] || false + }, + 'nanny': { + 'enable': argv['nanny.enable'] || true, + 'tolerance': argv['nanny.tolerance'] || 60000 * 3 + }, + 'maxAge': argv['max-age'] || 0,//how long could a worker keep running, default will be 3 days + 'heartbeatInterval': argv['heartbeat.interval'] || 5000 + }; + + _.extend(actualOptions.debug, options.debug || {}); + _.extend(actualOptions.cache, options.cache || {}); + _.extend(actualOptions.gc, options.gc || {}); + _.extend(actualOptions, _.omit(options, 'debug', 'cache', 'gc')); + + assert.ok(actualOptions.monCreateServer); + assert.ok(actualOptions.monApp); + assert.ok(actualOptions.monPort); + assert.ok(actualOptions.runnable); + assert.notEqual(actualOptions.monPort, actualOptions.debug.debugPort, "monitor port & debug port cannot use the same!"); + + var Master = require('./master').Master; + + return new Master(process, actualOptions).run(); + }, + + /** + * @return boolean whether the active process is master or not + */ + get isMaster(){ + + return require('cluster').isMaster; + }, + + /** + * @return boolean whether the active process is worker or not + */ + get isWorker(){ + + return require('cluster').isWorker; + }, + + /** + * @return the cluster emitter submodule + */ + get emitter(){ + + return require('./emitter'); + }, + + /** + * @return the cluster status submodule + */ + get status(){ + + return require('./status'); + }, + + /** + * @return the cluster cache submodule + */ + get cacheManager(){ + + return require('./cache'); + }, + + get monitor(){ + + return require('./monitor'); + }, + + get ecv(){ + + return require('./ecv'); + } +}; diff --git a/lib/master.js b/lib/master.js new file mode 100644 index 0000000..1aadcbd --- /dev/null +++ b/lib/master.js @@ -0,0 +1,462 @@ +'use strict'; + +var _ = require('underscore'), + util = require('util'), + when = require('when'), + timeout = require('when/timeout'), + utils = require('./utils'), + assert = require('assert'), + cluster = require('cluster'), + request = require('request'), + Puppet = require('./puppet').Puppet; + +var tillMaster = when.defer(); + +exports.master = tillMaster.promise; + +var Master = exports.Master = function(proc, options){ + + return this.initialize(proc, options); +}; + +Master.prototype.initialize = function(proc, options){ + + var _this = this, + pids = options.pids; + + utils.writePid(process.pid, pids); + + if(cluster.isMaster) { + + _.extend(_this, { + 'pid': proc.pid, + 'process': proc, + 'emitter': options.emitter, + 'logger': process.getLogger(__filename), + 'runnable': options.runnable, + 'createServer': options.monCreateServer, + 'app': options.monApp, + 'port': options.monPort, + 'ecv': options.ecv, + 'cache': options.cache, + 'gc': options.gc, + 'configureApp': function(monApp){ + + assert.ok(_this.createServer); + assert.ok(_this.app); + assert.ok(_this.port); + + when.all([ + utils.rejectIfPortBusy('localhost', options.port), + utils.rejectIfPortBusy('localhost', options.monPort), + utils.rejectIfPortBusy('localhost', _this['debug.debugPort']), + utils.rejectIfPortBusy('localhost', _this['debug.webPort']) + ]) + .otherwise(function(error){ + + _this.logger.error('[master] one of the ports:%j we need has been occupied, please shutdown your program on that port; error:%j', + [options.port, options.monPort, _this['debug.debugPort'], _this['debug.webPort'], error]); + + process.exit(-1); + }); + + //cache is 1st enabled, ahead of any worker process, ahead of master's monitor app configuration + //to allow cache service started earlier than where it's required. + require('./cache').enable(options.cache, _this); + + require('./ecv').enable(monApp, options.ecv); + + require('./status').register('deathQueue', function(){ + return _this.deathQueue || []; + }); + + //monitor app could also be configured now, should return a value or promise. + return options.monConfigureApp(monApp); + }, + 'warmUp': function(){ + + if(!_this.gc.idleNotification && !_.contains(process.argv, '--nouse-idle-notification')){ + //the ugly way to force --nouse-idle-notification is actually to modify process.argv directly in master + var argv = _.toArray(process.argv), + node = argv.shift(); + argv.unshift('--nouse-idle-notification'); + argv.unshift(node); + + process.argv = argv; + //cluster#setupMaster or 'settings' could only handle execArgv, and won't help with '--nouse-idle-notification' + } + + _.each(_.range(0, _this.noWorkers), function(ith){ + return _this.fork(_this.options); + }); + + //wait for all puppets to be ready, and then enable ECV as the last step + return utils.warmUpThenMark(_this.emitter, + _.map(_this.puppets, function(p){ + return p.pid; + })) + .ensure(function(){ + _this.markUp(); + }); + }, + 'noWorkers': options.noWorkers, + 'shouldKill': options.shouldKill || (function(){ + + var assertions = [utils.assertOld(options.maxAge), utils.assertBadGC()]; + + return function(heartbeat){ + + return _.some(assertions, function(a){ + + return a(heartbeat); + }); + }; + + })(), + 'stopTimeout': options.stopTimeout, + 'debug.debugPort': options.debug.debugPort, + 'debug.webPort': options.debug.webPort, + 'debug.saveLiveEdit': options.debug.saveLiveEdit, + 'debug.hidden': options.debug.hidden || [], + 'options': options, + 'puppets': { + + }, + 'deathQueue': [], + 'status': require('./status'), + 'isMaster': true, + 'isWorker': false + }); + + if(options.nanny && options.nanny.enable){ + _this.nanny = setInterval( + _.bind(utils.nanny, _this.puppets, _this.deathQueue, _this.emitter, function(){ + _this.fork(options, proc.env); + }, + { + 'logger': _this.logger, + 'tolerance': options.nanny.tolerance + }), + options.heartbeatInterval); + } + + cluster.on('fork', function(worker){//interestingly, on fork or #fork could complete in disorder... + _this.puppets[worker.process.pid] = _this.puppets[worker.process.pid] || new Puppet(_this, worker, options, worker.process.env || {}); + _this.puppets[worker.process.pid].worker = worker; + }); + + cluster.on('online', function(worker){ + _this.puppets[worker.process.pid].whenOnline(); + }); + + cluster.on('listening', function(worker){ + _this.puppets[worker.process.pid].whenListening(); + }); + + cluster.on('exit', function(worker){ + + var deadPid = worker.process.pid; + //exit puppet + _this.puppets[deadPid].whenExit(); + //mark dead worker's pid in /pids path + utils.markDeadPid(deadPid, pids); + }); + + _this.emitter.on('heartbeat', function(heartbeat){ + _this.puppets[heartbeat.pid].whenHeartbeat(heartbeat); + }); + + _this.emitter.on('disconnect', function(pid){ + _this.puppets[pid].disconnect(); + }); + + process.once('SIGINT', _.bind(_this.whenStop, _this)); + process.once('SIGTERM', _.bind(_this.whenExit, _this)); + + tillMaster.resolve(_this); + + return _this; + } + else if(proc.env && proc.env.CACHE_MANAGER){ + + var Worker = require('./worker').Worker, + manager = require('./cache-mgr'); + + _.extend(options, { + 'createServer': manager.createServer, + 'app': manager.app, + 'port': manager.port, + 'warmUp': manager.afterServerStarted, + 'debug': false, + 'maxAge': null + }); + + tillMaster.reject(new Error('this is cache manager worker')); + + return new Worker(proc, options); + } + else{ + + var Worker = require('./worker').Worker; + + _.extend(options, { + 'debug': process.env && process.env.debug + }); + + tillMaster.reject(new Error('this is worker')); + + return new Worker(proc, options); + } +}; + +Master.prototype.listen = function(){ + + var _this = this, + createServer = _this.createServer, + monApp = _this.app, + monPort = _this.port, + configureApp = _this.configureApp, + warmUp = _this.warmUp, + wait = _this.timeout; + + assert.ok(createServer); + assert.ok(monApp); + assert.ok(monPort), + assert.ok(configureApp); + assert.ok(warmUp); + + var tillListen = when.defer(); + + when(configureApp(monApp)).ensure(function(configured){ + + var server = createServer(monApp).listen(monPort, function(){ + + _this.logger.info('[master] warmUp'); + + when(warmUp()).ensure(function(warmedUp){ + + _this.logger.info('[master] warmUp complete: %j', warmedUp); + + tillListen.resolve({ + 'server': server, + 'app': monApp, + 'port': monPort, + 'master': _this, + 'worker': null + }); + }); + }); + }); + + return (wait > 0 ? timeout(_this.timeout, tillListen.promise) : tillListen.promise); +}; + +Master.prototype.run = function(){ + + var _this = this, + warmUp = _this.warmUp, + wait = _this.timeout; + + assert.ok(warmUp); + + require('./cache').enable(_this.cache, _this); + + var tillRun = when.defer(); + + when(warmUp()).ensure(function(warmedUp){ + + _this.logger.info('[master] warmUp complete: %j', warmedUp); + + tillRun.resolve({ + 'master': _this, + 'worker': null + }); + }); + + return (wait > 0 ? timeout(_this.timeout, tillRun.promise) : tillRun.promise); +}; + +Master.prototype.debug = function debug(pid){ + + var _this = this, + noWorkers = _this.noWorkers; + + pid = pid && _.isString(pid) ? parseInt(pid, 10) : null; + + _this.logger.info('[debug] master debugging %d, currently busy: %s', pid, _this.debugging); + + if(!_this.debugging){ + _this.debugging = true; + } + else{ + return;//cannot debug more than one worker + } + + _this.markDown(); + + //debug fresh + _.each(_this.puppets, function(puppet){ + + if(!puppet.cacheManager && pid !== puppet.pid){ + _this.logger.info('[master][debug] fresh, disconnecting:%j vs pid:%j', puppet.pid, pid); + puppet.disconnect(); + } + }); + + //send signal to the puppet + var pending = when.defer(), + ready = pending.promise; + + if(!pid){ + + _this.fork(_this.options, { + 'debug': true + }); + + pending.resolve(true); + } + else{ + + var debugging = _this.puppets[pid]; + + _this.logger.info('[master][debug] going to debug live:%d status:%s', pid, debugging !== null); + + ready = debugging.debug(); + + _this.emitter.once('debug-finished', function(){ + + debugging.disconnect(); + }); + } + + ready.then(function(){//must wait for the signal to be sent, and child process ready to accept connection on 5858 + + _this.logger.info('[master][debug] starting inspector'); + + var inspector = utils.startInspector(_this['debug.webPort'], + _this['debug.debugPort'], + _this['debug.saveLiveEdit'], + _this['debug.hidden'], + _this.logger); + + inspector.on('message', function inspectorListener(msg){ + + if(msg.event === 'SERVER.LISTENING'){ + + var inspectorUrl = msg.address.url; + _this.logger.debug('[master][debug] got inspector url:%s', inspectorUrl); + _this.emitter.to(['master']).emit('debug-inspector', inspectorUrl); + + inspector.removeListener('message', inspectorListener); + } + }); + + _this.emitter.once('debug-finished', function(){//u'll hear back from the debug app about this + + if(_this.debugging === true){ + _this.debugging = false; + + inspector.kill('SIGTERM'); + //restore the workers + _.each(_.range(0, noWorkers), function(ith){ + _this.fork(_this.options, {}); + }); + + //mark up ecv now + _this.markUp(); + } + }); + }) + .otherwise(function(){ + + _this.logger.error('[debug] master did not get worker to debug mode:%d, debug request aborted', pid); + }); +}; + +Master.prototype.markDown = function markDown(){ + + var _this = this; + //mark down ecv + if(_this.ecv.mode === 'control'){ + _this.logger.info('[master][ecv] marking down'); + request.get(util.format('http://127.0.0.1:%d/%s', _this.port, _this.ecv.markDown)); + } + else{ + _this.logger.info('[master][ecv] markDown ignored, not in control mode'); + } +}; + +Master.prototype.markUp = function markUp(){ + + var _this = this; + //mark up ecv + if(_this.ecv.mode === 'control'){ + _this.logger.info('[master][ecv] marking up'); + request.get(util.format('http://127.0.0.1:%d/%s', _this.port, _this.ecv.markUp)); + } + else{ + _this.logger.info('[master][ecv] markUp ignored, not in control mode'); + } +}; + +Master.prototype.fork = function(options, env){ + + var _this = this, + forked = cluster.fork(env); + + //create and register the puppet managing this forked worker immediately + _this.puppets[forked.process.pid] = new Puppet(_this, forked, options, env); + + return forked; +}; + +Master.prototype.whenStop = function whenStop(){ + + var _this = this, + cycle = 1000, + deadline = Date.now() + _this.stopTimeout, + gracefully = function(){ + + if(_.keys(_this.puppets).length === 0){//wait till each live puppets to be disconnected, then exit + process.exit(0); + } + + if(Date.now() >= deadline){ + process.exit(-1); + } + else{ + setTimeout(gracefully, cycle); + } + };//check every second + + if(_this.nanny){ + //stop nanny monitoring, otherwise it will conflict with the worker decrease + clearInterval(_this.nanny); + } + + _this.emitter.emit('debug-finished');//kill inspector please + + _.each(_this.puppets, function(puppet){ + //disconnect each worker + puppet.disconnect(); + }); + + gracefully();//shutdown gracefully +}; + +Master.prototype.whenExit = function whenExit(){ + + if(this.nanny){ + //stop nanny monitoring, otherwise it will conflict with the worker decrease + clearInterval(this.nanny); + } + + this.emitter.emit('debug-finished');//kill inspector please + + _.each(this.puppets, function(puppet){ + //disconnect each worker + puppet.disconnect(); + }); + + process.exit(-1);//shutdown bruteforcely +}; diff --git a/lib/monitor.js b/lib/monitor.js new file mode 100644 index 0000000..5e6e81d --- /dev/null +++ b/lib/monitor.js @@ -0,0 +1,327 @@ +'use strict'; + +var express = require('express'), + when = require('when'), + path = require('path'), + ejs = require('ejs'), + fs = require('graceful-fs'), + _ = require('underscore'); + +var logger = process.getLogger(__filename), + monApp = express(), + masterPromise = require('./master').master, + status = require('./status'); + +//the monitor app should support the following: + +//debug +var debugMiddleware = exports.debugMiddleware = function(req, res, next){ + + if(req.url === '/help'){ + + return res.sendfile(path.join(__dirname, './public/images/live-debugging.png')); + } + + if(req.url === '/deps'){ + + require('./utils').npmls + .then(function(deps){ + res.type('json').send(deps); + }) + .otherwise(function(error){ + res.send(500); + }); + + return; + } + + if(req.url === '/status'){ + + //show all statuses + + //render as a view of table, each status name links to the status url of its own + + //each status url accepts 'GET' to render, and an additional view template path, to overwrite the default rendering + + //each status url also accepts 'PUT', which takes the url params to give to the update function registered of the status + + } + + if(req.url !== '/debug'){ + + return next(); + } + + logger.debug('[monitor][index] renders'); + + res.render('index', { + + }); +}; + +monApp.use('/scripts', express.static(path.join(__dirname, './public/scripts'))); +monApp.use('/stylesheets', express.static(path.join(__dirname, './public/stylesheets'))); +monApp.engine('.ejs', require('ejs').__express); +monApp.set('views', path.join(__dirname, './views')); +monApp.set('view engine', 'ejs'); +monApp.use(debugMiddleware); + +exports.monApp = monApp; + +exports.monCreateServer = function createServer(app){ + + var server = require('http').createServer(app), + io = require('socket.io').listen(server, {'log': false}), + debugging = undefined, + inspector = null, + state = null, + statuses = {}, + sockets = [];//all of these vars are now scoped in monCreateServer to make unique + + logger.info('[monitor] server started'); + + var workers = _.once(function tick(){ + + masterPromise.then(function(master){ + + var pids = _.keys(master.puppets); + + logger.debug('[monitor][workers] pids:%j', pids); + + when.map(master.status.statuses(), function(status){ + + return master.status.getStatus(status); + }) + .then(function(statusesOfWorkers){ + + logger.debug('[monitor][workers] statusesOfWorkers:%j', statusesOfWorkers); + + _.each(statusesOfWorkers, function(statusOfWorkers){ + + _.each(statusOfWorkers, function(statusOfWorker){ + + statuses[statusOfWorker.name] = statuses[statusOfWorker.name] || {}; + statuses[statusOfWorker.name][statusOfWorker.pid] = statusOfWorker.status; + }); + }); + + var arrOfStatues = _.map(statuses, function(v, k){ + v.name = k; + return v; + }); + + _.each(sockets, function(socket){ + + if(_.isEmpty(_.difference(socket.knownPids, pids)) && _.isEmpty(_.difference(pids, socket.knownPids))){ + + logger.debug('[monitor][workers] emits status changes:%j', arrOfStatues); + socket.emit('status-change', pids, arrOfStatues); + } + else{ + + logger.debug('[monitor][workers] detects workers changed:%j from:%j', pids, socket.knownPids); + socket.knownPids = pids;//update pids + + fs.readFile(path.join(__dirname, '/views/workers.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'pids': pids, + 'debugging': debugging, + 'inspector': inspector, + 'state': state, + 'statuses': arrOfStatues + }); + + logger.debug('[monitor][workers] renders workers view:%s', html); + socket.emit('workers', { + 'view': 'html', + 'html': html + }); + }); + } + }); + }); + }); + setTimeout(tick, 1000);//everyone 1s + }); + + var watchings = [], + watchExists = function watchExists(usr, namespace){ + + if(_.contains(watchings, namespace)){ + return; + } + + watchings.push(namespace); + usr.watch(namespace, null, function(value, key){ + + logger.debug('[monitor][cache][%s] detects change of:%s', namespace, key); + usr.inspect(namespace, key).then(function(status){ + + logger.debug('[monitor][cache][%s] emits cache-changed event over websocket', namespace); + _.invoke(sockets, 'emit', 'cache-changed', namespace, key, status[0], status[1], status[2]); + }); + }); + }, + watchFresh = _.once(function(usr){ + + usr.watch('', null, function(value, namespace){ + + logger.info('[monitor][cache] detects new namespace:%s', namespace); + fs.readFile(path.join(__dirname, '/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'namespace': namespace, + 'caches': [] + }); + + logger.debug('[monitor][cache][%s] renders empty caches view', namespace); + _.invoke(sockets, 'emit', 'caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }); + }); + + watchExists(usr, namespace); + }); + }); + + function caches(){ + + masterPromise.then(function(){ + + require('./cache-usr').user().then(function(usr){ + + usr.ns() + .then(function(namespaces){ + + logger.debug('[monitor][cache] existing namespaces:%s', namespaces); + + _.each(namespaces || [], function(namespace){ + + watchExists(usr, namespace); + + usr.keys(namespace).then(function(keys){ + + logger.debug('[monitor][cache][%s] existing keys:%s', namespace, keys); + + when.map(keys, function(k){ + + return usr.inspect(namespace, k); + }) + .then(function(values){ + + fs.readFile(path.join(__dirname, '/views/caches.ejs'), { + 'encoding': 'utf-8' + }, + function(err, read){ + + var html = ejs.render(read, { + 'namespace': namespace, + 'caches': _.map(keys, function(k, i){ + return { + 'key': k, + 'value': values[i][0], + 'persist': values[i][1], + 'expire': values[i][2] + }; + }) + }); + + logger.debug('[monitor][cache][%s] inspected:\n%s\nand renders caches view:\n%s', JSON.stringify(values), namespace, html); + _.each(sockets, function(socket){ + if(!_.contains(socket.namespaces, namespace)){ + + socket.namespaces.push(namespace); + socket.emit('caches', { + 'view': 'html', + 'namespace': namespace, + 'html': html + }); + } + }) + }); + }); + }); + }); + }); + + watchFresh(usr); + }); + }); + } + + //the debug flow is as the following: + //app view accepts debug request, and we call master#debug to start + //app view shows the debug as preparing till we hear 'debug-inspector' event from the master + //app view shows the inspector's url for user to go to + //if it's debugging live, the worker is still running and debug is started as well + //otherwise the debugging fresh, the worker won't start till user comes back to the app view and 'resume' the debug (after he/she puts all the breakpoints needed) + //user could continue the debug till the app view accepts 'debug-finshed' request and propagate this event to the master + + io.sockets.on('connection', function (socket) { + + logger.info('[monitor] accepted new websocket and sending workers & caches view'); + + socket.knownPids = []; + socket.namespaces = []; + sockets.push(socket); + + workers(); + + caches(); + + socket.once('debug', function debug(pid){ + + debugging = pid; + inspector = null; + state = null; + + logger.info('[debug] %s requested', pid); + + masterPromise.then(function(master){ + + socket.once('debug-started', function(){ + + state = 'debug-started'; + master.emitter.to(['master']).emit('debug-started'); + logger.info('debug:%s start requested', pid); + }); + + socket.once('debug-finished', function(){ + + debugging = null; + inspector = null; + state = 'debug-finshed'; + + master.emitter.to(['master']).emit('debug-finished'); + logger.info('[debug] %s finished', pid); + socket.once('debug', debug); + }); + + master.emitter.once('debug-inspector', function(inspectorUrl){ + + inspector = inspectorUrl; + logger.info('[debug] %s inspector ready:%s', pid, inspector); + socket.knownPids = [];//force an update + }); + + master.debug(pid); + }); + }); + + socket.once('close', function close(){ + + sockets = _.without(sockets, socket); + }); + }); + + return server; +}; diff --git a/lib/public/images/live-debugging.png b/lib/public/images/live-debugging.png new file mode 100644 index 0000000000000000000000000000000000000000..626228bb5a3999e84bda15b84b812dc4983ad0d1 GIT binary patch literal 853836 zcmeFZWn7e9yFRSkph!xWgn%%#k^<5tAU#8;NJ|L=QUi!|sg%+wFm!iIcju5&LkbKr z#Jt13_p`V6^WV?2?~m_?{Q;P{uJv2jTIV{>=;OP@hsRwU5ib^Tr7j6TEBG&=Sp;DsDZ&?t^??%umIu;eufDG3E#tf zD0%1Z|NhJ0i1Xq8>Uzcd|9$9x%tpeX6ma}^W=0R!#lD-#PcHop%;0wi1N(pfC2QkE z@V}4xb0XZwlCfRVfC_@Yw{AZG{?Ol$#_bT($Cx2wy4V&|{(o!D*bj5sg#X_5usJ{8 z(V)i77!dh;XM+~r^ZS2qsDI!?1|{>yv3mFaj-0U>BxCPw{=Mxnls?3ewc-58yYsj3 zbQdkWYCAMeKne0-GdLw+9Pblfj)Zye z>DfTTHMW(fU=;bSeU@fCIbjySB@;UG0S{#h*8wbVGUFO59T3^pqw&yci@ap<@$I#~ zMjR&JA*?KY-~P7|kNsNRFfyQ~mx@5#0^NMmIPLg*PdF-aRegi9hBpy^7q_(5w1J`S2^Ny3Sk%^(E;C4YC~Scq8MVpnR9X#5nNxz%Xj+ z6zN!P%!joK7(?40m{<~ZlGD=A4p1Q+qbi60qTY!9BB-_g^N6LHq^W_w8Ga$3BB-Jr z&M!kMhgf%yx47vueJ{7iIGA1i(<=rF*TNOE}}tMCq6mA~U@h40=}{wMEtYLogPo`A49_Wd5u+_`!Wr{@$c z-RhF8UxO~HoUa$tRLNB-0yVBhMC^ev_ix6M3hdC*^}6d@R~Vjl5ddnr;WaRs++??f zmiMo?U^l-zO&dTFto?-@S~V%q&T2lrR5krw%q|tvep)Uu6QhGhSOwIP)qt;j?g&S$ zO-GLqV3rzZ^JPd#(=HGKKN&dA<%_z5VJtao>D@~$IJ#96y;w@fLB?&zp%cCo@9>cm z;ZJ`e5Z;wX{{dK*OrazI$X+m^)Bk0F;W?l`NC-B*mKtn-uM^)p z0b0}HVK4CA?d;7LAt*0=`Q^vlWo)thv;@047_py_sSREd1<~d>50eiVnln6Y#GJ9z z>0ju!+IpQHRZvmUJH#nk<*JvCY@n+)WPDq3XOYp*&uBXD$4p@K4Lvz^!>-1Ius@bI zm!06+`i63joozI~Yl$wwt#cim)g#W}*ZLLvoJKo7!Rx%R<#O|qP4Us{~!6LTpTzRZQeD`{>e4^N4F)KslVc!TL#v*)sR!3zTczY z)8P!FzQn28%6D#0WaiI>Av94eo*+w0u^L)k6V`zA$Y*kIYKUq%?lvqH(6k|E9S-e1 z;Z*ZN1LsFpSPmmgz3H*|E%|Ej8;*NswBVS_t$jZCxSDa=r3cXBqEMa?5R)Bxsr31| z3R1?FAZrA&l+66$K40^jU15x~SCXJ&p663h#ivb>k_17TL`peZl^UmdDQJLMilf}8 zxr@}2a2)N$iL1YKdT{OtfKq>R+9@$Dg#z;-C0W=C!p%sY z5v5Eq$FA0=Csa#aQj&@w!V2ZP|9j*TpMR&0KYrWaq6QtH3gc|K#qVox3mlbE1kh-M z&u}2Vlav|r1|6?1ZieC$&x6#?F04>jF^~m8_^H*zZARp7`eDwxyeZxBl9z) zUY1#rUti@jY~u1}nlDlfoutZB8$GA4(pIn`z4pv8y5 zU<5%z=Y4a4dK!&^(VZEScUY1I73|@?c{}#LZe)6N09CAtCWCWb2OL*{qjw^Y1smbNJqjbCg_Ncxn+Xfq$nFs1ZR97Vy54 zGAr^q^+7YDX>+S!O?c7Fq&vi?Y^;G9pWgdWCiN&gSA6FO3BB`=&kYAv!Ip>7S9;T| ziEXS>BQ-&hz6LD#xP{-JqMxn47?Gx8X*MAoEzo_Ie3DwgLjweGK$0v!4P2T2TgH z;U2n7zb+lHINuDd!d>UK-aU4L)eWsDm_P;vrjvbdE-1V&u0)0G`zo4;z9T&ibSQ3K zx2C-{1f!LQ{B90-LcKd3PTd1Fz3!M&0=-&Cb};7R`G`Nn*b?u@+vpLV&SrVpdi1!|+!UDjtkXB` zPR&EO?pd5piSabxZ?t66m?Dj$FGU9sK9*?Fwr+OP$H&?iJT&nxT;5VG=aIGfN^aqS zw4wJNv@@m^oL~#&waa@y>&qT?8d8Mw6#`!sd|91=rCWgC@fA1k^KgBCKKpuaNc+o4 z*F_GK>pq>d>t3~)Z>xsitx(r%*`5>zZp;FL^SucTuRzGHH`xRVcl>D|)plsi4I~=?m)cn0>L0JBd{{;rZ$5>_7G7mQ#CsrwWEXhvx7|5=+BEEBaakVMo zJHtdc9R4EAJf|SvCB;r&P6aV?6hvRbq9p+Ayb-%|C;jTyo*j&#e^OxjhIGEd>eT&}$MAbA~$@$ru)x<*US;rz)0 zH{~(iw5?Hl0r{;-I?Ae&DcohUyO^&eQTYHp_u12rh4`n7gr13lIIE2b?p7iasO{n5 ziyjJC$_+ueT2Th^`^n)Fkwbq%&I!i6Q?LYH*mk^oz%xi>k|b@K#sTgs!ShA(hnWCCBQY7Mi^p#cObh(3$QXs1`hxD>6^`M4MO{w9v4h}&Mx;nb4@^^{I0Db!aYZBc(JZ z>eV+rlQ>>sRuie$sh?|7vCGXcFh!EdU+(~YfMnN0>H`Ja#4}%_G)+Pe**FZFf361qJVePkUXso9jXdw7Jrr4^xcAK5m zx9hH#anmFYz730yI#BJff-he{202hCadHJ)KU|74>ZG46=Jhdzfn#PAa#BB!uy5C}9525WZD?2mZDXxPj0_=6A zU6*Dk>KAIZ^J?{7@H?L4=C!Fclx&J4^zYlAh+HoT!@u@JygeoXMT?6aVw)lr&!G)cjD&)CjESt(o)U z$1ASfgW5FopO3ymd&R$};KP;C$?#6_iy3NkfUqot9Shess;R=UJ06emjCT-TXf)ec zA@rTW7h1AbLkKL~Ra@M&aJ=bQlx<0HEmviYVY3e73?1WjDT3?-9l%aQTh6l`4_%~&Q=G1}hEZ^= zM3?s+dhTJMlatCcG7!x@_fOZ)dCZxX4KA;?K?K7&FHk+f638wIh&j=^oF)LdYHxLA zQ`?Y)Z-mNEfS8mIFCG;;w`>Uh+AaJAbYwt?v7muy%nSTP+p6?%~QB86M0 zYD1s?Je+Xh*L7rZE*`ZRll9edc|ZNh;eCVU0`Bm<%!7NbyW(Srqx7!R;q&`^N%O&U zr=>Iw^+TEb(lz^En~c5s3JNAWX)kC&&?qX`P&4z|f_ht}NFyj^_%H*JJO@;ra1iTDg)aeu1&au5-8X zd0cpVy?YxHUT-{|j=`#A-hJZz;V(y~c6(&*uVxt0M`jv~frw-kGbno77cVU{ysO}U zxi8f0K2R1NnF!)xpBQjD>R!~`*QjKjhe2sCf+OW?LW}O3NRUoF`{NG`?6*A2$EN3( zowoL)-Su{b)0w3+-x)brzG#0l5Kq*8HoIF`yIjcQyIFWp-yH6eK-ybWry%p%&t zU{~JfcqWq{du)cz)BF2`iVrkc;B_=)ZX5XMB1GZ(TtR}neWA!n;iip9&12RXman=v z(BQ#Jur~6VO1%s;zWt3$0Xr60B7vA zi-1uPjsq_0CK6>GZQZexpVo>P|n^p%Y)!%3zT)Y?+NmWuf7HoU{a4 zAc1sedH}o-u!CQ-o7ydLE(PVpRQVmlESlu{C#4T^!Gd ze!d_`DM2Ko&meyWUrhC>SXt&4sF+?}t`b^<6t#k&`sr`NxC^+{vkZo+H^%^z6y_GS z^OlDcdq2l!LqwLjbbdoYwDr*BuJ-AV`A^j zb^6?6o$1>b34Nr-%N9)x=D?j1RdqNt28=xUOD!je>G(wP@HQ6 zAAhO?D@^|!)GaR(W^#xT-&YtK1dU$>j;Rg+!OA0 zP`XyHV&sD}%j?B&v!Up3w!&s|0z2Q<=C&MeUx(I3?EpOW_k1lf(1OIMxvxB_nfHb| zZ0=Ak1?ry}HAy2X<3{Q4^(6hJ_Mjsd1oVxcrm4}WmNEHdgPxUbbUp>@;&>R+oy*B2 zy)KSOOM9{Io03^A&A#LHj@3kprc-aM z!pX;Y?PL0WKISQ6zNFs!xSN)6KPdsv-Ba(8IfsP-4unF84<=&N3#1Q#qrq)r?KwN50R<+7=hqV07Xa(YJU5b zdKR466Vna9jyR!fJH=1~e^DE~=9dEVh$jg6ck)p-65x$yAP(*f?(!+UaNJ@Y9}y zuXaz4X)iSXB}FaAsg6prCURs*3c97XrzWiukTf^k6Y3C%fl`;%9ZkHuvHh zk&64H`gJBRGATQV0<8h!G67-}muUaB2>$(J&z{TS98_$xQB)E2Y@N zB`d?mf0ET_sMps0DauHGx#nT%z{L&w%ar?apO2_@Z4(T*0S9m8~cns>1b zXQJ6{3kr7HG{^8DSC~nU!^_=xD^Nt29K;9xb0%~( zAPtLjv(lneyOrypk5}TThiR{g$5Y3|r)qKq5Bn`^I#L(mVkBqc4g(`XHs*ZJU<%-> z;u?kV8iP9|XtTtMy_HtEGgVaKO?5-Pebmphsc*wtT8@n-!~aUS>0;idAwLAPvfS?R z%&@fvpo^m`LE6kj5*amjKE{toF(ag#qZ{bvL2twY1K!&nUu0G7KFh9q_=Q|OrErg4 zU@gB)Y7oziRIkBl`+IKgj*`K+0N}(*@qm*ix^R+wJT%D>GT4w0y{RfO+}D9fietG8>+E=3*Wwhuy8}!%z;5kYc zxpa+jL3$T+KgrL5>g>`-V18zLGTbfu88vc0Y5m=ewvk43;#p;Zh)W^MnW#~)#RQjc zfQyZ=d8s2dXJab^%159uH2|!em51H%;nOFajHWEOxHVtYK{jTi45Oe_S|DCWyS<9xK6+Sbj46grxrH4HmCgh z{!C9GvHC!AQ2o0pm#gEXGyWz>!S-D81wGfqR2dy+muxyPJxIy$k-}7u4x!oPuveHT zEeVF(@#2Fm+j$cmj;H#dO1M)&m&|n?54?VEQQz@n$N2UlS4!QVQ4q7@mrb8RTMMqz zJhsRsiz+d^t_Fp03zpxvA-N2pSPq)FhG5U!L0?~9d@$kukxM+QyjvztPy&a^;G^xy zJ7ruGAA^fUuEg7U7qNd@5aoow&Kr3W*!Xg%0{s}UcJ z*6Q8YcVVPME=yfc8-+o!fkhP#&WAphcB!K-kcRgzx-T%+IMRRgd)8{JoePt-Eu_LL zncsbB`&}ika{r?Yne z<2F_L@x|PwC+2<5BojisiYaBxQS>ySw*>x=m_n2sU1RAM{L^9ORJscziZU-~LSS!c z(^&T&-9HN#h~76FovVo>bbN^3HJGS>a!$y)M?*QSJpEvIvb1rXG2K>=>&F~Tc+XcM zpqYC2q)k1>-iA**00VnL$KSRF|Emjvb$9=QJ22~qAme{Xt2L8!<`@3TUeY|p zIzg#MxT0j_!}&^?PkQFhXz8mh*d72_Z=AlO2p2EbI)*RMd0TWg^eYzp{ZwaT;9HvC zgnrA`n6(<8AC&{!P})5aQ*P;mZf9lia>{!Je5>Y#bnWSN}hC)6pq|=->z;5-3Gf7fgG_> z@TN2Z>;k#pVYei2>beQ9(ZgQ)^Rh0$U&DOSG*Gm-tIoMmz562~qD+z!nDGVf=#@Jo z>t-m}Jriz}#$$?)(;;{-g*%|SwWwg9eOWfqvFka;nNn+eQsGiek^X_wdeQ8c`mR3H zt!i%fGh5n$Moz3C@UiKp>pgqn&=2-QfXPMRME?<|X)bxBAK5d|gnN_N{HsMx;DM*x z_y5G_f9iGkOFtT%@Ga9)HniYd#Ykq_NG1^~`3=5X2dPDVb$`m#t;x?Q_%hK8Sm5Ym zv2Sp5Z?JbhXloByWR8!`Y2k0X!&srhw|G^HUz`+wF_^f2Gj4CW!G$Kh zM|U~ihgHnGna!)rxZV2`ufH9$mg$aHTeu6&Ec=iChe}ZwfM_@ z4BMOZr^~cjuIorsj%3d*lf(|Yuzpmc@^5m_0gtYQ(;!1NmT zMUTym!6e7#iw(QtI!n@oQc8EryETfO`UVxV3+B;cr}K_2Rd&;=s;W^_CI#%zv!aF> zWX+j7u>V5w|09xH+ix3ApAMZlaD@%$1@Os##tiEiAq7u5&srp;_?*tBT?|+`H2#w3 z0`g5{JUDZ}>UVXhVZ&)oV(FM<9PhRzH_j?>pr# z`QLbcCb}`(e3bUf=sk4$Z(o(vEq&Up;d*u$a{4nyP5THh=Y#r3|9fdhLch>u+>hNGT?7 z=IJj9c#;1rI3-(-aXEr7%M2S9(Cn!fXz zKN={Ox=xKvpP}>6|5EQc9ng6O@{M!d#@44FB+Kq*6iv1aBQ3rJd3-i-yT8<&s}{ge zsm38BDq27w+I(77BAiR7c9PQiBqu!C&i2FnS#6afllaflU{a8Al*+uRE}KzM-bn+n zA>|pHWe)EcG%wMnpr!8Ym>%`ovSXK4B6U=DT1y*$^BsxkWemNEZyU12$Z17}&@1o3 zj`C~#Kkl-(GvP1=x_*>;{#^3Z;6UjI(C|oe^_STq zHAn74{3e|_JiC4xJa}(5PS)1W(mArMn@+UnEWHQsx-vP*sapc|E12%Mlx*kwaduku z*tek#K%{raSMr=d&SM>cgZvdOnS3B)yjFJMnVuFSh1H&Sz3_G3k`Hi{i!9lBt*S-j z(nLbfcpHIpImJ~2^E_uF6h#;vKsHSp$H`yAx@E%#K2_vAF}n>s_j6jW>YIvXIrTd- z1^3rKe5L)jP&385<SS?1MAB}NcZBKph^k z$I1j$QATwa1X@o#I4qEqB5xL=+zczEQF~<})y%d;s%@6oC03QrGFsm;-MEgr96#{h zC@)EIF5@tat1Bf-bwghIo>b7MoL%tnQ*)(hFacc(qNJz#C!+_XQ^*U^oh$Lxeh8aP zYD3YCw=cj?nk(I{KRaAUNehv0ZEWEX53Cn`CJ7u=+dDs_A{S8q3*;u89<@Jj& zvh8;R%JeQL8|{Iq2u9@T7dx-qlOoL_M_)#z|5BR! ze^4L)sa0(FRr5zTTMY+W7+j*HZU_U*5LC;E)85#FsFUVbMRgN4UQW1g;&hF8VVUl3 z8z1|cG@mg|RkB*vJF{A2P7Nv;cbXB$N+t69NU()6zJOcRcCSp*!_-%(`r?V=oq<6( z!y`BIc2qfv#P>9E$IE)iu#9Be*^P8h+xLUErhcaX+@trbFxVl9Ixkk^Za!ZpZyyyMjz`}oKMQ;j|m!iSM3D+5ifcB za-LbQXrWllDCIQZeTQS=+#WjyYMPk-W1BjWV=4_XsFlG{@wSck<}*OsNCqA45MI?x z%f)_9XzOdi!e9cQrTBw13A$h%`Zv!!--_{T@3^J|3*~u+$M|gpSi+!%P^dcREA5XN zdU27BBtx|V`?M(Mv6hsh&ju|n!R^nH9tRWdX;7@@9is#6DrTuKFJ*4Kib`etxqeX{ zAB&tb69u$(dwSBI$Qh^lk4-sqF~Kf^vO?!09%5GDV>|vH#r(rx`%n95s)&o;YXZG^ zC*gS|)qL^GlSH~;=NvqO!1+qEHIlTG>@hOAuL+79r%t)vTlOn+%R|dinV`yw;%53l zMau6uqF=35H?A28zR0F{W0vWcdOL)cy)R1IAx+~&=3B(+%Z%70lFLmFbMeY(P{3tb z>~nBNL%x(^_o>bf=~yOF)0i9&>FCSj_e-ySczPvq;BgS`d#FW=EkqVhti5qVZ7Y+hy)J>LO|B z=D=;L>|tb(*J*xB!?5}3zK|#knm~c`R9!n{qy{xRH6`^xPWR_1!>hLPcYvAJqu%Jj zg4bG{+kw>AN1kV787saKJs3Ja->}K=7I}(~7D)4x=4JR%Mj}|fn&S3^nhwC+VB`Zv z_njbvG*srMonRHcn^%0DY=EZoRu%A3h_nRu#34%~gP$KJr?~mo(cF9aF=wQ5L~@FW zf|G2Z)Pfrpp=haZUrVGxDbR54CfkQmP;Gn!{qv?t*-JZ$pv(f$X3Ny_aqd%e!Tn!D zfm80**}BThZ|alySVWc(U-kGLq0(|QUUTy;(7KZIwJ9pM(5rRy(w%j~(_$(j(PktB zs=H^Pml1MzePASJ?sQU9kx?2Ptr>e-4^j%%a0p!&CT1VX#EAvTO5m7k@Dl65bB98B zV0q7hgUhUHT8?i)`p<|J= z%{HBwIDM4KMV}7)TSQATGLVHqJ^$kM`dE(+dInUnMevjnkfn&-=&R{G9{q1CZxA=Ky-{yah3@C*;?9eFXYFJ5ALz0&M zH4e~3e?&Ah=GWwXYNN5Q_&n^fx>MjmV)o*Ii^OrAGI!k%Y0N~`I)39{Lll7pM$|cx zr5Wk|4rWG{VqijR!zT}J=kCxK?ygt*+XBo5X;7!nM4Lp$3itQBt z|FP%)9W`~`whI_R2L2Eudx0}L<7sc9*SsI;xRvmYS9B}JCkkdaEOVOpK+wIS`87^h zpES-FOWQp?xr}dIQLSS(x<`0}CGwnsb^t$_y$_yNd&cI6@cBLXRD%?UO%7|>o&smQ zVYX_8$(f&KE?rrCGZgT|b}&HjYbtKNUX4ouf+Hb0UhU5uT<@={@(tpBDzkF+rGEY*I zUZH5FB>r`tT9juVsm%)ebuxHLk4A98A%+ZZ#FfWmPr1HGwPe&KwDUgTxum_%b^1J) z2&k}<$Tq)x4HTqDhd9Y{!nc@sd1MLvj?9A`y`OEdy&o(wbwr`v7rNr>jjc@EQ+{2* zZ08+5>13+{!iZwG`ElL2v;&UvXdhh(;7SRi3nDZ;oSSae<~zH*Zqw--i;@#~0YLz7 z8-jPS;9GYm`>7RUvJW3TCiPbTS@+#_a}Gy|QixeOBtt?=yfqU-76{2?(Ee)ZUYwQ9 z1ofkFhKd+Gj<9g>h$LPQhFb`BDmd!eMi$u_8ibe})q0e-{F5+#|5|#5*;RaZ8zS-% zr+0?EX+B&`GwSwVyK-5uKKTpHSm@+y+qT4di)^D^v_H^&! z_|_z}=$TUT=B(;bnE5>6UgdX`6=w_dWPx{2NqpupnOZ!ES&it^HyW@P>tl}H2t~ys z1=%ZVOZrA$m!7P-;BGe{o_@^}YGyB zRU2|`gq;*X4l=tu-S@rP=^kTei-E5@USu`GRaC3znjEr$Lp*_u5X3_N|Y7AvoG&akQpkK6cQI z(fW<}UeH{9ER}H)P$|jejRkGy3Qg+-<8$j%j`qUEyLJJUW)a3kRZb&sg{?hkn+jC! zm59&C5t{AjIrQ#G1c1iBCprs!l#}3w^1s~^E8DLXgZM1&;f$-h?9mvXA?a_<6#}VE z;tXW2b7DPAdtbf94>&c-Dy}N3ibH4j_diRfzmnE=0zRC)GKN~m6;E2b3cZ>3zOE1T zE?+v>(7N~|+E0yMngS>%aUjq-GNWFJjc+e;>>`ij zlP(PvOJCANWK1a)zi3l4FDD4}Fab%T$$lv9Pw9^+Bet8*0_=jCo<^)OJZR8(7K1uz zkVx86{VBD%oV&{d%z40D_A1HJ*Pj$OFOb6jo$tx`%lxma(o~7AFM!|V;!a;4TYG(Y zfirPeF;n~{eAs(%nlG0@zR%QnSz#=K?V$^FaH`-nENsNDqX)rvxik54%y=rP zn8oqpl*=XI=Umi&hTPiYqGCG^{cLzw#pcfW&*F7`N89zt%m^>-Hg>wv;Eb6I&FLEP z>A#hJCxQz-iFJf(KXnYW4O~Z#euN4b*P;+&(`B}kYvT}A5b@Z+< z(c#5T;PBN5mQ}2+@Zdt6j5b`= zQDQ8;QyegFHbWjK_T0*aZ_Oh3+C6E%m*gU&TjG`d_0+_HVTpQ@5440dju@BCU;P`n zLVID(={g8Oe;$;C;5v`l|K%u#)VLJSeCb)yREBVLb(kSuC6xo5*OOx(JfT2De} zSXs`PR1pZ2`|`u0WS1RBtqe1aJrwrVvG`ev_Fm)e&w|7P#|Dc43`Q26SErc{E>JQd zqn2s4@u1h;(5L-J5NNBYT(C7F{-I(_Jx*#VzoIjc)PqOoL>@lQtd|#DT?*jxV^r^Z zVsTHCGb~ex_*#IlVQ)Xo3G^(f1T`OS)XlcFQl#bq%6K2=F#6Iw$3~M54@JRj?LHr= zEi(Fb3*jk32Oj41$Z@LVjUaQ&;HogsP+_ks5LZ?(&6hm^H^YK@9HsQ{OyV!TL8|(L>$(+ak`7vVI&p0-%95ZBfQ_KX=3KMv~(c$oG!d+T?j1IaQd1P!mH;lt2*uQ?WFxp7n-m*TJ9bGiK#gaIMfKXRpVmWg5`c z*q*Kr#H4sDnTF1ofn?+L8wCqG!;L>jqdg`ztiQhu&;ItNDOGwpmP0y}D$FpSO4?%j zrROiQgsaxUi&kv1AH{Yb2Q%|5MfWPd$?FjVs8koyc4}hsE9Z5XWyeAc!e;wKi~>oS z$s-32adh*AUOl+g69wm!7Y<;c4*WA$ofUpiI zQT3$@+%=nXtxGm>pT6m&g9q;@JEG4ToTuJMrcnXMZ0kBfzXa62;W&_TxM5EJYoen8 zyz6za=(A4Stw)%24{!0Lp#}{*-kz`cV&p($cm!Yh@{#?a^w_i#=epDZO5U1p}{VxF6OL~U1VHR z@V-X3?UBbbA{Dm=pC^~&-h+&H|&eLx7a7~df_65Mp zh(Bw{|CDL@udljO7?sa>T30|ZX`Z}gxzUJ)QaTN7(ba}U1b0N(w&> ziGJ;e(#k~0tm7+ziEt(29F0%%N=VZcTnk$p!4Hs@l4gk`sI|M5eo;_-k~^=QvxOdy ziuoiNx}*q(t22iY?{su@R`A(_SS(gfVBbzR-Y7ZKX$J!eGv3B>oF*lTqzlwJR=`rU zlpY`+jp4Ddl;;mp4C;+^Y|Mb$A*_y7`aVyVLdaldOCY>7OYLdKxo}xUi3t)#AxA-K z7neOlBVYc+Y8QQX$|rq$L}c)9PikI~ea3hZt1R=3T#0wJyj{~47-@=2E^-l|Cz4O?ng<7B|KV<+0=}w_AexDI&eGX(%^S+4@1i7=fKz3tIB+7%o zQn{7;q3=M{Dh+=nmL{@HO4@NXpPszW-<%ECE<0+?2e(w@iot20Ta2D>QPFGAluGkY z6y}q!UeK%?aQXbopXb^1MfU+<@9L%(FO%Y=>jBxxEYh1r+xs&4V=GtF@9)`}?A3E{ zBQp|D!x=dWCtETu-hr<&mhr$^nVF&qOGgz33w!b0uMrMjy0P*rA}LWguDRn{3ar#X zOOm)t&a^P?AJ@!-G#0r^9r8>z@pYPFA8j~_Nev&`X=crX=o#@X0<1}$ITRb3^b&xu z%&gKN$mn2S>d{;N@ZNk=@FOA8SDyt9oRf!!(C-UEv;*tdos?e^y+Jqgvq<*}XvbOT z!(l8r2c=?4S^0U^ulRFCVa4Q&(OyzoV%!K$$Sd05THq4Syn{%Z{+@Q7>eEsEj1dA0 zTDJB=r@8!BV!;5W!0`4;;hbGki|;LLNL%ucbr@`AFJ`J%Ys-&&(w}8M)xn5RqK=gB_q5Y!XU(0U_0R*{k){2%)dP5!4d`gZKIVk4 ze;$j#)(53Vml8Qp|FD@!u`3X_?~H^@ff8f1KUwZM5WT5bH>{aWc_1jqMZ5aSfRaP$ zyXJ?7EjHvipD8|jhGY;R?uVn_zy0qH$bb4oNpsipg4hLYz?zAa=d1nZqYZF_siC!}F**`6?Y(Z}0MtiO>iH13-yWvuhTNK~H zAB=H#v1tDqk=uM2$TOEH?SA4MEsPr9WGh#yV~M?y`uqpDFzKBMW}OJF4d$M!oIu^L z(?KC4-{V(SYd=qZ)PwETCgB)Q(!QpC-5F#i$rssHza#y6mPen)q0xwl630%rY1+Xi z{yAbo1DNFStq$2|k_R`gI7sD~D#p{1FACjeRy}C~jKp`Yznc2i`vt;8Sl+dWj}GtVP z36ML?hpzJAXX5tM1W;CqmW6UavUd7gQUzDai=MDqDEUG7Z2qLHHrK-DIUDLqdorz(pGZ9 zcW1i9cP>1y(%WK`3~34oHBeQrFK~Z}hOfSp87I z4X)USrx{o5f8Lq%(3#BgWYM6IQ`$&BthOB4g^gaX%e80=!!9+vN`&9=TskcG<$c{5 zt^@jb#wzkX=;u#V)_KE$y7sZUg74JmE=$uI=X@!=FxYSHKDf>lYAh{N*cm$QBI9s# zteKyyu1rh)Rgcni3K5a;9A;I8IUVn9rh*LtGtQ* zQpujVdwR8Gf^xom4PQJmDG5*7wi5SVEa9#lMJLJcWU9svH6O038Ch3(^*62ke~f)) zP^9g$BDy0wy6dT| z%F4sFp7F}W!EIG0 zUSut5>Lq1*!+93G>SX%!PD-5pw#DYlg6;UpdJe~FsQ}AJGvK0Qdrh-VDBQasQxij~ zoh#sd={+;X6ObNZQ;*T82W+-_B!yRZ7B_IarbTs=h4p(0p0_F<0|>=j7uvl9YkDsOZxy%SL+U zO00Y_Q0XL_j}gxm&m_Y&{v8f8vS)ZyLjf9iB2+!w>OW@MMIiXtjnQDhXElo}~M))T(2Q>3}JlWSxi%RNyaQO_b; z+UIqi@^m!s=4~BPgO^7BY)xZUuck^gq81IR##Oy;i1zHTt}U&F|9K;dFHzg4KPKJ8 znY}b3vT023T9uxYn0kA<=e=q7X*8Qrj@(^}swyRrTV(`HSQFQMVPGn%NB6Sc?`;lDXTg$_^NfdI&`b5~XsunYNgKcB zTQ~~`w(we0Z_;LQ;gVM=pbYs~0RB1lh^f`mzHuH`Vg1oJeC>4+BIEw5aMyT&(xu4b zLS7L-DH?=lsF0HVWTl~X0LyvTJKp{D!TCqux+(CwrR}fV%>4I)bMqdU>)Glp8&`ZB}Ku^;z-je7fsqIb}m{{Gxq2+xzOA_hHRCR|roHy}6&T))1Zd zmH%xq+C;{4Twy*%Ci{Llr{^&|L&*jE>&^i0H4vgDA^IpQ>xA5I&av^X;LFqa3oU4o z+K+3ukPPSM=0o{{x9D(Uqwxjl>+V)c#jw0_>TUcH?sFy}{v-X;beKdh3BnFnja}@d z+wtn9=NS-_1lTW4;kMuGvtT=FnI3dF6uLd@aaU?cozUb(ng&-|6`Q*NT+vN+iQJNe z3virZK=52W;dQv@n0*Yj-LG-kyaH%+KA#@f3h3T9-5~J1b!$m&e+3OD`psztnjsvY zfsi;&ioO1!FO0ezL3(-ko^1NWW-pd?v?1yE^l!m!dQ5IvcsmbG_jqj?E&E(@YRp!? zEw^|-PfxpQu%%sgXrdVB(Zi8Q-3G{)A%_RfbM)eMs0aQtiu*rJ+<$xZU4munX~haw zIa9NUo?;x#WPOhX!l2u5l_LBs|=Y- z<5u8`tA;mafv}89MZ1#b_)=k&vDfOIw^eCM7DxC#?MV3L<_}KRG0X7C@o1vH*K@vC z?7KstA06`S(MkuP7b8CxT|9O(u08l`w#RawGs)C<1h%c(og3sg$>k}jP(~5R!wIjC zuxhpwwG4*tclO~*Nh7ouTGD8K3L_qr|4yh4T>$wje5|RT2cv#*b#>|URdSBom9k#b zS>R;RJhIVF^u&FN_cbW>j34mp>g~K|*-;#ks!Ft25ifbHUmt1%XW7Pc13KD$sUoLq zFE3%J`(=!%MBC{Muj_r2PSL9x< z<9VbPH1t>=puxfivGh) z|9|6aSkc$l7mVXZUs?WZX47$=rsw%oCW5fVq)Fn*cK~A)qapNH za2ADZ$&4&+!fV?l&E!CLka8Wvl47N?0bWI(i}2Rp?7I!53-r?fcFxPj`F1s2)%kpz zjw&quj}$AYZ@tV0w4dxOOdR3-LqR55(W`4XGNX}Ccx5Ohk4R}JG#vMyU$}t+azEJD z3yIO3tfW6Das5n)?6*R^Cg;g%+!&#wAlut9ncPLhx~RcXya*Z7Ogl*~y;1Z0%|yp| zlt%x_pY6-rN4N*)X-$~RigZ+nImI$^8BE6e_V!h=4mu^%Bk%m!Xi?=glv#P15;b3M zTynD@+riML=1OyMYQB?av#Wuj!G3!ag&;2%%<3{2%bQ23D9Rh2vb`XBvmQ!I!=w(y zY$Y?2%wY1EFY=M?cbsk*r;2?zL|Dgc$>+9-rRX1*m1~^NZG`i=Q{CzYih0?jF6B0c zOs_4xo*Byg=8jV?7sD+1j~K^?Ao25r!R}H5+v%5tZHsG;mbSXKR7%#Aj932Y^73xN zAA&>5#Al`wbz~o(Bq`eF5m1|QJ@=+oVnn8G+;iI*le@!H+6|(e&oldG{?eMb4|mdR=csAW4mg$cQVJv#r!I>Sirr-^jyw0um$wULn>mbb-$Df8iUG#5 zc40D!b}TX*D_(YOk3pykhpdj>weyI|n_1jftQ3hA*yem@&)m$IwYt^sg`NLjqWWeK zZxL#X8G^NFa{-;bP8~zSXj;f4znVtN;;!SSd8tj$`mBn^T1LXFxL{edg7nm2-49m| zHCR}wWG!;nfJFoBjU&^+le7e1m@Wjz8}#NMo6(#Be2zLE_1t!DaXw%5*BT9FEcn;D zwSptxnBAk+i#Gh*&MaMtgtAm0uTf8U8XTopo+npvNXY3X0d{WPqQ|R%(WuZUv8-CL zHj(q~?;f7!4RnR@a=R0pR*G6X44zz`zBPu8Vp6hO_V!B!7Y%FwR~VOAmusb?k$gM( zH%WYXrCEJA^dZXkIs5p>L*-CS1E-waQfO0wLVb#k-o68;uDq_giJ(WY$GA5QJox2&v-wDA#&oT5P!fyNHAkRP#K)hBgquH(k_k6%8AQS);a<%NTNiJuCId+UU z_=mbC^Uhpn!C@DMOC}d~_9n)vVpJAx|J-#!s;o%eVVquNz1*8}`;VnnDF0SO`{|f+B1b{reGHkC_Iur5JAH%7nQ&arv+%I(%ygu#=u*o`PYzFcUd*zWl~;u4j_h z5IwP*I`@@XOhbBuE#KRf%zQpZD?2P%@z|*aZO`zW81Yps885LW4wXG&H=FT7_L7 zF`5SBivBU#8VJ>)CIMm8S)rJ$47Lz>PrW~lAZF3DT$uG5@p#8AgurhM^vTm#W9D`k7s zY?fr^6OG0nlD3U0H8V`IvZB}i)cs>E@RNjq;5VkYm>4YuTN}mqk|{w77MW+PfH;IC zaB&KJdfhMUR!Fus@n-6EbJ3ECiL1BIoTg*!QE=c-?>Yj2I_~sp1E74`bgK#Q#(VBH zAK6NZ7|Z)90Y2cSgN?+w%$Srch`^ptUNc8pImSLdFk6cKEIdzFTzq5_P9xP?b#4=J zWUWo@91+@QaXgh}q(qO?jVZU6+ZXHmqp^a#@@9^p?L1zvmtY6p7Lpwl8yFTS#P{DE z{m5W}XaYp>d6C4Wv2Be^SEYIILkTzr^8<4MK+b3QkO! zKIXhO>7op3LY6M!np*{0y=jw_GGL#9FX`XX9 zO!LYlSt7ODj(&f!=dZ9IJ%odK-d+Ux2v-Y0h;)Emyl24#T*m{-hNV=9$r8HHz2XK| zu#fukapH6DE5RIg`W6rAN%vx|IM6&5SSV{+@Nh5=TEq3nD+pVZf}= zMhXZVsCZc`*`~M6biXJ3?=#EUO?h1i~ zw_eI<4eV^0X{pAMYS}^EBWFm`pjgr?whM0O*ROZYs1-dQ`#!!r`mih}+)ob)+0OlE zL@G--gx!VO2T}C|eNwuxh$vu=UVBB%tse4R)G{|>W1VM#alx+_VI_viLT3j~T z%pPkT5dn}0g9q8@1UP?5lsLxvy@hI#=E?2H>XDl&lk3ou7%r}2{!Li?x1jMO`vDB0 zTAA~s;e%faVILLH)^Xj9goJinVN{@Q6`!UWjV&}8>lZh$ofpzqowztt^koU^=&3{2 zT&0)bu;;l@cD0luVi5CqFV_{%kwfE(0|!zSS&+92{dz#g$AKHSw(7&tZSV6Pu71~O zKpcvt{`HXd`VKb*3C{!aG3!6Qt#4T0|2`E=95~hRUXz$m+-oNx3(8 z2Ox=xR={yVj=<4lA(ITnQ=OH{XDG46JzTZ!)3V^CF;Bx+AZ2x{EZLnv*r|e%QjOK( zO|vz8#w{(&86COM5oS4b8uV(J`s~9KymR_1sr&|wTZiGJ9Qf-BR##5C*lJ_l{g@oI z+dnY@H4M-4+)*1zFOcU-jBCw_%uYsm_BMilS#Jx{L%Cw6@q({`RFSpeW+K!XqEFEoT zE*ewG9Ah^VOUZ1#6z~?jgsf9i=uS=`>Ak$ho4w3Hx(E^BB!_=)?f)p90EP4-{RA3; zbfxaLlJrJzsct*M#L2IQipIpdk0hecNXnM>8xgN$T2k8`X|1xMq>je*#=+&RWvv7+ ziG>rRsrW%vGVP<jIjR5)1x(5nZytqJm<1l)Z_kyCpWjYdqA>MmtT3oq zs@g1JVmO5$(G|Ee!4mDEA{NhzZd_{xX-BKYO&jbOGJNFl0;En zidFb>6M3KgaM;t)4>K91v+23luCPzsxxdzN_)17W?K#^}Pg)b{bOulTL2A}kme2kd z;c=wPiH2xvpeYh7OZ2tQpCMaVe$N=d?k zGQF_pZk65NWz=s-T95q~D4}JrL_X};B;v~^YNh4cB@!4lVc-RN>(oG^V?UIk7^71u zP#b!YWyKDp0-FktddS1oegk`&KYM4#^lQhuVJMANqPqr|7IW_UBTcz3nMH7cFMA!n zTJ*e6>Sw6pbcU~=PxpL`=jc2gvUPuuy@fo=(-}P&0m%j7QwyVmYm1v=xLVy%_j}f@ zI6pSayf2v?(tu23ByoHsWk_>>1S&CAP$kr8vSlG}!hQDO^_*6)F;0YwRB9e~EUlPgdf~E#*wuAk5UoSQ|Bw57KT9PLl zAsW)JzEq_Fl7EZC|0LX<5D=hKAT9SsgkJ6trJMK|&&2!Dd_vcwXC~>1{LY6A(!ngx zAU8Tl?no=3tQ(MalI} z4zA<4y-1Lh71GvHb`6Ye#aGiq{p}t=WcN3{$^OhYk*HmK204%|UUjzwdwB-j90{C1 zfz3FlN(!<(YNYUmJQThWQz3(xh-4F!Z!icPi|4GA4b?G0+|i8l+71)ZbZ zd?wPKo50Z|(&!D?wVLqR!K`T$pTwWwHB0e-Ah9HlcAB-I%ohHM?VT_`Uqe>HW)XbM zLA{+6+k9w0qBaZeXc-D<2=%i#HC4+D*rE*M8ow$fPs|FWB~bd~yqpaBp+xx+;yZnDt1gQ+ zh3S5>cDxuyHB`h}1v)1;*SGH!Ni{{emrgcpj_f^!?e4CLy?I3e!N4a=QWN4al)J@@ z6fX`zDWhn3&!SjSMnyy||H(Mq`p;D|9zF2X&aJ8^(4C#ma*CESSXSONi&lg6hkDI^ zOUct;%T=&T*+RolfT2@I=8xqvvy5EF8wQyO>zS+*=_qgt(M$$1{l>x?cIjH7{N*C_ zkcOXxvdOA|cXV)I*rOy#M6fJ!>pxj%M}{0F&Fj`0Nwn9D4C-5h?060tk>L_K7u(MC z59AuS%s*ir3fgd&o6ao5M}0Y}hiMj8FZq9O#$BnM?E|u2Ux`tgwcm?qeUcMkiX~p1 zjr!Mfqi%bx9Gc0?JulMLsEIRJt%9{#&BI)oX)^|p$f@YJjg1GD{+N@IRQ`~S!mJvE|ImMOP*B?SD{jQ)@XITun(kmsF_ z@a9G!7(Z`46qJ;dN+x{md&i#&Lm75PM)a4EuS+sU9E7a3X8sd0Hu{l$N~+Yd{ZK$j zy-#@wGmdiTY17Sa>UuH{_qoXTA>6Pe-Nxuqohfr?os{$&!9}nT4?Tobf5j|rgrJiT z$!NB^X1WEwYv_DnO953zB(x1dkYGQSovboKQ@jOk|)cr zeT3?d9wQ2Z=+R?(p0cJll8PC#0M3kY80t{M5m6y@{nhd@>g%+r=E*1WEr@-{iEt&P zK{f=kyx5d{)>F@hrnFl*RIaqXWbc>6T_F~Mn()6RzXx>Tub0@rKaQ#dFPi#j7*;W1 z8~sddAEfyDx2rO{ax(IgjO}T&)vG*Rgnilwn&nohvmS}~P;(K(@w&sYgvM~Gif8an zo&KTDdd03x?^hYliYt0Do&OL+O*pam2{moJ>x`7~8`Y7@Q^>rqva)yFvDr}E1BDOr zFLzO)n$N|QFvk3v!HMf^xURwsM^%eZWF&`F4YJnrP~oEJctYF@^whZg(b#Cd$3VHn z=*~#6k(vbY27CQh{p~F1H|sPN%k(iJ_#aIt%t0|BG4+bovcQNh-go`|PaI3#FgRa` zcezJmoL`E}P3lt#Yh`8m65kBUcT?jRrrqM-kX-EQ6+mc=n&CaGu{t4HGG7s{v|Gs+ z_oR}{v_*TJdzNckVjM>%srz?&b>W((y6JHqeM`jCRNNLqQt^xE#WjCPTFk+X+Xq!iqVjsFN-t58O`{02UHz^N z4MmAv@8^`u#O7Gf(0+P#(5iPW@EJ&a}ISdUaO^sU=fC0Zcc=8E-$22#}93{qH(JlQarPZ ztY~#Hrq|vm&%1OR@s)4wT*?z=sZNM{YolugxE}mGCfrP&KUf@Vs!&`{*K)a7VZe@d z@1lM96{Yw7vBJQ2N2~ekJ4mpBJ_0rHF79Ll#@)TU7^M*)Kx6oYmU`D^qik|JHyn3| zvH0xPkEShGU8Xa=BdI3JA1i_tA`09CwZ`OEiIZD}u?o5AJj5BB^v1BwCQv=qQZ0Jy z2h{jJ8|xKz34x(CSti`=HfT86d_Iijei1f&ZV0{)PS+z;Q+FcN8@`O!@!5uv{zB`> z5;M@e6~_Pw7?Jcox`>-A$hX}f8pbB1cv1Vd==3}`rdXDbL4^nu%JFa?`tP&)*hYv? z7NuympHh^#Du9ydEpZUK2{+bbE3MnO%l3n}k5V=`Z({08FKR3AVh!34!CuHMLl75| zKm!pp>GS;@vwf?2(gLK77FZX2HE*dMt*U zI70GDrkbxr{O0!q3LU5irK7LM6f;bi7cj4|GvhN*CdNi_p=lm-{D-J;)hCEG9>9-; z4_HeT&YFp+e&1Ns@i=D5_aLBv7ozE+X8u%ncn)R}&Gt+@bsMqfbk|=z5aMPahY)+l zCy+;q%S~sjIq>y|RCeoA4~T56gbd==`}j>r;2`8s%LrK?RAl|z%U8H`htM+g(C??n zh^*E!$bOAbx*#uAoYO)*m!Ua9{b2h{^J+De{X(9Rfls}@m06$c@eTcnc830?CyGVH zYbTa-3-LO#gYbh2$E|caJ_Vwyhk4s&ftI7<0x!Q{eR?fy~*Ki zsiQ{rEOr#PzfEvXDF%DI4U};rFMDXi{Zp3=^Fx|CgKouUMsZ8WoBk-_P#m$QA5tex z|J-K+8_MWEl`99uHF-5FQ0@SaxEb_bVkGXVd3q&upFk*^z zR~FhP4|S763hK*`acq{~zRxr>bge;17L1iOuo4h;el1m;*lUpKc9cjHSQ>;XrETA? zU`=zlnD5-B{aZpdj}%NDHCbSKnid=1u9;+6j(c~$M&wHSv>g8s0Y8Ae$KNL|uT{F4 zW5F-sG<{l!6Q|2`behTG-c&TR?T;wfysucj1D>>>@I}h+b-b=-V1gInApljoe|qf3 zu?2sR{y^(hzYlr2A>n%=!uzV4p1oM!ayXP5!S=d2r9x|PgK<_svbcYFFCOo4dMvRn z6cyTv&~e(WRX-4j<515N%IK`DvvRYB!BUGdys=6|g4*E&xx=XTrTocRm{HuzMI>j0 z_ayofjKsF#a%v6Z(c*L1yem_5+fIMxvM8&c{V{iJ+3gCA*1!hS{owb#z;@Tr@nH?3 z2U@VbMT#Na`Gxb9Gw7kK{j7lISQ7tYtojnW7#LR^X+v1!x>9HPYGr0l4O$5_l$#1! zQu4+G=jlY}7`x8bp`ge8Y5TI%z8MEMTHLzx z;V9+nGiD#M{2@3~(?s%*KLl;4GH|NnQdM|U2qVoBrEQVI2T`3L2>wGIw(4$;`M>@w z85q#m5p6_d_$T;WAnl0s*3j3*M$ebtgx@QKyzmsVU9pHB6U`aU)^C;iG+sqtk2|{e zg-kMDQ!%_9siWYN`sN~mytj4@am#Xv@IGVXnCy6#n1=;o2L`O|mE3y}3DkX4uLHTh z+)82xU@Qzd0^`&QY4~T0&(runP#7iFwLw*kjZ(-lpQ8h&P}Lcmwcycf^|_lyuS!#D zR&|N)*0Lxi!i+%8rTY9tCx@|@#n&=4hFLuHu$^R?DxsD-l8gGl*3BfIaa&etqpR?X z2-Y3fKU;m@_Wv{7_9Fc2T2ny=+|*OiisnoZn8Vng$7td0U~A{)Kb=czF#0{z!pS5O zD5xt}(<{5_#lk80mpr?*ejL5gcg9I`?Yds=spI0<#+8UiYG>e+sxBY=z$iiMtX+|M zAT6MdcjjUepN|+o2mg7MK1=8FVZCV^pzUcd3o))rQB{Y7xMu0Kw95Or)4NrknDKL- z?Os`h7qZ>X=U_7Fxrv;G#c_r(cP9A4%Cxtx%$~GX1cdgGiJ)1IYCj*NA`^MRq&!t30Poz99*fU#A4-|*avfG|cfB$+L;OBHak$D?A56AnwlX2DlqQSQ1_*LZEnc~WI(78B& zUUD>`M)#1Lx+^XAQW=%{aWLwg2~UKJjEIe9cCas5sSim7_8>c_W?n=hh%FDjzHV27 z>(b^EC8T1t^%!!^`>?>`F$bajabI&<9qo^@JFoNgVAJ`8m23OLr_*#;z0Q_hciXxj zqqWjfd)aKI;&sQ#RG~bXca(T9-EW6TE3&}-&O0SM4{gZ4-W2JetiE2v@ zIk2m{nFsMCa|L598P@U`6w&=WB+>2qIxoWoC@e^@_WZD7+i)FfIkLup`dZ2SJWD9I zj$2Mc1Cv7vl?t^&b|wT6UDDX@-pMhXdL{Vwe-SMt zg?@#pvli2&#y1joOb1fV{YGj4i&avlmuqGn*o9AVG-C*dqz~oe`bjagSx*cF%)!5* zOEy8;X%+dG!Wq*%S*uYD#g_hpbsfsNW33eHmq=L==6oBsn<@dEp89-(4h*Luo;CvZ zpYz!DXBgDzK&vb`sd$ppuezJnNs%&xe{VD-cK?IdVQ& zS=o_P4JcCFs<)62VN^ojB}qpBPd$(&qq=DZFW#zJM0)I8Sg8V5M_pagG#TGH2 z-L>NuTflTZ6i5SZU1S4U#6!jG3ziMscEu!^lPzV zoE_9|20D~rW5`mhkK`SB=?4gDffy0Q)Z@~?8ZXXfbUY8yd(o*Kzi}!eK zXZz{wQo`m3%bz@t=MkvNo2_&UA&k*`sEu(tdB*R2YIl4fM$kfh=g#0r+}VWac>HGFX~ zcS2N9@jbdZk&*dDzN7^CYW$Nl&3$p6_Rr7S`Ji$V7l33g#0^Am=N!ppNUM&q8#cun zb4hAL8s{RnjI(^Ki*?u9jmw95>hTC>R)+3$r-!v{ zmcjR>Fhqr$wyQyL?c*7&8OVK&f%FeYbFSuSx`$yik;h2$RCdzm@mLOeSf@tylI&Sg zgMoeS0=#hxaH&6+)F1T=eT>*=@fH`JMN??@c*!8@23Z`16w;uyRMBMw^VswCx6rM* zxHxB(UIh*To;yS;#OuYh^f_xWtzG~g9C6T}?RA0}EhYNfOnI}gkmL!)AGJDei)%zn zrQyLg%{JTC2y-`hpD13_&RYMPZ~XwRBniu@_dZ82_+u%}6IR@rkQ8SKMZnlD?$Q`b zlJ#mv=h>c$+T^wtWMV9?&Pu{fIlq$nNBbwifa3!+P20}M^)5Itsv5XeWg39)dGr|9 zex^^OX4CyR$|aHgAl8yT>(}nXt^%FsBy?)SkratRRK;1@`&4bgV{)p1h=or-@mADq1A^n7~|@*g4E`9 zI3|DlGo$5w9pdXFJ;pLQF$tT^ILU4IJiFyIjcoG8qaf`B?eoHf_gkvI?f&7FX<;(< zYEIa5rtFW_`aR0PkPzXZ8=sK&QY# zq{ry2EI^|xGNOV2A~pT}?$)YdaxC%R+|~Rv_D-LZvw#>5gO7V{@6VI1_bi*Yaq|@J z`-^V(>yXcP9q+rIp7JYYGoCZ&4h-0U$Q+?O(ZP7AGY~|bIdGvSmqpZNq(j27Sh2qj zZPtV<__M7ms)S6ZU5skURbs{y`YUCxc}d-322`yp<;g)RD}GJ><1yvA8Bcm<$o$e7 z!o6#Kl|rZZ2y!Hp38A*?3r`htnfy9Ow4l&!I0Ad&OBZCq%gk~Y5W=z)S30o>&!Dur z^2C;2RD2;XostW=YVi97oBifd|57OZd#%HBo!k%m3N9?z`FNnjEezmjBr2{ z%nl^Hy_86C|0gOZb*|ralC3NywVR%Hk~q4sl>W(FiAwtJgs$8G2!oV=KljaCJ4^?T zh>nTUoOo`YYvUg)^ECRB_0aoxXas9fNC2bAb;p2LFAnMYsbjhS50=LRekA#k^@s1L zSUvAW(9!x)BD33E3(Fx-PYp#?z*>efDFYXW=$h>VW^~7oc=!8ct6vG{^kA? zf*=}*H4Rta`9Ki6i)NtpY?1RJT&YG+EYb)0M>MFhcI*3HFYo&@T-S=O>PoTeJ49l% zFPX7{5fyoSK64SQ*?{*1fq80L+9M;>rw+RkkY(!oJ7!5I$2LeLxRl4@-r=Rmt=C&N zCe~RZ!_$O-3OSvKvr=A2M(K}`^9t0qwy27OBIx%V*>AKFSnQpgD4d5mG! z4U?U_0Hhh4*X^2sEqZgtKLg+l;w&&|^!WsabFI?Rm)#dn+N2yS%=aC~41}azq1qU| zmaSZ(+2Zl?nh09urS6wD-D_{Z?1b*V!ZF4|kamp*HELHo8Z~%<)~Z&^hSM>Q3*8i*w2UNP%Wdi} zte7xm;TOYQxh*VVdd_-weWvyJIoBu28m`UAJzE=-<1DzX7OV5DmQ7w18C;J&1}tgL zP7l)_$+>(CRX+Tg^M1?f_Q&w^cB%N_0jX*3MZxj`L(+6yXtW9(k7dH{+lq{RW?wRw zl~vKi56(#8U0uHG<4K`K2I$ERK-=5(rpF6gHP7+tF>c%Kjq8wM$vACW`)9=RK2nUT zVhQ(0qAsD(d-zldsD)5ByI5n934F@`V0MfNiY>8U_e|-0HF#hD>jz@$X#yg1Ek!e* zW{<@Ddn|F(g`e5z!EhTdCge+ zBuDQoAeT~PpcRegsGt=|FdOo{a5Np#1{>xVimmJuXIIcmTiH}%DynvDi4vmAJgL=9 z>u$^rr=oUnM!0nRZ{N`KTK+}Y1ObRy3)m5Z)cu`iVB2Nwiy`cqXb}X5sMpC{Y=lx0 z$@or5Bd>>iPgyA^<8+SsGJ#tLL%B#Ox`4>NU#4OEf!=Z^TSDC|9P||LC8O?OzY(d1)rq4E{%HwTWO#0a4#euzd4r z@atv3b&#dRkBTGTR0jP#WCUf4vD|hRv+|~P04{UCpE0>F5FVtL?r=juKrGt%zzVn` zaZFANELi-IWP?eVZ-04`;y8}2KLO793t%ESwB$YXgPiZ=gtSiOhAd{~ps=2}*a=xC z=8g<`i6WZb@M%trzLw!Hb8uapz0}d&LY|bZJ*F{uCn)v>nh5Nf0y{Z@CT9>Jb^zN=hgd$c@=wGC`z>^eRCxfip6DUE~Fj+XjTw@-6(vgYxwUa1b z-LAxSt0qV)qY3w+xLWoAn8{CMAjE4odwH)0nM$GDS3l~~7j@u9E*lKdzIWUE{ z^Cw4fMr~J-;&vKsXRSB;oS$VlTdr#-Pm0T|x&E~a!SR|y82nseTUpLYooL9sU#{~M z9x+m;LU;M&Y1@-sV?6PYwY=^2waL}(cKE9_mkqmX_XY`;?{;E8HFrSCzGBx^3VE2ij%Jk?j~~-)U4XBYN!Tqe^} z2Db)Zd|(C4!n#?q3`y3kzWZMe3m4B_eoWtX25eZBYE6P^!qNvC{s7#9znHjq;%L>C zf;&GWe5ozbFD~C{5`Jgz>0!Y$2my$Ou6ya>Dk3ejfPyjbuL4;X1>)hEPhkW9H289YB?Q;{x*m(ku7BGY` z__i?%xi_i_5W$bYkIP0*7=3+52+^gMAx>(;bzl?g+c?8N3n z4rS?=*3%yd0j&=8oRU$1ferk|pd4L(T}AKIzuUY8G>)#BFJZEMz86-%&9dB0qaXYY zV8P4g=jvtG>daJ=M|ClXo#ip(uhcaN=jo(oi6ybIaId2J%NP3nb)vw{#ePT>s%-=$@@ZYsY;BcH&W6xsez0$SY5MGbrWLiZ%F_KQ@G0g-Gr7@D_@!Z5F zXY0W*mXJ`%z0O;wTp_-4{EU%7ZiQWo?f}*he=87vB5k z^(WvuocS+0H`A`nVxRu#r$!yv>L{%pOk64AHsXv-st=cS{(q$Joc{~ZgRMIro!jfk zdM95Eq9Hkf48c0ZxGQZeK(LO*NqD*s=-kz|3||I%QNcl>Z{MjqFV8xLVpa8CnKq}+ zVgBy>lTuvP9iu&$(A^wY{zTpnCfa9@Ft>uC>H>p){oVWKrx1IYj>`O7g&m>8jr=qb^p~kjfS#X{&I4R<%?-K{5NHO7@{AvOV^jKg8R_(|zP(ktts7hDs3`W+PAa)fEMwu-fFaOzNx$z?M%@x$weYCl}dNn1% zhVUWTuT4}N`8hUFIgQtIB!Z76Wj2E|*`@qnujxxy?DF@JabNUZuCaufI1a1D-Yf!KldM>I_$q zl*4cGd4-^M3;KVC(#(dY@uL|3;Tf(jm93RZWux+QWpZT!wnoP>Qk~({!An4d1aF4A z?2QJ(0|zlOe2+rB4fj6G8*G+hEh+;WAMg%yEWonTU;D4Q89eB7mxS|g#sus+FviBD zOB!HJBKk^nV&w!w!oA|s@Z!ilcFB83f}H=w*gJ(u0yf*4W!tXmvTfT|m(^w4wr$%+ zR+nwtwyiEr{d>=ui+T2$Ik$P48Bb(&?~ zKdXiQb+GXrn{z_rcVL36Ai#Z-x`}%!z4H?LGNs=tsL$cOyL^)Uy?Hu2dcine?_VNB z=enY+5*sd|(SVCU%z$h9>K~OfNb(PZ6`5!H=iH7IE9E@rOQG2JfZr`cq5rGtl8Tw$ zcWT~M-RbDjhOqDF5r_9b-MsIloi7zOSkYj?$rw!BQMZY2VTAaMen+ky-T(g_lz=^0 z_5K4Sf8@wJkUdBr8WUS$sk;21(E(N{{em10^77Ars##PPd-wTxABoErOCZ&~kO$TE%SA8x z@d2P&Q8F5DJ5JEi(UHiU1*J1Jnz#RFsPxW*lH6QdnEBgP&%|IXj1ngJwr>{9CJN&Y zz0A%)ALw%4n-y4KP<0^YOgbjA_GJi(WF7>Ce=k;$D1?5%!Cz_rN)H^>JjfC}EM80s zXJo7%U{@GVDfPM#&jFdh0##%LD(8iBK!!e34$#>Nn^|HfU1JbiY_n| z%0WKLC(9*`-~GSpo+L1W)Sz2#k@zKpV<_5*Z*d$9n?X6nCx&<|Hohi z0!(8gN{^H#AA6_)rA3}rjvh`F!Rc*L4@5My+CD5KE-551`Y^8$IPFXk1$n3BT85L} zmh+HPs)8KO5LNem{Ju_jN%iZR+|Fwqh^<1;*G5N6k9q0GaH87*ekkD>W z`_<1;q*Qhy_gb-Ha+8Vs*F#spNTcpG=Qn}p^m-1B8=Tqmvw25e3;4!_Yz}d|Cqep1Nw>u zOZ2Lqjow@8it)w$d!g5}{I)(GuirTMNZ#F_GR&w99X2K1>+oi0%H|Z(`up_|<(Q8D z6PMbrU2h9s4E@oc<=WhQVV0PHwuhKju@uMHQTAIwSCMK8opeTx@gYy_x z+tKjGhKPd#|9f=j^c@DWx=>kU&s`f0JTDxM<)okAOkFS}IJW5kqx}3K3*o=ZCBiQC z*i1GwT0>;B@dMI9mXS#FAN0f{Q`43sEsE1LO|I|PMBc(d*JmZ-mf(;N z2d&Z-Qq{CMWt zpB+5~OeY)T^GX8O1y5;R=noV^nB$JVzPXmoDcYwR}m0f-3U7nAGYPLad4A`P1p zb1Lthtg8F<(D(I&0K8U{{cYfAG)KZv64@%wipA)EG2uWwp?rzc?Sj_iXi?P`oUL8ng&Jy{ zE%A(ka_~fEK?)OX=JC={I^k)G%|)9bHl|;5ZSb-)${p9WplslRwPdZyVWp?aIZxF+$+-7(XJSCNZJ9yO9nn(y?a%-*=ST|8L@v{G zAOng%&jkRS69iIih^@MJ3`_Wy2v`g7m~YD4)ZD@*gLO$p%0lG;FHkl5V4Z*=!>=Te^v>C_*ASr4nrYS<}0eILc9rzzO&kIt5|S{k#^ zra4epm8Jo;D7%lYJos32a%v=GFddR)>Abi&(mA%w>$5Y9?$XY2^3s2c!w6Ex@7pi@ z|3aNq4vE(|^>O0Be*a$nMFhr(ZwN>WgFyU-XHx|V85Lw?do3rLg%H^F#}gGK5JaP- zB(e1$)Vc8PX9%K=W41MP?MD^Y2$Mo4N{B~EKDcCKMW{A^Z5VZ6Aw)}cCDOu5Y`S&Q zYit~Y6jvAGOnQlxMETqDtvP2^742h66jOs_u}dF6L(#qmVx;pvpJ3AVxJ#Bs&?%aZ zge=V94y{@Z=Tz}fPfhC+{4aG`FeT9Nl%GVRINUQZDz1~c8i}nz%Uo^&dXe^1*uFkT zoQeJuIk!+{*Hd`t$GtH?uHp=-MY>?e1O{0h?nyNmxoEM7)=dq@BYpA?Ke|tO|OZe@|82zFfeRU=6`8J?%pIs7UXNS zm=|ChTwuAuuu?aY^2?~u7X6#QN(+gjVS>Gu&d9`+8kVYMo@db!s8{jWe>wcX;6`1q zR_XGbP*jgsRoGFIjnff!&5mZlnmS{GY774F&%rh85WX=U7icTRxUcagIwULGBAx*)GqS z*=oovyEC30Ercpc!4>)b%0%8S^|N?jIC0=8XR@ko+D zoE}x;)=#EVbG$VeRDWFTp;3JwEWU@d7LHfY7CH-%hPuTTGf{SbAGt$XYGrRmufYWz z`gB-1WFh2wu$QAu%4B(>=GN`+DKmCBJ>5@Q-14D^9Ye2q5N5eI8X%6}7~T_v{wh8; z(&E5>4!s%pro$<4K7jF{o|W45Jk>H!IOHG?>T#>y+Lhw}L$0M-%)DcIGK_@hMkW_g zSyIj~LZmQ;CjWtff4rtzwdOzB_Ib{?mEEv7S+Gv_4;j{{yER&heOANHq{g6M!t{xC z6vXZd?2B%NgtQSo+AlIO@c|okN4GC^`#8o=iHU-NdRZqV#{G5q{o@%x0s^Kvd;J{k z2RyQf5hSk5qR*8*Pi3Cdy$N<>(=znIh#S+Oz<&itCdSL55skGo5WbPF51581z#_5> z;p$5X4;%a%_}yuvIy5|XPwl*g5bdS}_oJqRWbo8u96t3qN+5v)P&cBkCK{ou4az9h zxuxv>iD~QxLS;f8#K$W$U9big$V9KoU&=Y)9QF{-5XO^mYEEI>mJUQ^%(F3g$&qC} z6H=D>Lv$q1tRBS{U6mXe?|wmrOGbnICcoVmr3`>HO2ZWoXKF;A0x6vMiwR@?uRjra zp+lSjPpTl8owvO=Zf}DP&grbG`Hw$%VUKI?`3!;=udiWwDBZMA>OsG)q{78 zKy@@By%KB4Vfwv`qpcM!9h=47D{2+s`2XTJo3`O2TgMh~_{}D;tjnt;9F=DEI>sJ^ zD~uY^#fHB#{Zat`@4dP?6s^s`CHutn<1m!Qm;vG&Z5jL%ExN}a(RjUbwgR(Z8LCdT>0o%$vQ!r#9!9YqcQqc11pPL%RT@5 zgXQ&)u&$e%h>+pyW<=WFP6YFj>lpAl=Bwlpw-=7Ws<3FYww98Qu+)}3>kO009#Cl+ zK7fmbKI&o`$hYPn^*EUr+AWmOE6H`dC0*MSeguF}*WavIM>q?q>}sBKgR^idl69ege_Sw~L@%wr zR#nNJxm;HkWhp`_UM5(g*~7411aB@$Lk@q>sIusL-l@;^{HC5H_)ZwT?O*kj3qefH zxj$`}3EkYenKY`8e+B*=U>ZIO+cEC5A8?9W{TJai>x}q}@V+-F%ooSa7g*BI$nD;V zg`IqpofTHtXU#RB%YjFT*Yq1p)j+!6HH+GOe{17p9Xj`R@((Amoe@<76%wT=v`}Z* z4?}Gn^K)Y8P%_;>Oa#2%W5QHb@najBuCuz%Fx-)+=0{Ox*KhYV99cb54Jt~~@gldr z0=6k?)MU2M^y`tZYvb~G*6(E!r z^(V)w(_=T4j`+K1rwXnldw;zGMX7{F`rAf#?Dtx=YMed`3iYCg8S?~;A4)s^eUf?) zGe{u{+0O2HQ0V{+1)(~T)n+sp112S(!x9N1-nfYST&i3RbFvJ~Y-MngZ)5w+jXI2y z@98;}e>*04!Ye}eZxlB0j1U%tInLKSrSkkwB0rRWX9Lf(3Ffxuz3N!zy_-jWxdzN7 zgnp3Dwm1YEgxRh@yI|Ub#*e9idSsuI1`6oxFy-``4ult@bz{h-K zMaO?jWI$le$l`~VsLMnyYX)O;v4==epwnTa$zJ3dGk=W-3KG*AD~$0InmE9;V@c^K z10UEshWM_FV?0!x0}oTR*@FliBk)hfdYluAlWi2^wcd*8M-NlN!5Y0brrE;q^@<x7>Y%1^aNxpt($)k6PDQ!n%%dcVqsdQ z=aD7DH;d@r@ScrSsv5nv^K|2;zV+oMFs0#47t7PuhyT;mh%Vc6{B)20@|m#w3!?0-MQFl?{ZU zkHbpgt}mg+v#4YWm!l*XOUgW2D238I;()1ts=v;KAA!NYc2NXqnkc31z0bVDDaPx! zjQ><0(+LGoqp&uY+hlDeUDRbNTcy@)_#W!IEQLg_MFISHfILbU{De6U|=hKEctqRu~Z_EdUh!4(32BH*eO| zsrnwD9*J4a|N0mkTt7-PdKci3&55p@qU;%b_q{n)^s>A)}ba{C`+H~|un0Y?%; z5@jAMm14WYxOFECWicLcJP~m6$`1gbsLd(5Qz4Sp7?*+B2 zlK7aZq!}M(V{qAfht;Rb(`W5#<*F90yTzngQ73+eKuM+4ExkZHi*7~$=#zi~}=eecZ*GFzCPtOK-xz5Dd^9lUYM<&_9WU2gk zCq?-MRJo5HuL_wV&itpl@FLPgtmKr_bIF7bq`H;_+U$0H9bKv?Vr@1PpwUSXbD;Kv z_*gi?DlLZq_TDK26WzY~WM*{`q`s$R&XZEZ@P$ zi?|}xT{v>Bgn&GoCHh6kC05H?g>G7c$nhYGH$cCi}5~m zOUvt)W%+QCXCy5n4=n>C?nA$N6fFTgCcXtVKn*T6$G=;K7n<4GTb7?=_0&`VNtRAz z*lirk;4F+4txHKr31684(*Me3qH?b7=JVCmtl|N6fMRe(aBD64PQog(@L_NQEnl6fPluoC%Z-PU91NG2Frpb< zR`i;T$JbD6IH;)}DCF*^6%&USN%JvWh#?2~Tmh@~kqt+7=cV`A3lVC!gD1{75;c<& zRlkO72oEptPcxoIP7Y2YydZl}M;b1L9DuZBX!5nB)5*%q6A$q*2znwefNw5ZFy(WP zu{1R~dE_>!4kR2%YlZ|#-lu~yiT9;a`9ykRa(`Si zj`Kuk%QfX}o7k-vDcZFuio9e)j)3s|1~ki|1lwk9PjvDaw-g(u;@?;jhj+9yLMg2H zzV9Mk>_2BMj%<~X+0;~_z-S{p8n}rPj<^(X5KG4%1a+5@6oik>AuH}$vJ`F`4zw{+ z+6~GF#dX$$8Fm^wEMhXc2Qfu8K=Wrw1`Sn8L$dwOivY6+?%@DVBy(DCRJ7e8NR)Hr z&8WiJeE0X!ooRpFzkEmw>Lwg@gOJ^d^wvuNd^sVy2fo`7b14{~WQAMy*GZ&7LQD1x55A5N+jR|tFC>Rv)XR4M*e#R*m#{7 zV7K(QZSClV<{_whg6kqAqJL_hUSRpnjZQa!H8XNW!r`IFI$H+^QM9zQ=<<8Bq_9M@ z!*)ryOF`jK&w8FRYsjq$M~ka%ysBRwujHw|@|Hb-oa5#_X>f}FqrPRs)-OKnQJ8?z zUZjBHG34FeTqy7EH~;NXo%gHEJQ@p5X5#&TUh9E~(^h)h`$=Sbbzt_wA|;CRw4He@ z?+sL;4+qnM@owWbIAx|4LjF6;!h&TP`y0`UgJmpR|M05G({4aS7Z$Tbj#`%i$}=dF zIwy!id4eH-A~~>}5WcuvVjlyOP&dO0Cn$@fxS5HJgks}9#7`-^C!`%QB{?)E5$>VnVd)odA*6X^rajleTk*tD* zFw@KLLHF`N7zi7$i%uN1sLV!M80L~{p+AA+6R|;wh!=%ZWpJhu0LGfuDZo~IoP5nx z0k_HPU*14aTyKqu36sqbk=-6jka=n?v8E%vW@)L?Kw@Rn$`Yvv8-J)&_QVHQ)dpX} zU8h^ChL9R!)T0JlDZ`p?b9Gk+lQnv+6iTxyo7l|!T3t1zvvIFrFv@R|F72(>Lu#pk z@`9;?xFI=y!GnsS6w6{?a13-20lp~Xa2peM_l`H;lNp3G=*!;P?wVNq7= zuiqULP4q5gA)Ni1XEH+A`KM*aFm6r#S|B$US%q^}c?<*r|3WtWC z{5Lo7bw&iJuLyJ)MIfA+YZ8j4aQBxQnVql)U{|kbVX*TSc|;!V8=YysuJ+z@{X)Qg zB8XZRW-_!0A*=!OSwylcG1Xch^kKa9>(tte{)r_svRSuw^{GT|Sf1(`>THmJTi|uk z$KzJjDO9E`g=DKD3zd_VN+DL@{L6DGqP>i?Fwc!(<G`o`TdYZf6paLbV z6Ci^;m;9l_=AweXd$cGOdru8P@jvv6`a(j%(a- z{wpZ^rAlqjQ;y&#_RWg0d0UnFp9cRw$iKIgME^-gfRyhn7f;vSy3?}-TEyJpB__FS z@>4Kio~Tsi_U1G#!h15N1^SyQ9e+Mz27f75js#o2XV9lIe z5xu1e^IgPwxbG-hX068=xnqa)NAU3)H{8@0`Rki7-I|>NXbwwyDe~?78)s(=n z3tPjV3mFM7mhov*Lvu_n-5hgFJO-hsf*(ngYdCTc!YK>xEEwE>o|illuElRgj_gXg z7oc27-XG6{zZD#|3(T8CjyQuO*3Ykckoc8LYpVRH0c(KNP!pNNHAjX~JEznR+p6Xa zn;L+SV``So1wF^o^U)7OlBP+i1#C^6F8mrN~DDaqMQIk?=A0l57z< zBz}fF+`6tNyWa+4P1zL?7$KmerB)@aoj}4gtk7EGb6Sd1IHi7O-7+)YNazBCT!B7L z$c7MZQ0c)b)9=T}tjTSTZtbO|3{!*;NMVCP<{b7}7p7Yg%`hs8CPUB2+)58EoCCmX z9ETkPx52L&9;DwYIS#u{h19b7vXwx%B+ej6nWQ4^R^pebF>WZR1J@A$*SicM;2R9g z*fCKw$=XB)XFaJ8E8o})l?`|WE%aA)xjtXh0{w1urKlvX@UDymH3x#xi%|p;yhQZP1wGT>9s-G}euRI#2W`VANGVU5~I$u-M_PGHg-Y}|e#y52m zDs3Iyb&pkAiFrM8-GUG7oHUmf?9rq=B0f8vrYs`T))oAJ#ael7kqyEsJ}DAWx@(1@ z3h4#y1>KPr0&?(qbgmHB+K44foD|cA2)yZt+jZ6t8lXjm{6!P&AQT`Ojda+;3xQW! zhZIIwR#}OyRwtANOIiY&_htMZ&1cMzw@6P`4bOeJEI9bKNv&?=;-Vp62)JE$)~pPBZ`s#N!cGbHIr8%>+f$k*~k7+zF4B*tzr zx?+e`-fE(WYncYGPg(I6PMH6hft1S*%g$tEcZM{FQ)@zY%gVSTRMR%6y7}L*Z+Y9H zMtd*ki(-KI5w!{-@C!tji<)!CJieBOS}6$DN?hUt1u691J1HP*AgK>1VQ<>b_(M9L zC$Y`)^xTU!qd8N+qXu-937uf#I7wTau^h6CUDVZwjCrL*SBPSvW9Of-PJ~+J zL(z&nI>n-AjnYoKjyq9j1gI54Z+R7C7u`)tOUMKKk&7OVP9rL~Lc^aq==ZC~L5QOT zy9BYPg7~QsV=L2GKs?E7=KGNX2dg5mqV#&tM_5YHlbd7HOfAKP zG>ow$5h$r}D4L#OC9x={YUfq&C;ur{y&A@nN`LG?rd=tcnU3OHati zCBR8);?!E2)p}ldc9gUwsWHwp9>oGg-fe6)T>jY8~fv z{98d0Q(g`eZloIvp=0|BlbASc{voqstzyH zV<`?#MR-SXBF;Xdh0F#4i|m4IXkIoqtqlHFiucr=T|MK?FXh2^9CDg#_C1J=~;jM z!OQznB*WK4TJ8IwT%v4($6XeK4&}+YyoI!1r2vT#d7D+}lf7heysbv^TDLXUh;?RQ zH9=!*)`V%&m*_A*JIun6PgSCtR2@sIQ_9%$vJ{u*APLqlrOm!BEyK`y%1&$9s}f@~ zF%DRW=*HO9C*s5*%!&eR4)O+L{n8(|Q0hFZYBNEb`K+B`I`i?ZX*f0wwDe$T^+fwVr?vfljc>E8Gmu8|%bOCG!M{S2; z*x!mlQ)2&c1XcS?5n#n)%Y0fMQ6=H(a6|n{=|WiZm8$C{Y;YtA=YGg5YBdeERJY43 z^#xn;J*0f;*(Nq%X($jBM-0+(BD2LUqQx_mIjNuDbPc|S6n9?-*9Z;nUM6gE1Qn&J zMi`{=eilDeGXVyvf+jP)T-gyoVa5bb%ulVkl1{$(vRvP1+I<-_!j&{7mT&wsM63)tvw>dNs5fxfzvIL{QE`6wdb+<9&PFmj~g_Twmcy>TdP}cq>5GhSUaQ6oJgI} zmJ*+E9de)FXeHRQm{L(V0m3(fmmSE9gxc2k4F7{}F5P=KLp&c65$vza#!3y<&5OuL zVy&9xv>L!?S9Qy}`o>T9P*VkKi7Y2Fl+j2M6xL`IA|f^RN#vby%kcTSVR;!_2{&r- zQ%am9n{?`NyY6zj$;emh~7K(t_H%HqNsr@(W0z`=Qq9_pSJ##N@cr*veG0KVEvnYZH zDj!UPbgSJC^A4g)L4-(Mi!T}wpp081T-XL^a=QSw2uGn1#mpV~@wE`D>_wOqHME& zYv^sP8kNbtxQsaBGEPvU;AwByI3vO)MZ}NQQ5{7qx+ox0Y zV-2W?NY%+4czdwn4b237f~Y0N%+D!z6Dyj~q&~(!sx%*q7}sF!bmT%=JX_P5lF0gU5$5#f>uu&Y;`x{hKKM8fk5 zI96BYcv9KvZ!y7=s5p|uLP`K~5+@OaKQs^`y-ibp6bA`T7(fZOAdn_P3C@G%C$X!P zpVI-8LuNpfN|8J;z9ZbTjK%aKLVjJ61+Nwq8`?Q__FqUqR%|RM5ab%IS00cXr;in2 zrGp~Qj=&m(SHeOF{2Tw~!iJSL%|zIYrUNe3OWe<)X##6f{NSyHcXZAypFyOgj>UH; zJ$Qx3+P8pQG$0hJN`4-me=`arA6Q5$A|@F3CR;J8;p9M20+)7zBdq#`$;eTU1L7ql z4@Ah_EfTXjlBA3$gpD%chaw2e$|w3^B=`!t7ZfO?ri9K2+g`?VrZn0oknka9dqTG>dUg;o%$e15et8nvG*S{K`M7a9^rZgtup)g4 zct}QM;Ub-N9ZXiL21o`^70uL?r=iJkiQJblt3gFv3_yr7zbwl=tnSINf-SD#Mz{`- zhSorX6U!JquG!%;>vbKw#Vl_G1T`xR`4CWPe)?A^t2#&4@Zh}cxaSS%;IX7eXL5_~*r_sx#O2!3Vvx%yGhOV>@scDac7p4aGY693##x#ea? zZEbDSG+H?66pRsSiqS~fZX3lPVfow873r`vhoa}%^h-(xrwJ>&!*2Sm)aAlJ}2EnGBz zx%%$@!twpjQxIi=p67b#lDUkiVO*@&*_2WiaE55aJhdS;KNPgdIx!39P z5^;&u`k7yYYTTq_#rX=Z2zS`nNRVFw!0BPSLS^`+%tw%kTAmEvx@+WGZv&Jfb#C93 zWcdy$%&%nCoSxI`IunA*XrK zI=J1euh3-bSDt@BT)raXx7O(H|I-3H4#DAf*c`}#|40q=LJpCcH<$u#kh(&@vTN$@ zuLxm8gA(g>b1)<_9!3}v-nN$lj&obC3^DiQPIOp{Odm~LBb#7mp@=!8MaJe7H=UsD zh1g#of*GT|qth#U!IF;?iTn71>5i(UrV|Glz)|XOz$NlQ0k#7*Vx91lVb`9c(|9{D z^8BA@!isy)U`iOP0h0IqY;BZ&8nn3F7&O(h&{Qd$UrjOa3fA?`1GvgKtp?u7!EnFN zgQ)uKpftdcFP9h(5p#gd3Qn@ED*35G6ONZ4C`kwK^VPfQ?PVFF z$NWK}kg(3jHuxH>-4jkv(J&XW?* zjmbg#!%~5h3#V)HS7oD|$a2|0QltC*k4=*Dr#^SZiUb4Z-RC5|G)BsWSD{9}VwhV@ z=uP3up%Lif5UXf3=XmOqF`L4@Yo?XCc21mH?)$DFhsxzwO7$4Is8G$+{`GYhDphrq zE^&cn@i4_)Yp#r*=aVUK4e$#Sn`;102p{wGx>V4ptUD-VXR7sp) zeB5}w|7E3m$hTSi6T-_tK$bIZxfuk^*@+4*vsX8%+ohx95`~$xfePtqzC*4%Wx2*? z3Z&+5K`$SQf=JCW;+Fhvf7tF~RuL|0P7|iGJe zfm6H>5Zh9^YAaQrap6x-%-1pKWkx}7m-!N;)Pa&x(%l!HIKp;bL0>MkNt$^ z0S&WJ7!M6F&l3H0uZ=2Fn4KkDh-1?xfp(wN$ql&0{wQWXsuam3v;+Y@yT1Mp2~J(L}>Q<5Z^duXGS>O}`L* zun1@VtpTc~yG=RQUdf$ILq~TaNE#l=d@`vTdN+QZ;!PoJVGY&s2jzf41CWkSrciMxcz z)IT~lckvaQ4(2yDw%lvNZ%k+CaT_Y+$6^03Ez85F;%mYER`cPu$o#{<S8!4@4X}G)|6A zI5OLL?<0j{vy6@Pd+k={`!69QK6r+}W&jz*FjykvzWxmE~~$nmb~f5VUJ(q)3yz>xq`N1pYSs$6E_E6mObb; z+QJS|?xF8jj(+wAP`6N zhohBr<>Pbd=JWMPb7+XC%Pe(yyXmX!+cPVec9S6;9n0@zcRCz)ua~6NUm}09^%N_{ z`!(2ks5Waeix?e^^B& zFRb`}8X0^87_MCseb>ldN~#l2(EX}^R3**Fg~X1Hln`|W8$KQXZeIIA`{O6psbDd! z)DE47;R1t-oi&L^Bb8us$yJOZcDDlm(r&X{aBSV_zc}XXO+d(Ha*#EERgJ8#Iou-j zhk!>WM%BS(#f64<=NBTjt)eEp)+YzCCuh@^fUHd0Q-LI7`-t0Bt{@dF`I9=}{2GuE z@V0$bKAO|M$7p01Dgh0-qq9_F?Kn4Q*U{>>W;NYMlCsUtryXolxr7vA@%9{PYU$>N z>Zz^m6On+cb8QB$lB`BjP<{m~P-z!6LtRp-LClfTIwv~(jgvCem$)lZ-x(koIGO-E zDn#n1h~t=dTR7L+1#xGeQkce4)t@E{vR9v%oG7CsCtN_}Z| zz56DM1&T4vWP*g}N0OOnP8YB&cjO+_nrv149_JT1M4%x93X~OeIaWe4;sRDhD1G}g zkGK!#BFdH*tE}I)oY#*BnI)x~Y(;+&1_xxDmHp0~{NBjm_2(9vC-|Mm^3OzMabpBC zx!cs(Jd-p!9?IOhZI>^mq%qbS2svoP$7E!(2)w1OVIESxsx_NDlWaE}?ERU%#;VJ% zeL`vYolc&|B`T%(9;=zpK?gXbHIJrwu9G7e31&%^j2i4R3(;oCC(~;)TA}8QY?c_7 zCp!!P>d^aOJfag8?ZTQ5_?&@IT(5va6@N+L8u{7r_Y@3P$akt1XDrxx1 z!=lqEI}e&Z6IoTA{Q^+~)^z*AhkZ0Mys-o7gYNh1jW(w;*7q2&$iRS#L8*;$o z2rDK^DD+Zu#JOtoSiR({4y^&hwyV;u5eQ@!Tq4p#kMbC(7X;P>-I^!~u_!ykUzNM? zgH#|N8Mg}`xbh!Ml8!@!k*oy)lxy**N z6dEaQH&oMD;*>seY{JOs(#ydVXv`t=2DfCpu#7<|QK#nKdtVC#+w2T$xVV|3$Oq*O z`e@2#e6-g3lG#3gl&+?7V-FG3hIkUZHaH@P07%p#gi76s2YY?FPN3{JZAI8ra!cze zc0-d#3*_{%pHq?y(fQOjWviU?4qrX#^7DL(qA?8Mnopnqe6CfM%JO>?gn^%q63qk@ zB6WKdza%pjW&EN{~g*sS`6au}cBX`3On%lzE;bo2ax^2Kd*KNlE&lA#$v$GNO8 z5oQ3shg0=Fk%hP#I?sd7Hi{|UbiCPdrKHr|h%+v?l!nLo1@-OD{fD&AmGCu@k!gaB z9qkS0nd54np4yriu0N9OtO%Ekfc@U`3q8-f4u8v0zPW)lnciPgP8$02}v0PEvP&8A0j)OK=j3KY6p4rZ>{qhbx!Uh zwGz*x*N2K%S7|*@7lfao(HI&{e@0AuUqBkz5LtW61c$YY13^Y`z!CIA%R9B4o5u}z zXa1Z?U`Jf8Ufn|aoL%XM4MF=ULX%T5Z}duQ;#SAxaGVd8z>?3To4av#>yGGx1B(^0 z3RjX$Q*KkPO}h=Q%nDM>!b>;$GTj0pZ)ixfHu=U6p~!&Gam&~Y2nCBK7zVIN0)@Cg zLTm#GVAr#X+F?1<8xIpVlK+yYIYU)SA)*bMF*dKg zUT(p0kJ5kzCgfOcB>#ir>4kImWQIB!8AVY}c6}iQ2j20VzLWRygKUEKZ zlsUzib=KPd3lIg{YxDQA^Z-NFd_94n<9rtdV49BWXi_jDcXPV;&*nRsaX+fq{i8sm zZ3D|D{B>VfPtVo&CVw;zRv@rbnz-E3?D;0KtvPcZuso})3iIoWg_%B4>q_%|dc;-0 zeWMb-6&~y=F%AK3mvC&}wA1L{qzOwH!4JZ(|79V*ZDSgrgTe0}cjKr%_PGI9VAIAG z*XFOuJPL6!RDy~&5VbeTEY{E_Bdi@+#nvXO_rcbR)J(4HdDwBD_i^A?`5p>22SS1H z|1DenzZ8c58lDvd19lo?{!#orZ*YayL}_9-^W$4dxnFR#c3pv}&i4z#+m{JSaj<0@ zl~TkiY&Pkcn^E8S&ez&jNN4-yQsmjxS4z^3VU)SwSJ*X>>vY%rB(OGV^xpA(8zl2} zeKbOsfzhTk3zgV?c<%Qu{f!DnUeJ_`?u$k7WU5%{nGU2Cboo%r`JT!^d*UeYx=DBP zxG3M|Y&g^R#lFzQIw7$7-7@pp3i!Q2^Kf=EAKCosQkL&MdI#KKlOm2UfTw~L;8VQblGptlEt4vj z&Lzd`1ojV~W9w~pW*Hk_t6iZQ9X`rO@e&#yq#44N{R$nGW9OEYwCz)70uu2$lhG}B zVO#IUZt-Qg?rk-#g@3C0T#D{bAjwFa@yHz0+GsRHG=mAzx0g}8^+Kc)Ck{Mr7yn|K zy5oWM`-T2@yF1003!SX~e*TGWA;CVaOY(DN3FJr3O4Z86=jZ38k1}BhvP8;qtu762 zAv+S*+_m)vz~=Mcld}eO3Z>s}0Ho{Xst}hnrH3!V6&AiP^!OXqcm?Yehch@fDR%{) zj8HBtRX7CpxLwbu>k?wks}#-B#_3$q4DW-iJ+Axi>E&fM(;tYp*jNOuxrp-&UYoZu zchzs!-wOqSg+OLYRI$_*UrS3Bb8c1=bw;F;MypmqmOv(kOw$o``XdKMopgJ8 zDsWwgtn46SDB+ck3S9v?DBaVS`;#S`+%*tGq=4RYo9^ za5N*2S@7M+y8=KP1p!BRyHM*wGs-2^1<%hZGnU&zo=X#YxCmj=C6@Z%U&>=_Hc5t@ zp;5wV@(ysM-3joXK+MFc$=y5Ep7gG#1`M3AGw~ye3M3FCW`Pl8?H8$my>2pk`b}x! z8?*3_kS;bvs?uyWm# zXZL5AVo0a)V0SP_9YlZPmstc^1^K9}N0tsa%$5SQX$@iqL08!8g&aAZmx*MbDcjwS z`bJ@rV-U*uvc*H$-wGYl^u8iPf7{{w z>c0NDFbgFpl%y)mINdyQvqgl;)V#3cz8?HmG?LBcI5MuQ!v|L}HhiG%2wteHab&$0@X0)W&B>$6a>4oclm4S zP>2eJYE;QI7!imq19Bp6|JO+Qfo8hh9wQ~9;^C+=h)RtYT)EzEA+%KLpCet;;Qtq0 z@7SDa)P8x#HafO#+qSLl*tYF-Y}>hFTOHfBZ9KW3`p?u%)jc2JtlF>6WAC+oYaKJP zh&h*HWhmxp+fX;ZDY+Y=!X!43NT5KYxj7ZK=sWVa(CWY?!6EO_wfM*+|8c`@0#r&@ z!L(4+D*lMt@ekJVXgff!JBD9UXJJK$A;M@4S|EQVIJqDZ6|cnUE|<`VUQtTn82L|3 zi`fi-`@+wQqWXKyGCt))7cgXCA`d$Ch_^LclHceJB^(ZMD9+tDNNimI_O#(4i4%Ktwl>i-Oo|E*c;v%-uDw@5Ou zgU_JlF(4HpEp@yiaClklp+3~XR(2AC4&IYdI2H%0jxr&MaZN&Q;8Eh4^ND_qGUr#L_wm;jw8Jf9w7qHB- z0=0QuaKxz^&flHv=1wS->3&LN9X;lt}3!nP(0Lx z(DB%5!K{+9wGU94up!YCl387*>BGvrH%)~-W*VI#FUzhuPR5(~&g}UP8PsIFslsOi1qk}=c3ebS6yFPVrnGnypk}^~yd8JmAI;ichs0oEJ`$*a z1a=FD6YNk=J+idA6~a1=9M0VQp1(&)cp%zwZpQIV=A&x~vf#`hhXhpwq z0{m<5-`8Dqy4h5}-pKqkZ3}m)4k%YRWiw%LsRFtPy1aQ@G|fSV4C&H} zQKxWN9JV;Mf=J-Zv=rl(HkwMhXEBxn9#Snku2y^|KbNOGUMB!s-r@^e6S$hz^TSF( z2}L%i8&0Mk4p@|eCqSvac%ZiINPk>-YXY{1az*wiUV6i!!y=0VS~KR)@(oPM zKoJn;Fw^`8!I=DApm0#QaLOQas6J=7#TYf81$lfL_UwafQ zdfSU?6%n1cgW>e?Sd^ndHjs<0h|`v$hJvYL!{Hjj1n^eY7m@+p84U{VGuNTPA$qq~ zH%-#QB9;inB90cl(VTcnvXN4fxm~(oR zs6i+BMFg;aoR#^Bmzr}Mu*v}3_}k8Vo4eUKY7)J$t@>cTX%uwtYo>dOZ5-L0g}aR9 z^?7g0d2+>neZM~2dHf4p#`zNp{=`F82NNr6KM#oy?hHY%O;ntioE6%2REnYmi$0#U zjIY7rQ{}7s@92ve^uQA??9Kr#?0@;A|JU&Ok2&CuOr@B|sxP|N+)f@jh^oN5yCPo} za#3!T4Y~!jF#g=q=3yvBdw#ZrfGMq!1mg7+8G{Ft%Jt85tRKgV=V?=sBR_A6d6|Z7 zK9p(P^BH67Gr7f2tbe2dLZOlF*%lc-q#Qoorst_EmH(#qjDlcI{y81r2s~I`S+2xIz#)%^o3N131Di4u(dTKrO65Gpb0zsV3q$2$EUO}r z)>@iJAw%a&r{C9#*+*&9CXSoc>=m#ssP;bnrH_HT0zh}3kHlmiC9F)`Fu9sT_jT=i z!@=dwnP0v}bNMY7Ej*N6(rZ~_yW8ddR~7Ursr`qi@;u$1J*ogZExZH&&2*~YZlOjL z3}_dMO69-Vtg^1VON=-!U)lTPZrP26y3DxM+(AKI?oUvZcJ#6sXykTYXO41)%v917 zUdNYk5kmM?bBXPdY~pel^H{~Fh%cID(B|>Q)g`5JsAS*xk6i(aGVOBVVx6M=w{q5q zgL2SOP)W$gQwbxU(K3~4*z$>a1%b(E*Xym%4X5dV%a>CHzwxch0Yrh16_Yq6`2uvl z#QbhlOw9S=sCOonHO z_LT-ySc}l+2EL|A>+L;X71~;AF-Pq8c~@{hbtUa?1&9U)C&WIv*=j7irVUqY^uT7 zm&;rSQD~{IR2?d`V%vnHTJfhCZUajb5x!8^8sw)9o6aRBAd?VjvD}|Lu8(9qlm$3zS7;C+!z{e-j3BCes0^~nRdGQW|D+G zp~mQCa+Ku6S+=uUc7UPV*3CVLkp>PhbE``^h%w%1Jza$f&Aa>y^n#rF&xU_mjs>e# zjI>U=8#=moP5a^FF>GJ+Ho>sT_k)6%!%!f|HwO&vSAyju(8$rbxUxa}Qfdau(6A0$ z)Wo*{3?_a!Oc5Gpg_w2ejAK>#&(GiaLzIKQ&)vS%CvpD%h z3D4Z=iHr{Og^eTzCN=w80U<|=JVzBw$3`2hf4sp1V`~0mFlMNIZDa$76I+p$?_}}4 z*E`LAP_%Q~Ko-t_n!;i73SJM2#6zE)SvRf9^1 zS83Zr6p}1=}*Cdf}>UQ^xD`BQ+`jqXUUbzn{Q<=h9~n&+b^8&563;98#75zu9j)n%Tz09O&lB`7etCwwX{%N$taWcXie>Z zh`<*$W?}&d7d;`e`~azhaJnizAvwu|9^4ANTRg@F&#pdfB8gV2iOf1xqryE^&{WSs zRMk`@H#C`P1K#fm53FBEC%pC$ku}FiRU&oRc`&o&oZ5UA)BS?#)2#`Br9~UyUsK9SgM!KFiPZ5UjYYudR-AzOz;gAGaEI+HUuS1rV!+diM(3 zAH6-@G#Al=@mY_NfE?{twv6W*fwD#AX#gm%V7+I(U{`SX83es>B2Y^pZ7VSC)m8(C zTe5U``pY00Y;QX1-J%(j@llRwTz^YJ+RxSDzfKtaNHj`CY`@5khMi#4TYGu^>XJwt2zQ-lN`5=*5RWk{A3%qD;+ z>E*Lk@{{zyH3K}&=i+niMyut(RrR#ZYG>PmQVy5jaMC`73&Qoq?Ar)KdTSM~ktUPx zQ#j#8)QV?ggz={H+9hAivAoxMc@({F!)Zc{59HI&w^U_e$(9x`Y56Lq@|pZzrh2d_ zVenqY&~?SvUO6m|YjpsAUx+D@5dsc&T(s`z`&5&&7LWaAiRJ3+>(flH{^(s3359F{ zwjZTvs~0W-e(Xt^A~TThRtTeW$gkV%vn!6b>-Lmy`jQOl;_rOQL<9X?D~R_~%;=`%u~?zz&!t|a89)N>V!F3L`v$d_5?5Ks zqGbr5covsNRV2Q4Op%e>u4Um>m?&`S4AF;3B|MObE;H;KT(unp0-{_a7Pp!i685oj zlXlb_6Jg_w6X>jY(Vw6#XBzg-3BJ~6K`$@Jx4kFJ)cjROes8^`f5qC>24+uSP>3B~n~B<%SzYyyR;3em{;v@iB)F zeFKq7IXDdc=Z~PF%am}Yn*rkB$K2;xhMKQEMIidVum}c11KC(cduhW3Qu@)B@<$J4 z>yIIkjZNvok|x<&9~Na5ZAzpm-sD>}}(9`k^TR zxCF5e`V{%w8Z&i-oBn#}x!YQNI2iH3OH{C2zjD0nlz)LqF04yJeJ$7ddK2)xlVedT zUpvx8zYX=TYWZ_&oUr4xy2mfuTBLpLpe+%V$ClNK*fyfj?-v?eLXsVdbcrN5cq}vw z9<|+&Co~G%M^MCB3G{H0q0eGn5F#ia8qjAZI3)&r z6-kW%J3d3bDsR%Wt%kJ#w3&e9fV2|=5e>3!Cm8%MC9Fs?7;T!qFZ$nTsl!k#nY!UM zOBcyVj5#(un4az=GDPw36s0sMeeQy85=9oH^}in(2IcAnp+g+N^jlq(ZYy=W#S`!d zFYRVc8j!Ehz@Nfkhl7Z}+rUu=Swqx-TFnN`Mdbz{WU8MZm)AGhX&5I<7H!?cn>dYk zXVe}+du-WB0)Hnf7vKfv*0?s_9|qW%1-6euCJ?Bepbm@8h+yT6_GPHc1D;x;|JV-) z5UA~T_lJtbkx;@%2#dL=je;OR0VR}$lgrD2-|PMB{(QYg2@E;usL2vM|b&v0{H)|~;pMtj*`j|OPhZQ7~Kr|0&F~DlmLa4p8 z_0&sM%ME_u9=xuyamPjYbrXgG2;FHzg7hkPIiGYJ8+AxzE@w7>$O~P^2=72{X`$an zzP(ZU@zwr|VgLU>Zf>avE0>A8R?q}b32B~1I_|1wXE7txC6frk46(xCL3%y}Sru(4 zP5z+r+2VsfF0jb!dA>DJ+U`L2jNRps@%@^Ec#oxIi{7;nd49%yp#Ia?`006_#4!0vAo@P=6 zn%!c)!N_J@Lz4saL0F280->G%x|Ja|uETdbdRQ%;u1Kor^7*ud_R3~-0)*d?%QJsY zoEG5r3siswEQ$@F0A#eKGd258rtICEk4Ga;DJKR=Fx<-ETa>T1HHF?5D>zl+}{*QHa| zKY5^rAoAYy=J0uSe}7&(Sx{GU z!zkp5k0ub6t2_)S7)qTl*Oo$uTv*KRh9i@t(CIY)9z)qHlFi}u_;|Uku2+K8p5-E= zD^MyM*CADVj63-WoyPIp2(*Zr z(*MEX2spyeqcx0Vi`E~S(K$9hFG4TVvpbLGG~!OMzk+JN?LQUR3yIxQGp;{p4wIWB zCL);cafJ&Q_>Uf6?-k`*`!Hdp5PN@S|+4%kWiizr118(3Ps?w72NL z#^!)R`Z;dKxm90?A8$3cek{dxFwooFEd>Eda7*EB}Fve$vX8FpvDT^ zzVw-NSeiH3WWhwR_*oC#>(DYVSRQ4m$aMeb$BO_{#;_KP$79a|`hY|~c|Ne9EkRv2 zo%<$EfCunBodDVWbw}(?&S^6Oh!09-0b^-~s>ccSL-nQt0`!Te=6iwtsseYZ8?yF6 zu7>VD<^bsizM+P`PZFb|w17Kj!kP|=0V+i!T$7eRp$IUzmnQEHtHTS63rN351%}*L z1)adlmw)*!fsCBT+r7+$1cQNQ2js|M`Ic@n63$HqN+AMmkDN6e!WlErl8_yYaz4}S zytiQ_okQ-v4t3k6PBCXV1nwSKN^H0^ngrE8Iwm@4Ic)qDyP)bK?ZCJGwa`r9_kjVz zFW+dk^)ew=%Oem2N^e}8?HUKL+u!<(dya^XROrAe1cuG10W~~~*QB00SkXRs@0SQA z)ld7OVt33-ff%Uv9_|kRX*o-twBY_hm=D!sarr6wX7`XbWRRd?il5fB8o$`VPZ{(h z3dG-yhts%@dRqw^=_|bnvBWm*D?=66dpp(m*a;FyxRJ_lep^S(eOptxF(l$g7cO+j z^Z4Yb;V_YK0xbL7EFwrAaat`o%o%nBs6bQqeC*zZ5ol&!je;wsRFgCnAJgHpI4#tb zix5{rclIvI*o!L8kyRSARToisxgV~fZ+97-V?cpV$ob}3y>O=& zKh5SuN}L~htk{A41o$AofW7)Fp0w74Z*u-tjkw|PowEozlq`AGXS^^+q#~c@y+OrN zH8Eu@jFa(LH>HG+?=U^K_`8ai`+<)87ZcprX%;|lfogKF7L^d0SGDV9J_F;{!A9U8|^6zkDudnBS=V zRO6>P_r6#vQze05B|R^w8P)nxHWL`KM50c0Z#hz$6GCiYA*)T4^QO`t!JiGjJ5s7=|>X-bj)sdQ*tZ z4uZoQJ%jK7TtXCK<}UhR`j>0#Fhug}!_nC_k9@{5N?d^h@oF0}Ta+QO_$4^6SyrpR z=-A0jfx|5#z)|${eP+LmFZ1}>>x2WWD6nGQQkbTgL)4}0>AF1c>GV`9Nu53ZYpdKm1R z<8hSU<@Fr6r3o;F2a3J+KIWnPS^zo;Mi_GvW3~*eW^#6O16?Cj63WKr_kPhb%MO7- zFM^thfkq`)l(%Cg5-A`r^wAgBJD23Gc>m|D|8R){@X^5NOd{irpH`Od1m4!0k8xceg&6XDKH3*UpPc`~KHsD?R+d_LFJKY!09Wmu z=RDhQTQ%$L#cFz1*XOjai-d4++aGU!J}%dhzF4H+X(ZgvDptH%Rhj_L5P;|H`tgtT zR)5+Gwjvz^#X)vfV!|9Q#pB^T6QcfHd_#<8@=~ZMc=@#XvkU%5Sl1Dc!~bk<>AGC3 z^<_gSIMMaV)Qhtlk^kGQxo&(&ork=6b|=Kp}44{cCU!&G_e>>|dQS%TO}1qdJmkjta0U#xlr6 zw_GMXt)&r{jiJ?rn)L@A5v5u8K#AU(Aa_%Q#^HX_SiO}mAZAitAf6J4$;&h2Sam=2 z$p7Bl>CLiB4WkxE%5Ejh+8PCdkjZ*p7^RuUGkzg{9C)@(9J-uY5nGH|2{kJ2fgYhL}L)UJy^*B;YeQ~d82 z%2N8QDVTSzhf%Oiy4>F2&Pht3x$uEXg32Kjqer|>%YnVMNxfO%CBsZbX^&*MjvEuV zb{}EOde6_>iJaI8PdAZaX1Q#z{AVbXwJjU1;1_9ewAx)L7O(y`Ypor1R$Dg939cLF2X3-9zT$*i2Ytz!Sp#RVZJ)9{@LM2*iKmRQw*q$aj5EstH<=ga_ zOh0)&ZTP&8SAN}&cPBBHOOZT8Y#8N}kAl1S&w%I*C!clQn(ex;xk48q@ZJwIU~xT4E7{j6W^^U~2ydlrxbKTp_kVLlLpjcQbBve3 zr$8EIR)Q77jxBDlGR-G}vR38#JuCgfziX&F9~;ptb}$fMtMqV>W1GUo{1lKYqr-*Gn;mlC62@WVwG)qlbBo-dM>yL7SwPQ{ zLXqT6?Ei$B{*Q>=|F)0>fWcvshI9Q#*ZPM_y|3T5(P=_yH@kck-W#chsi0xZRt1xi z2ADN}h_r7t6z|ZN_&mj5uLmfw>yQN#?DegtG6Z5O!@ihbACF)XB?tj>g_^W?x)<=X z%p;+k+%X?egyMmLIPT!hYrZQ*;74n{95V_^;Lbvk_nv5&ZEOP6pcmHI4g++%yIco< z2W$WAqn@KVTxE$0V(MC38P^Y&g|JODf@XQNrlg^(^D)7&4r+@)4j|=y-r^1*mqCM~ z+=%R@NE?5LCt7rhYG#PWFXGO-w9&sgDB%S717#ZRSaFl8LXRW<`vpM!TD0`pew)s< zR5*}MPgq0G^-7&TROYZLu`%^h=jeW5F!%+twl*O)f1?gFND7C|{dOlndU(WyB9c1V zbyDZ~ECYppgkZk6ajzfxiIj)>=OxG#mNsBb*RK3E=?al-2UbrdTY0=soy`?P+a3(N zqVr7X@uM^Qed(~Qux761ppwR_YWwSUP zcKbtWJtnPMgMLIhyj~I{OdNLWl^(zE>Xxl`*Gp|&i?Tj@QL>6*5eim~!wMQf{O!p^ zVi5GD*8hhEv3ToPh7aXaZ%?LYa23vOwJ6{;rBY2#rRKsFf_yh+EJ5=5el{ zuT?`Nzr-G{0gOrLYaJDO=xl`9gx5*COJ{rLvh9!8>_7tkXvmq8xYW?du$VJpu!n2h zX!9AnS{Mr{K71d6#Tp}>s+JS=P6+GB+4pI{M&aiwf1eVV{%uVVzWwTG4GOK>sf1|>SnB2Y6{)YN9-a*GZ6=RI4ari z{RN|-3G~du&fDW9iRfNFW6>?|c#2@V^fI-4^I*yYkRrRd=8%JS+smy-IYWWZW#eGK1P+J)DZN^uw%x9{2UWag z^SP;MWHNh^KVR?JJTw$rKK1$=S}j=YfcpsJz}F*W?t;H1FF-|wC#`etP-NxJ5|nE1UtwQM*3fw zBF@6N2>C$TU^m!l8n!o_oKsa9^jvpxIFJ(Z-Q#gxz-k#zF>dw*3lIoa`ZS@Xp#MUQ z3`y_5aKYlgrTbeVSz9=Uq}Cs=6wrr~ikv1+xRt7O5-(fJ0q7(=5^!LBS@9~I_0z5R zg{3N;A?6@t$X;fluuT5NqzUIM*B_NFK985nFgjC>1irgw{Vn;3#OND1De|?2O#ppB zmFcoENwA!kK2|M0k|H}SQC#px;#F`3E$devlt1Wm{)>v@j${E4Z+Z(3IZ)ksijM8; z5QA^uNneQH%K(9C#O&7AR3zxBOvGWQzXZ+pkqtqsO_f>%Hw=N{CXBI+ebb953!DPs zdxNqJT)}mWfJGLQlFYr@(`(6VoD~9VIR09Rkkt}fJMMNQP%l@l}WPxt8OE-K} z{Upo8sT@wvxszRzu*VC|*4OUI=^8%-h{pqkoXv)v^m5ozb5F`EN@t3-T<=r6+F$83k1UzeIHLEr-`!uhl|5FE3!OzsNH*eqG1?6~4?gc)bq7 zd25unnK~Vj%iy-S?*7bVw_fe}0xHEm53Kxtt+aa|)H(M>%!T2H;apT?^+(%lQhp#X z#mNihKR2lT2o!|~2svAuNf#lP!xJ!GsO#Pea?}6zA3fMyb0O&3tIRefdCag z8* zp1S=}gt_BM_LPr#S8enLntf8g{wG%UUj)GaN$g|~pXl&FG}RlrIZxbzfF1~{+YYkD zBT-6ecKrj%5%a-6PeMs5J5j~@RiUOUGfI{6UZx>xR_%N2X)RoE@M!|&7vJcHasji4YNw@HUF+wM>LD0FmfOMzgfou&}X)T-sN_BZpH%K^%-66&BlHzzp z=rtM34${$sY=hoq|5dgHg} zGn>ZO<)J4y_gQ9(_2;dbA32)wQcz>6o~Mu@8`MP%gqU7bk`7O`Xpxj^h*&{NJ0wj@92)&PYAMhWLx|kEt#R~K^X~0rBq(8(Ht4s$lump z9iGaL?z1en0QnzY){L~v3bAA*!XX;SBDZs*0ORwxyamn}){0C{=95xB4Gu zOVaAlu;o(6N`jhxF)o=ghI`S0AClrTh~R@T4<3A3FuBZP(KM+ z%0mqD)q|B_AdJXD?9I3@XbHTOxLa78xKi%9c?29@0T%iLKj`x1BdJ_ z_}-t(^&fo*e?0jgCUK79+l*Pw-Q<@hEUwwvMe1bRX^-#QgkAxGf!pTW{EZh85s14Y zG0V2aFNAb+j<4f5d#TTgxGVvODKJ8ZdiF-|f`ze0>Dx8^w zgyXD+0|o`}gBlls?~QC;wPoMCb%L)o$PZoBd(Fv*HU#Ip$Vv3J

    =vVV=JFRdpv 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�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 z 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%0DK|LF)^h>{5jm>OW7l!AFcAd)p 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�SZyy65BK#M>(Jw6!Cd>!XqsL~!K57k6 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�1qe>R3p)sY9#77?XszFCE_7GeAdm_6T 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 ZPEo|`#H9dH3SnL~uVOf{7b^KWAkr84y^%By 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

    clC!@*b5uq5+= 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

    Wx(-zJs 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%0A@M{7r}fwO_F)B}}jejK-FQ2LwwH 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 max){ + deferred.reject(new Error('no port available')); + } + else if(_.contains(global.portsAlreadyPicked, port)){ + checkAvailability(deferred, port + 1); + } + else{ + exports.rejectIfPortBusy('localhost', port) + .then(function(port){ + deferred.resolve(port); + global.portsAlreadyPicked.push(port); + }) + .otherwise(function(){ + checkAvailability(deferred, port + 1); + }); + } + } + + var available = when.defer(); + + checkAvailability(available, min); + + return available.promise; +}; + +exports.pickAvailablePorts = function pickAvailablePorts(min, max, count){ + + return when.map(_.range(0, count), function(ith){ + + return exports.pickAvailablePort(min, max); + }); +}; + +exports.ensureDir = function ensureDir(dir, clean) { + try { + var paths = fs.readdirSync(dir); + if(clean) { + paths.forEach(function(filename) { + try { + fs.unlinkSync(path.join(dir, filename)); + } + catch(e) { + + } + }); + } + } + catch(e) { + fs.mkdirSync(dir, ACCESS); + } +}; + +exports.writePid = function writePid(pid, dir) { + + pid = pid || process.pid; + dir = dir || path.join(process.cwd(), '/pids'); + + exports.ensureDir(dir); + + var persist = util.format('%s.%d.pid', cluster.isMaster ? 'master' : 'worker', pid); + + fs.writeFileSync(path.join(dir, persist), pid, { + 'encoding': 'utf-8' + }); +}; + +exports.markDeadPid = function markDeadPid(pid, dir) { + + pid = pid || process.pid; + dir = dir || path.join(process.cwd(), '/pids'); + + exports.ensureDir(dir); + + //this is to exclude it from readPids, such that at time of shutdown, those already dead won't become suspects + fs.renameSync(path.join(dir, util.format('worker.%d.pid', pid)), + path.join(dir, util.format('dead.%d.%d.pid', pid, Date.now()))); +}; + +exports.readPids = function readPids(dir) { + + dir = dir || path.join(process.cwd(), '/pids'); + exports.ensureDir(dir); + + return _.map(_.filter(fs.readdirSync(dir), function(filename){ + return /master\./.test(filename) || /worker\./.test(filename); + }), + function(filename){ + + return parseInt(fs.readFileSync(path.join(dir, filename), { + 'encoding': 'utf-8' + }), 10); + }); +}; + +exports.readMasterPid = function readMasterPid(dir) { + + dir = dir || path.join(process.cwd(), '/pids'); + exports.ensureDir(dir); + + return parseInt(fs.readFileSync(path.join(dir, _.filter(fs.readdirSync(dir), function(filename){ + return /master\./.test(filename); + })[0]), + { + 'encoding': 'utf-8' + }), + 10); +}; + +exports.safeKill = function safeKill(pid, signal, logger){ + + try{ + process.kill(pid, signal); + return false; + } + catch(e){ + //verify error is Error: ESRCH + logger.debug('[shutdown] safeKill received:%j', e); + return e.errno === 'ESRCH'; //no such process + } +}; + +exports.getNodeInspectorPath = function getNodeInspectorPath(){ + + return require.resolve('node-inspector/bin/inspector'); +}; + +exports.startInspector = function startInspector(webPort, debugPort, saveLiveEdit, hidden, logger){ + + logger = logger || {'info': _.bind(console.log, console)}; + hidden = hidden || []; + + logger.info('[utils] starting node-inspector webPort:%d, debugPort:%d, saveLiveEdit:%s, hidden:%j', webPort, debugPort, saveLiveEdit, hidden); + + var inspectorPath = exports.getNodeInspectorPath(), + inspectorArgs = [ + '--web-port=' + webPort, //where node-inspector process listens to users' request from v8 + '--debug-port=' + debugPort, //where node-inspector process subscribes to debugging app process + '--save-live-edit=' + saveLiveEdit, //whether or not user could modify the debugging source and save it + '--hidden=' + JSON.stringify(hidden)//files excluded from adding breakpoints + ]; + + logger.info('[utils] starting node-inspector at:%s with args:%j', inspectorPath, inspectorArgs); + + assert.ok(inspectorPath); + + //NOTE, this is not _this.fork, but child_process.fork + return fork(inspectorPath, inspectorArgs, { + 'silent': true + }); +}; + +exports.getLogger = (function(dir){ + + dir = dir || path.join(process.cwd(), './log'); + exports.ensureDir(dir); + + var fileLoggerTransport = new (winston.transports.File)({ + 'filename': path.join(dir, process.pid + '.log'), + 'maxsize': 4 * 1024 * 1024,//4mb + 'maxFiles': 4//4 files max, 16mb for each process + }), + loggers = { + + }; + + return function getLogger(category){ + + if(!loggers[category]){ + loggers[category] = new (winston.Logger)({ + 'transports': [ + new (winston.transports.Console)({ + 'colorize': 'true', + 'label': category + }), + fileLoggerTransport + ] + }); + } + + return loggers[category]; + }; +})(); + +//here's the key feature for cluster3, based on the historic tps info, memory usage, gc rate, we could determine if a puppet should +//enter an old state from active + +exports.assertOld = function assertOld(maxAge){ + + maxAge = maxAge || 3600 * 24 * 3;//3 days + + return maxAge > 0 + ? function(heartbeat){ + return heartbeat.uptime >= maxAge; + } + : function(heartbeat){ //forever young. + return false; + }; +}; + +exports.assertBadGC = function assertBadGC(){ + + var peaks = {}; + + return function(heartbeat){ + + var pid = heartbeat.pid, + uptime = heartbeat.uptime, + currTPS = heartbeat.tps || (heartbeat.transactions * 1000 / heartbeat.cycle); + + if(currTPS <= 2){//TPS too low, no good for sampling. + return false; + } + + var peak = peaks[pid] = peaks[pid] || { + 'tps': currTPS, + 'cpu': heartbeat.cpu, + 'memory': heartbeat.memory, + 'gc': { + 'pauseMS': heartbeat.gc.pauseMS + } + };//remember the peak of each puppet + + if(currTPS >= peak.tps){ + peak.tps = Math.max(heartbeat.tps, peak.tps); + peak.cpu = Math.max(heartbeat.cpu, peak.cpu); + peak.memory = Math.max(heartbeat.memory, peak.memory); + peak.gc.pauseMS = Math.max(heartbeat.gc.pauseMS, peak.gc.pauseMS); + } + else if(currTPS < peak.tps * 0.9 //10% tps drop + && heartbeat.cpu > peak.cpu + && heartbeat.memory > peak.memory + && heartbeat.gc.pauseMS > peak.gc.pauseMS){ + //tps drops, while cpu/memory/gc pause all rise, it's highly likely that GC has gone wild + return true; + } + + return false; + } +}; + +exports.deathQueue = (function(){ + + var tillPrevDeath = null; + + return function deathQueue(queue, pid, emitter, success, options){ + + options = options || {}; + + assert.ok(queue); + assert.ok(pid); + assert.ok(emitter); + assert.ok(success); + + var wait = options.timeout || 60000, + death = util.format('worker-%d-died', pid), + logger = options.logger || { + 'debug' : function(){ + console.log.apply(console, arguments); + } + }; + + if(!_.contains(queue, pid)){ + + queue.push(pid); + + var tillDeath = when.defer(), + afterDeath = null, + die = function(){ + + var successor = success(); + + //when successor is in place, the old worker could be discontinued finally + emitter.once(util.format('worker-%d-warmup', successor.process.pid), function(){ + + logger.debug('[deathQueue] successor:%d of %d warmup', successor.process.pid, pid); + + emitter.to(['master', pid]).emit('disconnect', pid); + + emitter.once(death, function(){ + + logger.debug('[deathQueue] %d died', pid); + + tillDeath.resolve(pid); + + if(tillPrevDeath === afterDeath){//last of dyingQueue resolved, clean up the dyingQueue + + logger.debug('[deathQueue] death queue cleaned up'); + + tillPrevDeath = null; + queue.splice(0, queue.length); + } + }); + + setTimeout(function(){ + + if(!exports.safeKill(pid, 'SIGTERM', logger)){//worker still there, should emit 'exit' eventually + + logger.debug('[deathQueue] worker:%d did not report death by:%d, kill by SIGTERM', pid, wait); + } + else{//suicide or accident already happended, process has run away + //we emit this from master on behalf of the run away process. + + logger.debug('[deathQueue] worker:%d probably ran away, emit:%s on behalf', death); + + emitter.to(['master']).emit(death); + } + + }, wait); + }); + }; + + if(!tillPrevDeath){//1st in the dying queue, + afterDeath = tillPrevDeath = tillDeath.promise;//1 min + die(); + } + else{ + afterDeath = tillPrevDeath = tillPrevDeath.ensure(die); + } + } + }; + +})(); + +//this function is supposed to nanny all the puppets by checking their last heartbeat time +//if it has exceeded the max tolerance, we'll think of it as run away, and put into the deathQueue + +exports.nanny = function nanny(puppets, queue, emitter, success, options){ + + assert.ok(puppets); + assert.ok(queue); + assert.ok(emitter); + assert.ok(success); + + options = options || {}; + + var tolerance = options.tolerance || 60000 * 3, + now = Date.now(); + + _.each(puppets, function(p){ + + if(now - p.lastHeartbeat > tolerance){ + + exports.deathQueue(queue, p.pid, emitter, success, options); + + } + }); +}; + +exports.warmUpThenMark = function warmUpThenMark(emitter, expects){ + + return when.map(expects, function(pid){ + + var tillWarmUp = when.defer(); + + emitter.once(util.format('worker-%d-warmup', pid), function(pid){ + + tillWarmUp.resolve(pid); + }); + + return timeout(60000, tillWarmUp.promise); + }); +}; + +exports.gcstats = (function(){ + + var bin = require('gc-stats/build/Release/gcstats'), + emitter = new EventEmitter(); + + bin.afterGC(function(stats) { + emitter.emit('stats', stats); + }); + + return emitter; +})(); + +exports.npmls = (function npmls(){ + + var tillList = when.defer(), + execPath = process.execPath, + execArgv = [path.join(require.resolve('npm'), '../../bin/npm-cli.js'), 'ls', '--json', '--depth=10']; + + execFile(execPath, execArgv, { + 'cwd': process.cwd(), + 'encoding': 'utf-8' + }, + function(err, stdout){ + + if(err){ + tillList.reject(err); + } + else{ + tillList.resolve(stdout); + } + }); + + return tillList.promise; +})(); diff --git a/lib/views/caches.ejs b/lib/views/caches.ejs new file mode 100644 index 0000000..4cd4d66 --- /dev/null +++ b/lib/views/caches.ejs @@ -0,0 +1,54 @@ +

    + + \ No newline at end of file diff --git a/lib/views/index.ejs b/lib/views/index.ejs new file mode 100644 index 0000000..6ec6268 --- /dev/null +++ b/lib/views/index.ejs @@ -0,0 +1,84 @@ + + + + cluster2 + + + + + + + + + + + + + +
    +
    +

    Active Workers

    +
    +
    + +
    +
    + +
    +
    +

    Active Cache

    +
    +
    + +
    +
    + + + + + + + + diff --git a/lib/views/workers.ejs b/lib/views/workers.ejs new file mode 100644 index 0000000..6f0c291 --- /dev/null +++ b/lib/views/workers.ejs @@ -0,0 +1,133 @@ + + + + + <%for(var w = 0, len = pids.length; w < len; w +=1){ + var pid = pids[w];%> + + <%}%> + + + + + <%for(var s = 0, slen = statuses.length; s < slen; s += 1){ + var status = statuses[s];%> + + + <%for(var w = 0, wlen = pids.length; w < wlen; w += 1){ + var pid = pids[w], + type = typeof status[pid];%> + + <%}%> + + <%}%> + +
    # + +
    <%=status.name%> + <%if(type === 'string' || type === 'number' || type === 'boolean' || type === 'null'){%> +
    + <%=status[pid]%> +
    + <%} + else{ + for(var st in status[pid] || {}){%> +
    + <%=st%> : <%=JSON.stringify(status[pid][st])%> +
    + <%} + }%> +
    + + diff --git a/lib/worker.js b/lib/worker.js new file mode 100644 index 0000000..af36e35 --- /dev/null +++ b/lib/worker.js @@ -0,0 +1,318 @@ +'use strict'; + +var _ = require('underscore'), + when = require('when'), + util = require('util'), + timeout = require('when/timeout'), + usage = require('usage'), + BigNumber = require('bignumber.js'), + assert = require('assert'); + +var Worker = exports.Worker = function(proc, options){ + + var _this = this, + emitter = _this.emitter = options.emitter; + + _.extend(_this, { + 'pid': proc.pid, + 'process': proc, + 'logger': proc.getLogger(__filename), + 'options': options, + 'runnable': options.runnable, + 'createServer': options.createServer, + 'app': options.app, + 'port': options.port, + 'configureApp': function(app){ + + if(_.isFunction(app.use)){//make sure this middleware is ahead of others, to collect tps information + + app.use(function(req, res, next){ + + var begin = Date.now(); + res.once('finish', function(){ + _this.transactions += 1; + _this.durations += Date.now() - begin; + }); + + next(); + }); + } + + return options.configureApp(app); + }, + 'warmUp': options.warmUp, + 'debug': options.debug || false, + 'timeout': options.timeout || 5000, + 'aliveConnections': 0, + 'totalConnections': 0, + 'transactions': 0, + 'durations': 0, + 'totalTransactions': new BigNumber(0), + 'totalDurations': new BigNumber(0), + 'heartbeatInterval': options.heartbeatInterval || 60000,//1 min, the heartbeat shouldn't be too frequent, which could cause false assertion of utils#assertBadGC + 'status': require('./status'), + 'status.os': { + + }, + 'gc': { + 'monitor': options.gc.monitor, + 'explicit': options.gc.explicit, + 'incremental': 0, + 'full': 0, + 'pauseMS': 0 + }, + 'error': { + 'count': 0, + 'fatal': 0 + }, + 'isMaster': false, + 'isWorker': true + }); + + if(_this.gc.monitor){ + //in dev, we will not monitor gc, because, oddly enough, it conflicts with socket.io + //which is the key to our hot reload functionality + + var gcstats = require('./utils').gcstats; + + gcstats.on('stats', function(stats) { + //cannot tell if it's incremental or full, just to check if pauseMS is too long + _this.whenGC(stats.pauseMS, stats.pauseMS < 500 ? 'incremental' : 'full'); + }); + } + + process.once('disconnect', _.bind(_this.whenStop, _this, 'disconnect')); + process.once('SIGINT', _.bind(_this.whenStop, _this)); + process.once('SIGTERM', _.bind(_this.whenExit, _this)); + process.once('SIGUSR1', function(){ + process.nextTick(function(){ + emitter.to(['master']).emit(util.format('debug-%d-listening', _this.pid)); + }); + }); + + emitter.on('error', function(err){ + + if(err && err.fatal){ + _this.error.fatal += 1; + } + else{ + _this.error.count += 1; + } + }); + + _this.status.register('status.os', + function(){ + return _this['status.os']; + }, + function(status){ + return _this['status.os'] = status; + }); + + _this.whenHeartbeat(); +}; + +Worker.prototype.listen = function(){ + + var _this = this, + app = _this.app, + port = _this.port, + createServer = _this.createServer, + configureApp = _this.configureApp, + warmUp = _this.warmUp, + debug = _this.debug, + wait = _this.timeout; + + assert.ok(createServer); + assert.ok(app); + assert.ok(port); + assert.ok(configureApp); + assert.ok(warmUp); + + var tillListen = when.defer(), + run = function(){ + + when(configureApp(app)).ensure(function(configured){ //configure app before listening + + _this.logger.debug('[worker] %d app configured', _this.pid); + + var server = createServer(app).listen(port, function(){ + + _this.logger.debug('[worker] %d started listening', _this.pid); + _this.emitter.to(['master', 'self']).emit(util.format('worker-%d-listening', _this.pid)); + + //connection monitoring, including live/total connections and idle connections + server.on('connection', function(conn){ + _this.whenConnected(conn); + }); + + when(warmUp(app)).ensure(function(warmedUp){ //warm up app after listening + + _this.logger.debug('[worker] %d warmed up', _this.pid); + _this.emitter.to(['master', 'self']).emit(util.format('worker-%d-warmup', _this.pid)); //tell master i'm ready + + tillListen.resolve({ + 'server': server, + 'app': app, + 'port': port, + 'master': null, + 'worker': _this + }); + }); + }); + }); + }; + + if(!debug){ //normal + run(); + } + else{ //debug fresh process, waiting for 'run' command + _this.emitter.once('run', run); + } + + return (wait > 0 ? timeout(_this.timeout, tillListen.promise) : tillListen.promise); +}; + +Worker.prototype.run = function(){ + + var _this = this, + runnable = _this.runnable, + debug = _this.debug, + wait = _this.timeout, + tillRun = when.defer(), + warmUpThenRun = function warmUpThenRun(){ + + when(_this.warmUp(runnable)).ensure(function(warmedUp){ //warm up app after listening + + _this.logger.debug('[worker] %d warmed up', _this.pid); + _this.emitter.to(['master', 'self']).emit(util.format('worker-%d-warmup', _this.pid)); //tell master i'm ready + + tillRun.resolve({ + 'runnable': runnable, + 'master': null, + 'worker': _this + }); + + runnable(); + }); + }; + + assert.ok(runnable); + + if(!debug){ + warmUpThenRun(); + } + else{ + _this.emitter.once('run', warmUpThenRun); + } + + return (wait > 0 ? timeout(_this.timeout, tillRun.promise) : tillRun.promise); +}; + +Worker.prototype.whenConnected = function whenConnected(conn) { + + var _this = this; + + _this.aliveConnections += 1; + _this.totalConnections += 1; + + conn.setTimeout(_this.timeout, _.bind(conn.destroy, conn)); + + conn.once('close', function() { + _this.aliveConnections -= 1; + }); +}; + +Worker.prototype.whenHeartbeat = function(){ + + //heartbeat to the master + var _this = this, + emitter = _this.emitter; + + usage.lookup(_this.pid, function(error, result){ + + _this.totalTransactions = _this.totalTransactions.plus(_this.transactions); + _this.totalDurations = _this.totalDurations.plus(_this.durations); + + var heartbeat = { + 'pid': process.pid, + 'uptime': process.uptime(), + 'cpu': result.cpu, + 'memory': result.memory, + 'aliveConnections': _this.aliveConnections, + 'totalConnections': _this.totalConnections, + 'transactions': _this.transactions, + 'durations': _this.durations, + 'tps': _this.transactions * 1000 / _this.heartbeatInterval, + 'totalTransactions': _this.totalTransactions.toString(16), + 'totalDurations': _this.totalDurations.toString(16), + 'gc': _this.gc, + 'error': _this.error, + 'cycle': _this.heartbeatInterval + }; + + _this.status.setStatus('status.os', heartbeat); + emitter.to(['self', 'master']).emit('heartbeat', heartbeat); + + //cleanup after heartbeat + _this.durations = 0; + _this.transactions = 0; + _this.gc = { + 'incremental': 0, + 'full': 0, + 'pauseMS': 0 + }; + _this.error = { + 'count': 0, + 'fatal': 0 + }; + }); + + _this.nextHeartbeat = setTimeout( + _.bind(_this.whenHeartbeat, _this), _this.heartbeatInterval); +}; + +Worker.prototype.whenGC = function(usage, type){ + + var _this = this; + + _this.logger.debug('[worker] gc usage:%d, type:%s', usage, type); + + _this.gc[type] += 1; + _this.gc.pauseMS += usage; + + _this.emitter.to(['self']).emit('gc', usage, type); +}; + +Worker.prototype.whenStop = function(){ + + var _this = this; + + clearTimeout(_this.nextHeartbeat); + + //stop serving traffic, when 'disconnect' server should already take off traffic, this is to make sure resources get released + if(_.isFunction(_this.app.close)){ + _this.app.close(); + } + + (function gracefully(){ + + if(_this.aliveConnections > 0){ + + _this.logger.debug('[worker] gracefully shutdown: %d pending on aliveConnections: %d', process.pid, _this.aliveConnections); + setTimeout(gracefully, 500); + } + else{ + + _this.logger.info('[worker] gracefully shutdown: %d', process.pid); + process.exit(0); + } + + })(); +}; + +Worker.prototype.whenExit = function(){ + + this.logger.warn('[worker] forced shutdown: %d', process.pid); + + process.exit(-1); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..cc38a7e --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "author": "cubejs", + "contributors": [{ + "name": "Roy Zhou", + "email": "huzhou@ebay.com" + }], + "name": "cluster2", + "version": "0.5.0-SNAPSHOT", + "engines": { + "node": ">= 0.10.0" + }, + "main": "lib/index.js", + "dependencies": { + "underscore": "~1.4.4", + "usage": "~0.3.8", + "when": "~2.3.0", + "winston": "~0.7.2", + "graceful-fs": "~2.0.0", + "request": "~2.21.0", + "express": "~3.1.0", + "socket.io": "~0.9.16", + "ejs": "~0.8.4", + "node-inspector": "~0.4.0", + "gc-stats": "~0.0.1", + "bignumber.js": "~1.1.1", + "npm": "~1.3", + "optimist": "~0.6.0" + }, + "devDependencies": { + "mocha": "~1.11.0", + "should": "~1.2.2", + "dustjs-linkedin": "~2.0.3", + "dustjs-helpers": "~1.1.1", + "consolidate": "~0.9.1" + }, + "scripts": { + "prestart": "rm -rf ./log; mkdir log; rm -rf ./pids; mkdir pids", + "start": "node ./examples/cluster-demo.js --port=9090 --monPort=9091 --noWorkers=1 --cache.enable --heartbeat.interval=5000 &", + "stop": "node shutdown.js", + "pretest": "rm -rf ./log; mkdir log; rm -rf ./pids; mkdir pids", + "test": "mocha --ui bdd --timeout 10s --reporter spec ./test/*-test.js" + } +} diff --git a/shutdown.js b/shutdown.js new file mode 100644 index 0000000..9c8c586 --- /dev/null +++ b/shutdown.js @@ -0,0 +1,67 @@ +'use strict'; + +var utils = require('./lib/utils'), + readMasterPid = utils.readMasterPid, + readPids = utils.readPids, + safeKill = utils.safeKill, + getLogger = utils.getLogger, + optimist = require('optimist'), + when = require('when'), + path = require('path'), + _ = require('underscore'); + +var argv = optimist.argv, + timeout = argv.timeout || 60000,//user specified timeout or 1 min + pids = argv.pids || path.join(process.cwd(), '/pids'), + masterPid = argv.pid || readMasterPid(pids), + workerPids = _.filter(readPids(pids) || [], function(pid){ + return pid !== masterPid; + }), + logger = getLogger(); + +logger.info('[shutdown] SIGINT:%d monitor:%j', masterPid, workerPids); + +(function shutdown(begin){ + + if(!safeKill(masterPid, 'SIGINT', logger)){//master will handle 'SIGINT' only once + + if(Date.now() - begin >= timeout){ + + _.each(workerPids, function(wpid){ + //bruteforcely kill all workers + safeKill(wpid, 'SIGTERM', logger); + }); + + //bruteforcely kill master + safeKill(masterPid, 'SIGTERM', logger); + } + + setTimeout(_.bind(shutdown, null, begin), 1000);//check every seconds + } + else{//master is finally gone, we'll quickly check whether all workers are gone too + + when.map(workerPids, function(wpid){ + + var tillWorkerGone = when.defer(); + + if(!safeKill(wpid, 'SIGHUP', logger)){ + logger.warn('[shutdown] cleanup found dangling worker:%d', wpid); + tillWorkerGone.reject(new Error('pid:' + wpid + ' still lives')); + } + else{ + //worker already exit, check next + tillWorkerGone.resolve(true); + } + }) + .then(function(){ + //all workers exit normally + process.exit(0); + }) + .otherwise(function(){ + //some worker didn't exit though master already did + process.exit(-1); + }); + } + +})(Date.now()); + diff --git a/status.js b/status.js new file mode 100644 index 0000000..f3cded4 --- /dev/null +++ b/status.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/status'); \ No newline at end of file diff --git a/test/api-test.js b/test/api-test.js new file mode 100644 index 0000000..79a0006 --- /dev/null +++ b/test/api-test.js @@ -0,0 +1,52 @@ +'use strict'; + +var should = require('should'), + getLogger = require('../lib/utils').getLogger; + +describe('cluster2', function(){ + + before(function(done){ + + process.getLogger = getLogger; + + done(); + }); + + describe('#isMaster', function(){ + + it('should assert true', function(done){ + + var cluster2 = require('../lib/index'); + cluster2.isMaster.should.equal(true); + cluster2.isWorker.should.equal(false); + cluster2.emitter.should.be.ok; + cluster2.cacheManager.should.be.ok; + cluster2.status.should.be.ok; + + done(); + + }); + + }); + + describe('#listen', function(){ + + it('should start listening app', function(done){ + + done(); + + }); + + }); + + describe('#run', function(){ + + it('should start running the given runnable', function(done){ + + done(); + + }); + + }); + +}); \ No newline at end of file diff --git a/test/cache-test.js b/test/cache-test.js new file mode 100644 index 0000000..a5c8948 --- /dev/null +++ b/test/cache-test.js @@ -0,0 +1,193 @@ +'use strict'; + +var should = require('should'), + getLogger = require('../lib/utils').getLogger, + logger = getLogger(__filename); + +describe('cache', function(){ + + + before(function(done){ + + process.getLogger = getLogger; + + require('../lib/cache').enable({ + 'enable': true + }); + + done(); + }); + + describe('#cache-user', function(){ + + it('should auto connect to mgr', function(done){ + + this.timeout(3000); + + require('../lib/cache-usr.js').user() + .then(function(usr){ + + done(); + }); + }); + + it('should support all ACID operations', function(done){ + + this.timeout(3000); + + require('../lib/cache-usr').user() + .then(function(usr){ + + var namespace = 'ns-' + Date.now(); + logger.info('[test] using namespace:%s', namespace); + + usr.get(namespace, 'key') + .then(function(value){ + + logger.info('[test] first "key" get attempt should fail:%j', value); + should.not.exist(value); + + usr.watch(namespace, 'key', function(value, key){ + + value.should.equal('value'); + + logger.info('[test] watch key triggered'); + }); + + usr.watch(namespace, null, function(value, key){ + + key.should.equal('key'); + value.should.equal('value'); + + logger.info('[test] watch all triggered'); + + }); + + usr.set(namespace, 'key', 'value') + .then(function(set){ + + logger.info('[test] first "key" set attempt should succeed:%s', set); + set.should.equal(true); + + usr.get(namespace, 'key') + .then(function(value){ + + logger.info('[test] 2nd "key" get attempt should succeed:%j', value); + value.should.be.ok; + value.should.equal('value'); + + usr.inspect(namespace, 'key') + .then(function(inspection){ + + logger.info('[test] inspecting "key" got:%j', inspection); + inspection.should.be.ok; + inspection.length.should.equal(3); + + //value, persist, expire + inspection[0].should.equal('value'); + inspection[1].should.equal(false); + inspection[2].should.equal(0); + + var stat = usr.stat(namespace); + stat.should.be.ok; + stat.hit.should.equal(1); + stat.miss.should.equal(1); + stat.load.should.equal(0); + stat.error.should.equal(0); + + done(); + + }, done); + + }, done); + + }, done); + + }, done); + }); + }); + }); + + describe('#use', function(){ + + + it('should give a Cache interface back which hides the cache-usr behind', function(done){ + + this.timeout(4000); + + var namespace = 'use-ns-' + Date.now(), + persist = true, + expire = 3000; + + var cache = require('../lib/cache').use(namespace, { + 'persist': persist, + 'expire': expire + }); + + logger.info('[test] cache obtained:%j', cache); + + cache.should.be.ok; + cache.namespace.should.equal(namespace); //test namespace + + cache.meta().then(function(meta){ //test meta + + meta.should.be.ok; + meta.persist.should.equal(true); + + logger.info('[test] cache queries begin'); + + cache.get('key') //test get without loader + .then(function(value){ + + logger.info('[test] cache 1st "get" attempt should value:%j', value); + + should.not.exist(value); + + cache.get('key', function(){ //test get with loader + + return 'value'; + }) + .then(function(value){ + + logger.info('[test] cache 2nd "get" with loader attempt should succeed given value:%j', value); + + value.should.equal('value'); + + cache.keys().then(function(keys){ //test get keys + + keys.should.be.ok; + keys.should.include('key'); + + cache.stat().then(function(stat){ //test stats + + stat.should.be.ok; + stat.hit.should.equal(0); + stat.miss.should.equal(2); + stat.load.should.equal(1); + stat.error.should.equal(0); + + cache.watch('key', function(v, k){ //test watch + + done(); + + }) + .then(function(){ + + cache.set('key', 'value-updated'); //test set & watch + + }); + + }, done); + + }); + + }, done); + + }, done); + + }, done); + }); + + }); + +}); \ No newline at end of file diff --git a/test/cluster-emitter-test.js b/test/cluster-emitter-test.js new file mode 100644 index 0000000..f0b6230 --- /dev/null +++ b/test/cluster-emitter-test.js @@ -0,0 +1,77 @@ +'use strict'; + +var should = require('should'), + _ = require('underscore'), + fork = require('child_process').fork, + getLogger = require('../lib/utils').getLogger; + +describe('cluster-emitter', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('master-emitter', function(){ + + it('should work in none-cluster mode', function(done){ + + this.timeout(500); + + var emitter = require('../lib/emitter'); + + emitter.should.be.ok; + _.isFunction(emitter.emit).should.equal(true); + _.isFunction(emitter.on).should.equal(true); + _.isFunction(emitter.once).should.equal(true); + _.isFunction(emitter.removeListener).should.equal(true); + _.isFunction(emitter.removeAllListeners).should.equal(true); + + var event = 'event-' + Date.now(), + echo = 'echo-' + event; + + emitter.once(echo, function(){//test once + + done(); + }); + + emitter.on(event, function(){//test on + + emitter.emit(echo); + }); + + emitter.emit(event);//test emit + }); + + }); + + //now we'll need to verify the test in cluster mode, for master emitter the behavior should be: + //emit is to send the event to both master & all workers (we'll prepare a couple of workers at least 2 just to make sure) + //on/once should listen to events emitted by either master or workers + //removeListener/removeAllListeners should revoke all the listeners triggered above + + //for the slave emitter, the behavior should be: + //emit is to sent the event to both master & the worker itself + //on/once should listen to events emitted from either master or workers + //removeListener/removeAllListeners should revoke all the listeners triggered abovesss + + describe('cluster-emitter', function(){ + + it('should work in cluster mode', function(done){ + + this.timeout(3000); + + var token = 't-' + Date.now(), + clusterRuntime = fork(require.resolve('./lib/cluster-emitter-runtime'), ['--token=' + token]); + + clusterRuntime.on('message', function(msg){ + + done(msg.exit); + + }); + + }); + }); + +}); \ No newline at end of file diff --git a/test/cluster-status-test.js b/test/cluster-status-test.js new file mode 100644 index 0000000..55f7b00 --- /dev/null +++ b/test/cluster-status-test.js @@ -0,0 +1,156 @@ +'use strict'; + +var should = require('should'), + fork = require('child_process').fork, + getLogger = require('../lib/utils').getLogger; + +describe('cluster-status', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#statuses', function(){ + + it('should get no status at the beginning', function(done){ + + var status = require('../lib/status'); + + status.statuses().should.be.ok; + status.statuses().length.should.equal(0); + + done(); + + }); + + }); + + describe('#register', function(){ + + it('should allow register of an immutable component', function(done){ + + var status = require('../lib/status'), + name = 'immutable-status-' + Date.now(), + view = 'view-' + name; + + status.getStatus(name).then(done, function(){ + + status.register(name, function(){ + return view; + }); + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(view); + + status.setStatus(name, 'noop').then(function(){ //as we didn't register update, setStatus should have no effect at all. + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(view); + + done(); + + }); + + }, done); + + }, done); + }); + }); + + it('should allow register of a mutable component', function(done){ + + var status = require('../lib/status'), + name = 'mutable-status-' + Date.now(), + view = 'view-' + name, + updated = 'updated-' + name; + + status.getStatus(name).then(done, function(){ + + status.register(name, function(){ + return view; + }, + function(update){ + view = update; + }); + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(view); + + + status.setStatus(name, updated).then(function(){ //as we didn't register update, setStatus should have no effect at all. + + status.getStatus(name).then(function(result){ + + result.should.be.ok; + result.length.should.equal(1); + + var stat = result.shift(); + stat.should.be.ok; + stat.pid.should.equal(process.pid); + stat.name.should.equal(name); + stat.status.should.equal(updated); + + done(); + + }); + + }, done); + + }, done); + }); + }); + + }); + + //need to add test for cluster mode. + //we'll need to verify that statuses, register, setStatus, getStatus all work from workers view, masters view + //worker should see components registered by itself + //master should see components registered by itself and all of its workers + + describe('cluster-status', function(){ + + it('should work in cluster mode', function(done){ + + this.timeout(5000); + + var token = 't-' + Date.now(), + clusterRuntime = fork(require.resolve('./lib/cluster-status-runtime'), ['--token=' + token]); + + clusterRuntime.once('message', function(msg){ + + console.log('[test] message:%j, exit:%j', msg, msg.exit); + + done(msg.exit); + + }); + + }); + }); + +}); \ No newline at end of file diff --git a/test/ecv-test.js b/test/ecv-test.js new file mode 100644 index 0000000..e248603 --- /dev/null +++ b/test/ecv-test.js @@ -0,0 +1,192 @@ +'use strict'; + +var should = require('should'), + express = require('express'), + request = require('request'), + http = require('http'), + when = require('when'), + timeout = require('when/timeout'), + _ = require('underscore'), + EventEmitter = require('events').EventEmitter, + getLogger = require('../lib/utils').getLogger, + pickAvailablePort = require('../lib/utils').pickAvailablePort; + +function knock(port, path, assertions){ + + var deferred = when.defer(); + + request.get('http://127.0.0.1:' + port + path, function(error, response, body){ + + assertions = assertions || function(){}; + try{ + assertions(error, response, body); + deferred.resolve(null); + } + catch(e){ + console.trace(e); + deferred.reject(e); + } + }); + + return deferred.promise; +} + +describe('ecv', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#enable', function(){ + + it('should support control mode via urls', function(done){ + + this.timeout(5000); + + var ecv = require('../lib/ecv'), + app = express(), + server = http.createServer(app), + emitter = new EventEmitter(); + + emitter.to = function(targets){ + + return { + 'emit': function(){ + emitter.emit.apply(emitter, arguments); + } + }; + }; + + ecv.enable(app, { + 'root': '/ecv', + 'markUp': '/ecv/markUp', + 'markDown': '/ecv/markDown', + 'mode': 'control', + 'disabled': true, + 'emitter': emitter + }); + + pickAvailablePort(8000, 8099).then(function(port){ + + server.listen(port, function(){ + //server started; + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//yet markUp + }) + .then(function(){ + + var expectMarkUpAlert = when.defer(); + + emitter.once('markUp', function(target){ + console.log('[markUp] %j', target); + expectMarkUpAlert.resolve(target); + }); + + when.join(knock(port, '/ecv/markUp'), timeout(2000, expectMarkUpAlert.promise)).then(function(){ + console.log('[marked up]'); + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(200);//should have been marked up + }) + .then(function(){ + + var expectMarkDownAlert = when.defer(); + + emitter.once('markDown', function(target){ + expectMarkDownAlert.resolve(target); + }); + + when.join(knock(port, '/ecv/markDown'), timeout(2000, expectMarkDownAlert.promise)).then(function(){ + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500);//marked down again + }) + .then(done, done); //fail due to incorrect ecv after mark down + + }, done); //fail due to either mark down rejected or mark down status change event not received + + }, done); //fail due to incorrect ecv after mark up + + }, done); //fail due to either mark up rejected or mark up status change event not received + + }, done); //fail due to initial ecv check failed + + }); + + }, done); //fail due to all ports rejected + }); + + it('should support monitor with any validator', function(done){ + + this.timeout(3000); + + var ecv = require('../lib/ecv.js'), + app = express(), + server = http.createServer(app), + emitter = new EventEmitter(), + disabled = false; + + emitter.to = function(targets){ + + return { + 'emit': function(){ + emitter.emit.apply(emitter, arguments); + } + }; + }; + + pickAvailablePort(8000, 8099).then(function(port){ + + ecv.enable(app, { + 'root': '/ecv', + 'mode': 'monitor', + 'monitor': 'http://localhost:' + port + '/', + 'validator': function(error, response, body){ + + return !error && response.statusCode === 200; + }, + 'emitter': emitter + }); + + app.get('/', function(req, res){ + + res.send(disabled ? 500 : 200); + }); + + server.listen(port, function(){ + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(200); + }) + .then(function(){ + + disabled = true; + + knock(port, '/ecv', function(error, response, body){ + + should.not.exist(error); + response.should.be.ok; + response.statusCode.should.equal(500); + }) + .then(done, done); + + }, done); + }); + }); + }); + }); +}); diff --git a/test/lib/cluster-emitter-runtime.js b/test/lib/cluster-emitter-runtime.js new file mode 100644 index 0000000..9429ebb --- /dev/null +++ b/test/lib/cluster-emitter-runtime.js @@ -0,0 +1,119 @@ +'use strict'; + +process.getLogger = require('../../lib/utils.js').getLogger; + +var should = require('should'), + cluster = require('cluster'), + optimist = require('optimist'), + when = require('when'), + timeout = require('when/timeout'), + _ = require('underscore'), + emitter = require('../../lib/emitter'), + logger = process.getLogger(__filename); + +if(cluster.isMaster){ + + var argv = optimist.argv, + token = argv.token, + noWorkers = argv.noWorkers || 2, + event = 'event-' + token, + echo = 'echo-' + event; + + cluster.setupMaster({ + 'args': ['--event=' + event] + }); + + logger.info('[master] exec with token:%s and will use event:%s and echo:%s to verify emitter with %d workers', token, event, echo, noWorkers); + + var workers = _.map(_.range(0, noWorkers), function(){ + return cluster.fork(); + }), + waitForWorkers = when.map(workers, function(w){ + var waitForOnline = when.defer(); + + w.once('online', function(){ + waitForOnline.resolve(w); + }); + + return timeout(2000, waitForOnline.promise); + }), + exit = function exit(error){ + + logger.info('[master] exiting with error:%j', error); + + process.send({ + 'exit': error + }); //tell the test it has exited with failure + + process.nextTick(function(){ //exit now. + _.invoke(workers, 'kill', 'SIGTERM'); //force all workers to exit before master itself + process.nextTick(function(){ + process.exit(error ? -1 : 0); + }); + }); + }; + + waitForWorkers + .then(function(){ + + logger.info('[master] got all workers online notifications'); + + var expects = _.map(workers, function(w){ + return w.process.pid;//all workers' pids + }) + .concat([process.pid]);//master included + + emitter.once(event, function(){ + + logger.info('[master] received event:%s, and will echo:%s with pid:%d', event, echo, process.pid); + emitter.to(['self']).emit(echo, process.pid); + }); + + emitter.on(echo, function(pid){ + + logger.info('[master] received echo:%s from process:%d', echo, pid); + + expects = _.without(expects, pid); + if(_.isEmpty(expects)){ + exit(); + } + }); + + logger.info('[master] emitting event:%s to all', event); + emitter.emit(event, echo); + + setTimeout(function(){ + + exit(new Error('timeout after 5s, remaining expects:' + expects)); + }, 5000); + }) + .otherwise(function(error){ + + logger.info('[master] did not receive all workers online notification in time'); + exit(error); + }); +} +else{ + + var argv = optimist.argv, + event = argv.event; + + emitter.on(event, function(echo){ + + logger.info('[worker:%d] received:%s and will echo:%s', process.pid, event, echo); + + var eventToMe = event + '/' + process.pid; + + emitter.once(eventToMe, function(){ + + logger.info('[worker:%d] received:%s and will emit:%s', process.pid, eventToMe, echo); + emitter.emit(echo, process.pid); + logger.info('[worker:%d] emitted:%s with payload:%s', process.pid, echo, process.pid); + }); + + emitter.to(['self']).emit(eventToMe); + logger.info('[worker:%d] emitted:%s', process.pid, eventToMe); + }); + + logger.info('[worker:%d] prepared to echo to event:%s', process.pid, event); +} diff --git a/test/lib/cluster-status-runtime.js b/test/lib/cluster-status-runtime.js new file mode 100644 index 0000000..05c27d3 --- /dev/null +++ b/test/lib/cluster-status-runtime.js @@ -0,0 +1,125 @@ +'use strict'; + +process.getLogger = require('../../lib/utils.js').getLogger; + +var should = require('should'), + cluster = require('cluster'), + optimist = require('optimist'), + when = require('when'), + timeout = require('when/timeout'), + _ = require('underscore'), + status = require('../../lib/status'), + emitter = require('../../lib/emitter'), + logger = process.getLogger(__filename); + +if(cluster.isMaster){ + + var argv = optimist.argv, + token = argv.token, + noWorkers = argv.noWorkers || 2, + statusName = 'status-' + token; + + cluster.setupMaster({ + 'args': ['--status=' + statusName] + }); + + logger.info('[master] exec with token:%s and will register status:%s and create %d workers', token, statusName, noWorkers); + + var onlineWorkers = 0, + waitForWorkers = when.defer(); + + emitter.on('worker-online', function(pid){ + + onlineWorkers += 1; + + if(onlineWorkers === noWorkers){ + + waitForWorkers.resolve(onlineWorkers); + } + }); + + var workers = _.map(_.range(0, noWorkers), function(){ + + return cluster.fork(); + }), + exit = function exit(error){ + + logger.info('[master] exiting with error:%j', error); + + process.send({ + 'exit': error ? new Error(error) : null + }); + + process.nextTick(function(){ //exit now. + + _.invoke(workers, 'kill', 'SIGTERM'); //force all workers to exit before master itself + + process.nextTick(function(){ + + process.exit(error ? -1 : 0); + + }); + }); + }; + + timeout(4000, waitForWorkers.promise) + .then(function(){ + + logger.info('[master] got all workers online notifications'); + + var expects = _.map(workers, function(w){ + return w.process.pid;//all workers' pids + }) + .concat([process.pid]);//master included + + var pid = process.pid; + + status.register(statusName, + function(){ + return pid; + }, + function(value){ + pid = value; + }); + + status.getStatus(statusName) + .then(function(result){ + + console.log('[cluster-status] got status result:%j', result); + + result.should.be.ok; + result.length.should.equal(expects.length); + + exit(); + + }) + .otherwise(exit); + }) + .otherwise(function(error){ + + logger.info('[master] did not receive all workers online notification in time'); + + exit(error); + }); +} +else{ + + var argv = optimist.argv, + statusName = argv.status, + pid = process.pid; + + logger.info('[worker:%d] forked and register status:%s', pid, statusName); + + status.register(statusName, + function(){ + return pid; + }, + function(value){ + pid = value; + }); + + logger.info('[worker:%d] registered status', process.pid, statusName); + + emitter.to(['master']).emit('worker-online', pid);//truely ready + +} diff --git a/test/master-test.js b/test/master-test.js new file mode 100644 index 0000000..93fea94 --- /dev/null +++ b/test/master-test.js @@ -0,0 +1,113 @@ +'use strict'; + +var should = require('should'), + _ = require('underscore'), + util = require('util'), + express = require('express'), + request = require('request'), + EventEmitter = require('events').EventEmitter, + getLogger = require('../lib/utils').getLogger, + pickAvailablePorts = require('../lib/utils').pickAvailablePorts; + +describe('master', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe.skip('#construction', function(){ + + it('should create a master', function(done){ + + var logger = process.getLogger(), + Master = require('../lib/master').Master; + + pickAvailablePorts(7000, 7999, 4).then(function(ports){ + + logger.info('[test] ports picked:%j', ports); + + var emitter = new EventEmitter(), + app = express(), + master = new Master(process, { + 'emitter': emitter, + 'monCreateServer': require('http').createServer, + 'monConfigureApp': function(monApp){ + return monApp; + }, + 'monApp': app, + 'monPort': ports[0], + 'port': ports[1], + 'noWorkers': 0, + 'debug': { + 'debugPort': ports[2], + 'webPort': ports[3] + }, + 'cache': { + + }, + 'gc': { + + }, + 'ecv': { + 'root': '/ecv' + } + }); + + logger.info('[test] master created'); + + app.get('/', function(req, res){ + + res.send(200); + }); + + logger.info('[test] app created'); + + master.should.be.ok; + master.isMaster.should.equal(true); + master.isWorker.should.equal(false); + master.pid.should.equal(process.pid); + master.status.should.be.ok; + master.gc.should.be.ok; + + _.isFunction(master.listen).should.equal(true); + _.isFunction(master.run).should.equal(true); + + master.listen().then(function(resolve){ + + resolve.should.be.ok; + resolve.server.should.be.ok; + resolve.app.should.equal(app); + resolve.port.should.equal(ports[0]); + should.not.exist(resolve.worker); + resolve.master.should.equal(master); + + var hit = util.format('http://localhost:%d/', ports[0]); + + request.get(hit, function(err, response, body){ + + should.not.exist(err); + response.should.be.ok; + response.statusCode.should.equal(200); + + done(); + }); + + }, done); + }); + }); + + }); + + describe.skip('nanny', function(){ + + it('should nanny the workers, and detect runaways', function(done){ + + done(); + + }); + + }); + +}); diff --git a/test/puppet-test.js b/test/puppet-test.js new file mode 100644 index 0000000..82c206d --- /dev/null +++ b/test/puppet-test.js @@ -0,0 +1,131 @@ +'use strict'; + +var should = require('should'), + _ = require('underscore'), + EventEmitter = require('events').EventEmitter, + Puppet = require('../lib/puppet').Puppet, + getLogger = require('../lib/utils').getLogger; + +describe('puppet', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#contructor', function(){ + + it('should create a puppet instance', function(done){ + + var emitter = new EventEmitter(); + emitter.to = function(targets){ + + return { + 'emit': function(){ + emitter.emit.apply(emitter, arguments); + } + }; + }; + + var pid = Math.floor(process.pid * (1 + Math.random())), + logger = getLogger(), + master = { + 'logger': logger, + 'emitter': emitter, + 'puppets': {}, + + 'fork': function(){ + + } + }, + worker = { + 'process': { + 'pid': pid + }, + + 'disconnect': function(){ + + process.nextTick(function(){ + + emitter.emit('disconnect', worker); + + process.nextTick(function(){ + + emitter.emit('exit', worker); + }); + }); + } + }, + puppet = new Puppet(master, worker, {}, {}); + + master.puppets[pid] = puppet; + + puppet.should.be.ok; + + _.each(['disconnect', 'whenOnline', 'whenListening', 'whenExit', 'whenHeartbeat'], function(m){ + _.isFunction(puppet[m]).should.equal(true); + }); + + _.each(['forkedState', 'activeState', 'oldState', 'diedState'], function(s){ + puppet[s].should.be.ok; + }); + + emitter.once('online', function(worker){ + + puppet.whenOnline(); + }); + + emitter.once('listening', function(worker){ + + puppet.whenListening(); + }); + + emitter.once('heartbeat', function(worker, heartbeat){ + + puppet.whenHeartbeat(); + }); + + emitter.once('disconnect', function(worker){ + + puppet.disconnect(); + }); + + emitter.once('exit', function(worker){ + + puppet.whenExit(); + }); + + puppet.state.should.equal(puppet.forkedState); + + emitter.once('online', function(worker){ + + puppet.worker.should.equal(worker); + puppet.state.should.equal(puppet.forkedState); + + emitter.once('listening', function(worker){ + + puppet.worker.should.equal(worker); + puppet.state.should.equal(puppet.activeState); + + emitter.once('exit', function(worker){ + + puppet.worker.should.equal(worker); + puppet.state.should.equal(puppet.diedState); + + done(); + }); + + emitter.emit('exit', worker); + }); + + emitter.emit('listening', worker); + }); + + emitter.emit('online', worker); + + }); + + }); + +}); \ No newline at end of file diff --git a/test/utils-test.js b/test/utils-test.js new file mode 100644 index 0000000..0803c0e --- /dev/null +++ b/test/utils-test.js @@ -0,0 +1,468 @@ +'use strict'; + +var should = require('should'), + utils = require('../lib/utils'), + path = require('path'), + when = require('when'), + fs = require('graceful-fs'), + _ = require('underscore'); + +describe('utils', function(){ + + describe('#ensureDir', function(){ + + it('should mkdir if it does not exist', function(done){ + + this.timeout(1000); + + var ensureDir = utils.ensureDir, + dir = path.join(__dirname, '/ensureDir-' + Date.now()); + + fs.existsSync(dir).should.equal(false); + + ensureDir(dir); + fs.existsSync(dir).should.equal(true); + + ensureDir(dir); + fs.existsSync(dir).should.equal(true); + + var touch = path.join(dir, 'touch.txt'); + + fs.writeFileSync(touch, ''); + fs.existsSync(touch).should.equal(true); + + ensureDir(dir); + fs.existsSync(touch).should.equal(true); + + ensureDir(dir, true); + fs.existsSync(touch).should.equal(false); + + fs.unlink(dir, function(){ + done(); + }); + + }); + + }); + + describe('#writePid', function(){ + + it('should writePid to a given dir', function(done){ + + this.timeout(1000); + + var writePid = utils.writePid, + dir = path.join(__dirname, '/writePid-' + Date.now()), + pid = process.pid; + + writePid(pid, dir); + fs.existsSync(dir).should.equal(true); + + var written = fs.readdirSync(dir); + written.should.be.ok; + + _.some(_.map(written, function(filename){ + + if(/master\.([\d]+)\.pid/.test(filename)){ + //filename matched, further verifyt the pid + var verifyPid = fs.readFileSync(path.join(dir, filename), {'encoding':'utf-8'}); + return verifyPid && parseInt(verifyPid, 10) === pid; + } + else{ + //not matched + return false; + } + + })).should.equal(true); + + done(); + }); + }); + + describe('#readPids', function(){ + + it('should read all pids from a given dir', function(done){ + + this.timeout(1000); + + var writePid = utils.writePid, + readPids = utils.readPids, + dir = path.join(__dirname, '/readPids-' + Date.now()), + pid = process.pid; + + writePid(pid, dir); + fs.existsSync(dir).should.equal(true); + + var pids = readPids(dir); + pids.should.be.ok; + pids.should.include(pid); + + done(); + }); + }); + + describe('#readMasterPid', function(){ + + it('should read master pid from a given dir', function(done){ + + this.timeout(1000); + + var writePid = utils.writePid, + readMasterPid = utils.readMasterPid, + dir = path.join(__dirname, '/readMasterPid-' + Date.now()), + pid = process.pid; + + writePid(pid, dir); + fs.existsSync(dir).should.equal(true); + + var masterPid = readMasterPid(dir); + masterPid.should.be.ok; + masterPid.should.equal(pid); + + done(); + }); + }); + + describe('#getNodeInspectorPath', function(){ + + it('should get the path of node-inspector', function(done){ + + this.timeout(500); + + var nodeInspectorPath = utils.getNodeInspectorPath(); + nodeInspectorPath.should.be.ok; + + var stat = fs.statSync(nodeInspectorPath); + stat.should.be.ok; + stat.isFile().should.equal(true); + + done(); + }); + }); + + describe('#assertOld', function(){ + + it('should use the heuristic to determine when gc is hurting tps', function(done){ + + //whenever tps grow up, whether or not other metrics goes up/down assertion should be false. + var pid = Math.floor(process.pid * (1 + Math.random())), + assertOld = utils.assertOld(0);//0 seconds is old + + _.each(_.range(0, 1000), function(ith){ + + assertOld({ + 'pid': pid, + 'tps': ith, + 'cpu': ith, + 'memory': ith, + 'gc': { + 'incremental': ith, + 'full': ith + } + }).should.equal(false); + }); + + done(); + }); + }); + + describe('#assertBadGC', function(){ + + it('should use the heuristic to determine when gc is hurting tps', function(done){ + + //whenever tps grow up, whether or not other metrics goes up/down assertion should be false. + var pid = Math.floor(process.pid * (1 + Math.random())), + assertBadGC = utils.assertBadGC(); + + _.each(_.range(0, 1000), function(ith){ + + assertBadGC({ + 'pid': pid, + 'tps': ith, + 'cpu': ith, + 'memory': ith, + 'gc': { + 'pauseMS': ith + } + }).should.equal(false); + }); + + done(); + }); + + it('should assert true whenever a degradation of more than 10% happens', function(done){ + + var pid = Math.floor(process.pid * (1 + Math.random())), + assertBadGC = utils.assertBadGC(); + + assertBadGC({ + 'pid': pid, + 'tps': 50, + 'cpu': 50, + 'memory': 1000000000, + 'gc': { + 'pauseMS': 100 + } + }).should.equal(false); + + assertBadGC({ + 'pid': pid, + 'tps': 40,//over 10% + 'cpu': 55,//higher + 'memory': 1100000000, + 'gc': { + 'pauseMS': 110 + } + }).should.equal(true); + + done(); + }); + + it('should give 10% margin for tolerance', function(done){ + + var pid = Math.floor(process.pid * (1 + Math.random())), + assertBadGC = utils.assertBadGC(); + + assertBadGC({ + 'pid': pid, + 'tps': 50, + 'cpu': 50, + 'memory': 1000000000, + 'gc': { + 'pauseMS': 100 + } + }).should.equal(false); + + assertBadGC({ + 'pid': pid, + 'tps': 48,//less than 10% + 'cpu': 55,//higher + 'memory': 1100000000, + 'gc': { + 'pauseMS': 110 + } + }).should.equal(false); + + done(); + }); + + }); + + describe('#deathQueue', function(){ + + it('should let the suicide worker die if it is the 1st one in the queue', function(done){ + + var deathQueue = utils.deathQueue, + queue = [], + emitter = new (require('events').EventEmitter)(); + + emitter.to = function(targets){ + + return { + 'emit': function(){ + emitter.emit.apply(emitter, arguments); + } + }; + }; + + var pid = Math.floor(process.pid * (1 + Math.random())), + util = require('util'); + + emitter.once('disconnect', function(suicide){ + + suicide.should.equal(pid); + + process.nextTick(function(){ + emitter.emit(util.format('worker-%d-died', suicide)); + }); + + done(); + }); + + deathQueue(queue, pid, emitter, function(){ + + var successor = pid + 1; + process.nextTick(function(){ + emitter.emit(util.format('worker-%d-warmup', successor)); + }); + + return { + 'process': { + 'pid': successor + } + } + }); + + }); + + it('should let us queue the suicide workers one after another', function(done){ + + var deathQueue = utils.deathQueue, + queue = [], + emitter = new (require('events').EventEmitter)(); + + emitter.to = function(targets){ + + return { + 'emit': function(){ + emitter.emit.apply(emitter, arguments); + } + }; + }; + + var pid = Math.floor(process.pid * (1 + Math.random())), + util = require('util'), + expects = _.map(_.range(0, 10), function(ith){return pid + ith * 2;}); + + emitter.on('disconnect', function(suicide){ + + suicide.should.equal(expects.shift()); + + process.nextTick(function(){ + emitter.emit(util.format('worker-%d-died', suicide)); + }); + + if(!expects.length){ + done(); + } + }); + + _.each(_.range(0, 10), function(ith){ + + var ithPid = pid + ith * 2, + prevPid = ithPid - 2, + ithSuccessor = ithPid + 1; + + deathQueue(queue, ithPid, emitter, function(){ + + process.nextTick(function(){ + + //because we queued the deaths, at the time this ith worker is to suicide, the i - 1 th worker should have been gone! + _.contains(expects, prevPid).should.equal(false); + emitter.emit(util.format('worker-%d-warmup', ithSuccessor)); + }); + + return { + 'process': { + 'pid': ithSuccessor + } + } + }); + }); + }); + + }); + + describe('#gcstats', function(){ + + //NOTE, we were using node-gc module, and it couldn't work together with express, socket.io, request etc. + //we received an error 'Bus error: 10' and node program exit abnormally + //we switched memwatch and nodefly-gcinfo modules but they were not emitting gc events at all + //now we're using gc-stats module, which is very rough, the index.js doesn't seem to be a correct one + //but the binary works, we wrap it in our utils and leverage only the binary part of it. + it('should collect gc stats', function(done){ + + this.timeout(30000); + + var gc = utils.gcstats, + min = 1, + bigger = [0], + nextGrowth;; + + gc.on('stats', function onStats(stats){ + + console.log('%d %j', process.pid, stats); + + stats.should.be.ok; + /*{ + "pause":5181203, + "pauseMS":5, + "before":{ + "totalHeapSize":17603072, + "totalHeapExecutableSize":3145728, + "usedHeapSize":10838176, + "heapSizeLimit":1535115264 + }, + "after":{ + "totalHeapSize":18635008, + "totalHeapExecutableSize":3145728, + "usedHeapSize":8770888, + "heapSizeLimit":1535115264 + }, + "diff":{ + "totalHeapSize":1031936, + "totalHeapExecutableSize":0, + "usedHeapSize":-2067288, + "heapSizeLimit":0 + } + }*/ + stats.pause.should.be.ok; + + if((min -= 1) <= 0){ + + clearTimeout(nextGrowth); + + gc.removeListener('stats', onStats); + + done(); + } + }); + + (function grow(){ + + bigger.push(bigger); + + nextGrowth = setTimeout(grow, 1); + + })(); + + }); + + }); + + describe('#ls', function(){ + + it('should list all the deps', function(done){ + + utils.npmls.then(function(deps){ + + done(); + + }, done); + }); + + }); + + after(function(done){ + + var rmPatterns = [ + /ensureDir-[\d]+/, + /writePid-[\d]+/, + /readPids-[\d]+/, + /readMasterPid-[\d]+/ + ]; + + fs.readdir(__dirname, function(err, files){ + + _.each(files, function(f){ + + if(_.some(_.invoke(rmPatterns, 'test', f))){ + + var rm = path.join(__dirname, f), + touches = fs.readdirSync(rm) || []; + + _.each(touches, function(t){ + + fs.unlinkSync(path.join(rm, t)); + }); + + fs.rmdirSync(rm); + } + }); + + done(); + }); + + }); + +}); \ No newline at end of file diff --git a/test/worker-test.js b/test/worker-test.js new file mode 100644 index 0000000..86c0523 --- /dev/null +++ b/test/worker-test.js @@ -0,0 +1,152 @@ +'use strict'; + +var should = require('should'), + express = require('express'), + request = require('request'), + util = require('util'), + _ = require('underscore'), + getLogger = require('../lib/utils').getLogger, + pickAvailablePort = require('../lib/utils').pickAvailablePort, + Worker = require('../lib/worker').Worker, + EventEmitter = require('events').EventEmitter; + +describe('worker', function(){ + + before(function(done){ + + process.getLogger = getLogger; + done(); + }); + + describe('#construction', function(){ + + it('should create a worker instance', function(done){ + + this.timeout(10000); + + var logger = process.getLogger(); + + pickAvailablePort(7000, 7999).then(function(port){ + + logger.info('[test] port picked:%d', port); + + var emitter = new EventEmitter(); + emitter.to = function(targets){ + + return { + 'emit': function(){ + emitter.emit.apply(emitter, arguments); + } + }; + }; + + var app = express(), + configured = false, + warmed = false, + worker = new Worker(process, { + 'emitter': emitter, + 'createServer': require('http').createServer, + 'app': app, + 'port': port, + 'configureApp': function(app){ + configured = true; + }, + 'warmUp': function(){ + warmed = true; + }, + 'gc': { + 'monitor': true + } + }); + + logger.info('[test] worker created'); + + var memory = []; + app.get('/', function(req, res){ + + memory.push(memory);//this should let GC kick in quickly + + res.send(200); + }); + + logger.info('[test] app created'); + + worker.should.be.ok; + worker.isMaster.should.equal(false); + worker.isWorker.should.equal(true); + worker.pid.should.equal(process.pid); + worker.debug.should.not.be.ok; + worker.aliveConnections.should.equal(0); + worker.totalConnections.should.equal(0); + worker.status.should.be.ok; + worker.gc.should.be.ok; + worker.gc.incremental.should.equal(0); + worker.gc.full.should.equal(0); + worker.error.should.be.ok; + worker.error.fatal.should.equal(0); + worker.error.count.should.equal(0); + + _.isFunction(worker.listen).should.equal(true); + _.isFunction(worker.run).should.equal(true); + _.isFunction(worker.whenGC).should.equal(true); + _.isFunction(worker.whenHeartbeat).should.equal(true); + _.isFunction(worker.whenStop).should.equal(true); + _.isFunction(worker.whenExit).should.equal(true); + + worker.listen().then(function(resolve){ + + resolve.should.be.ok; + resolve.server.should.be.ok; + resolve.app.should.equal(app); + resolve.port.should.equal(port); + should.not.exist(resolve.master); + resolve.worker.should.equal(worker); + configured.should.equal(true); + warmed.should.equal(true); + + var hit = util.format('http://localhost:%d/', port); + + request.get(hit, function(err, response, body){ + + should.not.exist(err); + response.should.be.ok; + response.statusCode.should.equal(200); + + //now we'll verify gc + emitter.on('gc', function(usage, type){ + + logger.info('[test] gc happended'); + + type.should.be.ok; + + numOfGCs += 1; + }); + + var numOfGCs = 0, + load = function load(){ + request.get(hit, function(err, response, body){ + + should.not.exist(err); + response.should.be.ok; + response.statusCode.should.equal(200); + + if(numOfGCs < 2){ + load(); + } + else{ + //now we'll verify heartbeat + done(); + } + }); + }; + + load(); + }); + + }, done); + }); + + }); + }); + +}); \ No newline at end of file From 762c3a9cb6be3bca0625450cf01f9fe627315822 Mon Sep 17 00:00:00 2001 From: zhuwang Date: Sun, 3 Nov 2013 10:45:54 -0800 Subject: [PATCH 139/182] Added test cases to test cache performance --- test/cluster-cache-test.js | 118 ++++++++++++++++++++++++++++++ test/lib/cluster-cache-runtime.js | 68 +++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 test/cluster-cache-test.js create mode 100644 test/lib/cluster-cache-runtime.js diff --git a/test/cluster-cache-test.js b/test/cluster-cache-test.js new file mode 100644 index 0000000..ebcf2d7 --- /dev/null +++ b/test/cluster-cache-test.js @@ -0,0 +1,118 @@ +'use strict'; + +var request = require('request'); +var should = require('should'); +var fork = require('child_process').fork; +var when = require('when'); +var parallel = require('when/parallel'); +var util = require('util'); + +describe('Cache Performance Test', function () { + + var childProc; + var key = 'cache-test-key'; + var value = 'cache-test-value'; + var writeTask = function () { + var deferred = when.defer(); + request.get(util.format('http://127.0.0.1:9090/set?key=%s&value=%s', key, value), function (err, res, body) { + if (!err && res.statusCode === 200 && body === value) { + deferred.resolve(body); + }else { + deferred.reject('cache set error'); + } + }); + return deferred.promise; + }; + var readTask = function () { + var deferred = when.defer(); + request.get(util.format('http://127.0.0.1:9090/get?key=%s', key), function (err, res, body) { + if (!err && res.statusCode === 200 && (body === value || body === 'cache-test')) { + deferred.resolve(body); + }else { + deferred.reject('cache get error'); + } + }); + return deferred.promise; + }; + + beforeEach(function (done) { + var token = 't-' + Date.now(); + childProc = fork(require.resolve('./lib/cluster-cache-runtime.js'), ['--token=' + token]); + childProc.on('message', function (msg) { + if(msg.ready) { + return done(); + } + if (msg.err) { + return done(err); + } + }); + }); + + afterEach(function (done) { + childProc.kill('SIGTERM'); + done(); + }); + + describe('# 90% read, %10 write', function () { + var tasks = []; + for (var i=0; i<200; i++) { + if (i % 10 === 0) { + tasks.push(writeTask); + }else { + tasks.push(readTask); + } + } + it('Should resolve all the promises', function (done) { + var startTime = Date.now(); + parallel(tasks).then(function (values) { + var duration = Date.now() - startTime; + console.log(duration / 1000); + done(); + }).otherwise(function (err) { + done(err); + }); + }); + }); + + describe('# 50% read, 50% write', function () { + var tasks = []; + for (var i=0; i<200; i++) { + if (i % 10 < 5) { + tasks.push(writeTask); + }else { + tasks.push(readTask); + } + } + it('Should resolve all the promises', function (done) { + var startTime = Date.now(); + parallel(tasks).then(function (values) { + var duration = Date.now() - startTime; + console.log(duration / 1000); + done(); + }).otherwise(function (err) { + done(err); + }); + }); + }); + + describe('# 10% read, 90% write', function () { + var tasks = []; + for (var i=0; i<200; i++) { + if (i % 10 < 9) { + tasks.push(writeTask); + }else { + tasks.push(readTask); + } + } + it('Should resolve all the promises', function (done) { + var startTime = Date.now(); + parallel(tasks).then(function (values) { + var duration = Date.now() - startTime; + console.log(duration / 1000); + done(); + }).otherwise(function (err) { + done(err); + }); + }); + }); +}); diff --git a/test/lib/cluster-cache-runtime.js b/test/lib/cluster-cache-runtime.js new file mode 100644 index 0000000..38f7e41 --- /dev/null +++ b/test/lib/cluster-cache-runtime.js @@ -0,0 +1,68 @@ +'use strict'; + +var listen = require('../../lib/index.js').listen; +var express = require('express'); +var app = express(); + +function configureApp() { + app.get('/set', function (req, res) { + var key = req.query.key; + var value = req.query.value; + if (!key || !value) { + res.send('hello', 200); + }else { + var cache = require('../../lib/cache.js').use('cache-test'); + cache.set(key, value).then(function (happens) { + if (happens) { + res.send(value, 200); + }else { + res.send('fail', 200); + } + }).otherwise(function (err) { + res.send(err, 404); + }); + } + }); + + app.get('/get', function (req, res) { + var key = req.query.key; + if (!key) { + res.send('hello', 200); + }else { + var cache = require('../../lib/cache.js').use('cache-test'); + cache.get(key, function () { + return 'cache-test'; + }).then(function (value) { + res.send(value, 200); + }).otherwise(function (err) { + res.send(err, 404); + }); + } + }); + + return app; +} + +listen({ + 'noWorkers': 8, + 'createServer': require('http').createServer, + 'app': app, + 'port': 9090, + 'configureApp': configureApp, + 'cache': { + 'enable': true, + 'mode': 'standalone' + }, + 'ecv': { + 'mode': 'control', + 'root': '/ecv' + }, + 'monCreateServer': require('http').createServer, + 'monPort': 9091 +}).then(function (resolved) { + //if (!require('cluster').isMaster) { + process.send({ready: true}); + //} +}).otherwise(function (err) { + process.send({err: err}); +}); From ea6e52a90d6af54535a70e0c25ec380b440e9aa7 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 19 Nov 2013 13:51:59 -0800 Subject: [PATCH 140/182] + support for worker pause & resume initial commit + pause & resume will be extremely helpful in a few cases: 1. route traffic to some specific worker for debugging, warmup, testing purposes. (by pausing the rest) 2. performance tuning by pausing a worker, and do explicit gc, which allows us to use infrequent GC in normal its normal state + pause & resume implementation has an assumption that all app states have nothing to do with the server, it could be in the process mem space, tied to the express app, or elsewhere, but never tied to the actual tcp/http/https server. that's a prerequisite for efficient resume. --- lib/puppet.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/worker.js | 53 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/lib/puppet.js b/lib/puppet.js index 287d0af..9980c97 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -101,6 +101,29 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ } }; + _this.pausedState = { + + 'disconnect': function(){ + + worker.disconnect(); + }, + + 'whenHeartbeat': function(heartbeat){ + + }, + + 'whenExit': function(){ + + _this.state = _this.diedState; + + if(!worker.suicide){//accident, must be revived + master.fork(options, env); + } + //already exit, clean up + delete master.puppets[_this.pid]; + } + }; + _this.oldState = { 'disconnect': function(){ @@ -156,6 +179,44 @@ Puppet.prototype.disconnect = function(){ return this.state.disconnect(); }; +Puppet.prototype.pause = function(){ + + var _this = this, + tillPaused = when.defer(); + + _this.emitter.to(_this.pid).emit('pause'); + _this.emitter.once(util.format('worker-%d-paused', _this.pid), function(){ + if(_this.state === _this.activeState){ + _this.state = _this.pausedState; + tillPaused.resolve(_this); + } + else{ + tillPaused.reject(new Error('state changed before pause completed')); + } + }); + + return tillPaused.promise; +}; + +Puppet.prototype.resume = function(){ + + var _this = this, + tillResumed = when.defer(); + + _this.emitter.to(_this.pid).emit('resume'); + _this.emitter.once(util.format('worker-%d-resumed', _this.pid), function(){ + if(_this.state === _this.pausedState){ + _this.state = _this.activeState; + tillResumed.resolve(_this); + } + else{ + tillResumed.reject(new Error('state changed before resume completed')); + } + }); + + return tillResumed.promise; +}; + Puppet.prototype.whenOnline = function(){ return this.state.whenOnline(); diff --git a/lib/worker.js b/lib/worker.js index af36e35..7616df0 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -100,6 +100,18 @@ var Worker = exports.Worker = function(proc, options){ } }); + emitter.on('pause', function(){ + _this.pause().then(function(){ + emitter.emit(util.format('worker-%d-paused', _this.pid)); + }); + }); + + emitter.on('resume', function(){ + _this.resume().then(function(){ + emitter.emit(util.format('worker-%d-resumed', _this.pid)); + }); + }); + _this.status.register('status.os', function(){ return _this['status.os']; @@ -135,7 +147,7 @@ Worker.prototype.listen = function(){ _this.logger.debug('[worker] %d app configured', _this.pid); - var server = createServer(app).listen(port, function(){ + var server = _this.server = createServer(app).listen(port, function(){ _this.logger.debug('[worker] %d started listening', _this.pid); _this.emitter.to(['master', 'self']).emit(util.format('worker-%d-listening', _this.pid)); @@ -172,6 +184,45 @@ Worker.prototype.listen = function(){ return (wait > 0 ? timeout(_this.timeout, tillListen.promise) : tillListen.promise); }; +Worker.prototype.pause = function(){ + + var _this = this, + tillPaused = when.defer(); + + if(!_this.server){ + tillPaused.reject(new Error('server not started')); + } + else{ + _this.server.close(function(){ + + tillPaused.resolve(_this.server); + }); + } + + return tillPaused.promise; +}; + +Worker.prototype.resume = function(){ + + var _this = this, + app = _this.app, + port = _this.port, + tillResumed = when.defer(); + + _this.server = _this.createServer(app).listen(port, function(){ + + tillResumed.resolve({ + 'server': _this.server, + 'app': app, + 'port': port, + 'master': null, + 'worker': _this + }); + }); + + return tillResumed.promise; +}; + Worker.prototype.run = function(){ var _this = this, From 66ea7a39bebae996c5712e61693e045b88e3f3b0 Mon Sep 17 00:00:00 2001 From: huzhou Date: Tue, 19 Nov 2013 15:20:47 -0800 Subject: [PATCH 141/182] + pause/resume implemented, added to monitor --- lib/master.js | 24 ++++++++++++++++++++++++ lib/monitor.js | 23 +++++++++++++++++++++-- lib/puppet.js | 8 ++++++-- lib/views/workers.ejs | 17 +++++++++++++++++ lib/worker.js | 2 +- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/lib/master.js b/lib/master.js index 1aadcbd..e602ba5 100644 --- a/lib/master.js +++ b/lib/master.js @@ -251,6 +251,30 @@ Master.prototype.listen = function(){ return (wait > 0 ? timeout(_this.timeout, tillListen.promise) : tillListen.promise); }; +Master.prototype.pause = function(pid){ + + if(!pid){ + when.map(this.puppets, function(p){ + return p.pause(); + }); + } + else{ + return this.puppets[pid].pause(); + } +}; + +Master.prototype.resume = function(pid){ + + if(!pid){ + when.map(this.puppets, function(p){ + return p.resume(); + }); + } + else{ + return this.puppets[pid].resume(); + } +}; + Master.prototype.run = function(){ var _this = this, diff --git a/lib/monitor.js b/lib/monitor.js index 5e6e81d..a469fdd 100644 --- a/lib/monitor.js +++ b/lib/monitor.js @@ -76,7 +76,8 @@ exports.monCreateServer = function createServer(app){ inspector = null, state = null, statuses = {}, - sockets = [];//all of these vars are now scoped in monCreateServer to make unique + sockets = [], + pauses = {};//all of these vars are now scoped in monCreateServer to make unique logger.info('[monitor] server started'); @@ -132,7 +133,8 @@ exports.monCreateServer = function createServer(app){ 'debugging': debugging, 'inspector': inspector, 'state': state, - 'statuses': arrOfStatues + 'statuses': arrOfStatues, + 'pauses': pauses }); logger.debug('[monitor][workers] renders workers view:%s', html); @@ -317,6 +319,23 @@ exports.monCreateServer = function createServer(app){ }); }); + socket.on('pause', function pause(pid){ + + masterPromise.then(function(master){ + if(!pauses[pid]){ + pauses[pid] = master.pause(pid); + } + }); + }); + + socket.on('resume', function resume(pid){ + + masterPromise.then(function(master){ + master.resume(pid); + delete pauses[pid]; + }); + }); + socket.once('close', function close(){ sockets = _.without(sockets, socket); diff --git a/lib/puppet.js b/lib/puppet.js index 9980c97..4c7381d 100644 --- a/lib/puppet.js +++ b/lib/puppet.js @@ -112,6 +112,10 @@ var Puppet = exports.Puppet = function Puppet(master, worker, options, env){ }, + 'whenListening': function(){ + + }, + 'whenExit': function(){ _this.state = _this.diedState; @@ -184,7 +188,7 @@ Puppet.prototype.pause = function(){ var _this = this, tillPaused = when.defer(); - _this.emitter.to(_this.pid).emit('pause'); + _this.emitter.to([_this.pid]).emit('pause'); _this.emitter.once(util.format('worker-%d-paused', _this.pid), function(){ if(_this.state === _this.activeState){ _this.state = _this.pausedState; @@ -203,7 +207,7 @@ Puppet.prototype.resume = function(){ var _this = this, tillResumed = when.defer(); - _this.emitter.to(_this.pid).emit('resume'); + _this.emitter.to([_this.pid]).emit('resume'); _this.emitter.once(util.format('worker-%d-resumed', _this.pid), function(){ if(_this.state === _this.pausedState){ _this.state = _this.activeState; diff --git a/lib/views/workers.ejs b/lib/views/workers.ejs index 6f0c291..57af6cb 100644 --- a/lib/views/workers.ejs +++ b/lib/views/workers.ejs @@ -22,6 +22,11 @@ <%}else{%>