z-nomp/init.js

164 lines
4.5 KiB
JavaScript
Raw Normal View History

2014-02-20 15:13:50 -08:00
var fs = require('fs');
var os = require('os');
var cluster = require('cluster');
2014-02-20 15:13:50 -08:00
var posix = require('posix');
var PoolLogger = require('./libs/logutils.js');
var BlocknotifyListener = require('./libs/blocknotifyListener.js');
var WorkerListener = require('./libs/workerListener.js');
var PoolWorker = require('./libs/poolWorker.js');
2014-03-09 19:31:58 -07:00
var PaymentProcessor = require('./libs/paymentProcessor.js');
JSON.minify = JSON.minify || require("node-json-minify");
2014-02-20 15:13:50 -08:00
var loggerInstance = new PoolLogger({
'default': true,
'keys': {
//'client' : 'warning',
'system' : true,
'submitblock' : true
}
});
2014-01-13 17:32:54 -08:00
var logDebug = loggerInstance.logDebug;
var logWarning = loggerInstance.logWarning;
var logError = loggerInstance.logError;
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
//Try to give process ability to handle 100k concurrent connections
try{
posix.setrlimit('nofile', { soft: 100000, hard: 100000 });
}
catch(e){
logWarning('posix', 'system', '(Safe to ignore) Must be ran as root to increase resource limits');
}
if (cluster.isWorker){
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
switch(process.env.workerType){
case 'pool':
new PoolWorker(loggerInstance);
break;
case 'paymentProcessor':
new PaymentProcessor(loggerInstance);
break;
}
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
return;
}
2014-01-13 17:32:54 -08:00
2014-02-27 15:59:49 -08:00
2014-03-09 19:31:58 -07:00
//Read all pool configs from pool_configs and join them with their coin profile
var buildPoolConfigs = function(){
var configs = {};
fs.readdirSync('pool_configs').forEach(function(file){
var poolOptions = JSON.parse(JSON.minify(fs.readFileSync('pool_configs/' + file, {encoding: 'utf8'})));
if (poolOptions.disabled) return;
var coinFilePath = 'coins/' + poolOptions.coin;
if (!fs.existsSync(coinFilePath)){
logError(poolOptions.coin, 'system', 'could not find file: ' + coinFilePath);
return;
}
2014-03-09 19:31:58 -07:00
var coinProfile = JSON.parse(JSON.minify(fs.readFileSync(coinFilePath, {encoding: 'utf8'})));
poolOptions.coin = coinProfile;
configs[poolOptions.coin.name] = poolOptions;
});
return configs;
};
2014-02-27 15:59:49 -08:00
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
var spawnPoolWorkers = function(portalConfig, poolConfigs){
var serializedConfigs = JSON.stringify(poolConfigs);
2014-02-27 15:59:49 -08:00
var numForks = (function(){
2014-03-09 19:31:58 -07:00
if (!portalConfig.clustering || !portalConfig.clustering.enabled)
return 1;
2014-03-09 19:31:58 -07:00
if (portalConfig.clustering.forks === 'auto')
return os.cpus().length;
2014-03-09 19:31:58 -07:00
if (!portalConfig.clustering.forks || isNaN(portalConfig.clustering.forks))
return 1;
2014-03-09 19:31:58 -07:00
return portalConfig.clustering.forks;
})();
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
var createPoolWorker = function(forkId){
var worker = cluster.fork({
2014-03-09 19:31:58 -07:00
workerType: 'pool',
forkId: forkId,
pools: serializedConfigs
});
2014-03-09 19:31:58 -07:00
worker.on('exit', function(code, signal){
logError('poolWorker', 'system', 'Fork ' + forkId + ' died, spawning replacement worker...');
createPoolWorker(forkId);
});
};
for (var i = 0; i < numForks; i++) {
createPoolWorker(i);
}
2014-01-13 17:32:54 -08:00
2014-03-09 19:31:58 -07:00
};
2014-02-27 15:59:49 -08:00
2014-03-09 19:31:58 -07:00
var startWorkerListener = function(poolConfigs){
var workerListener = new WorkerListener(loggerInstance, poolConfigs);
workerListener.init();
2014-03-09 19:31:58 -07:00
};
2014-03-09 19:31:58 -07:00
var startBlockListener = function(portalConfig){
//block notify options
//setup block notify here and use IPC to tell appropriate pools
2014-03-09 19:31:58 -07:00
var listener = new BlocknotifyListener(portalConfig.blockNotifyListener);
listener.on('log', function(text){
logDebug('blocknotify', 'system', text);
});
listener.on('hash', function(message){
2014-03-04 12:24:02 -08:00
var ipcMessage = {type:'blocknotify', coin: message.coin, hash: message.hash};
Object.keys(cluster.workers).forEach(function(id) {
2014-03-04 12:24:02 -08:00
cluster.workers[id].send(ipcMessage);
});
});
listener.start();
2014-03-09 19:31:58 -07:00
};
2014-03-07 15:29:16 -08:00
2014-03-09 19:31:58 -07:00
var startPaymentProcessor = function(poolConfigs){
var worker = cluster.fork({
workerType: 'paymentProcessor',
pools: JSON.stringify(poolConfigs)
});
worker.on('exit', function(code, signal){
logError('paymentProcessor', 'system', 'Payment processor died, spawning replacement...');
startPaymentProcessor(poolConfigs);
});
};
2014-03-09 19:31:58 -07:00
(function init(){
var portalConfig = JSON.parse(JSON.minify(fs.readFileSync("config.json", {encoding: 'utf8'})));
var poolConfigs = buildPoolConfigs();
spawnPoolWorkers(portalConfig, poolConfigs);
startPaymentProcessor(poolConfigs);
startBlockListener(portalConfig);
startWorkerListener(poolConfigs);
})();