UNPKG

shared-updated

Version:

Modern fork of shared (Kevin Jones), updated for latest Node.js and MongoDB

101 lines (87 loc) 2.57 kB
/* * Simple cluster countdown test. * * Each worker is given its own independant counter that must be reduced to 0. Once all * the workers complete the master checks they have done their duty. * * Assumes MongoDB is running on localhost on default port */ var cluster = require('cluster'); var shared = require('../lib/shared.js'); // Uncomment this to show debug messages // shared.debug.log('STORE'); // Get access to the local MongoDB store var store = require('../lib/shared.js').createStore(); if (cluster.isMaster) { // In master var workers = parseInt(process.argv[2]) || 1; var count = ((parseInt(process.argv[3]) || 10000) / workers) >>> 0; var running = 0; // Create the counters, 1 for each worker console.log('Creating counter(s) of size %s for %s worker(s) to decrement', count, workers); store.apply(function (db) { for (var w =0 ; w<workers; w++) { if (db['worker'+w] === undefined) db['worker'+w] = { counter : count }; else db['worker'+w].counter = count; } }, function (err) { if (err) console.trace(err); // Start the workers going console.log('Forking workers...'); for (var w = 0 ; w < workers; w++) { cluster.fork(); running++; } }); // Wait for worker death console.log('Waiting for death...'); cluster.on('exit', function (worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); running--; if (running === 0) { // When all dead check counters are empty store.apply(function (db) { var sum = 0; for (var w = 0 ; w < workers; w++) { if (db['worker' + w] === undefined) { console.log('FAILED'); console.log(w); console.log(db); } sum = db['worker' + w].counter; } return sum; }, function (err, sum) { if (err) { console.log('Error: ' + err); } else { console.log('Sum of counters: ' + sum); store.close(); } }); } }); } else { // In worker var more = true; var worker = 'worker' + (cluster.worker.id - 1); // Decrement one from counter & try again function decOne() { store.apply(function (db) { db[worker].counter -= 1; return db[worker].counter > 0; }, function (err,more) { if (!err && more) { process.nextTick(decOne); } else { console.log(worker + ' all done'); store.close(); process.exit(); } }); }; // Bootstrap decOne(); }