s-nomp/init.js

128 lines
3.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');
JSON.minify = JSON.minify || require("node-json-minify");
2014-02-20 15:13:50 -08:00
//Try to give process ability to handle 100k concurrent connections
2014-02-20 15:13:50 -08:00
try{
2014-02-20 21:46:36 -08:00
posix.setrlimit('nofile', { soft: 100000, hard: 100000 });
2014-02-20 15:13:50 -08:00
}
catch(e){
console.error(e);
}
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
if (cluster.isMaster){
2014-01-13 17:32:54 -08:00
var config = JSON.parse(JSON.minify(fs.readFileSync("config.json", {encoding: 'utf8'})));
2014-02-27 15:59:49 -08:00
//Read all coin profile json files from coins directory and build object where key is name of coin
var coinProfiles = (function(){
var profiles = {};
fs.readdirSync('coins').forEach(function(file){
var coinProfile = JSON.parse(JSON.minify(fs.readFileSync('coins/' + file, {encoding: 'utf8'})));
profiles[coinProfile.name.toLowerCase()] = coinProfile;
});
return profiles;
})();
//Read all pool configs from pool_configs and join them with their coin profile
var poolConfigs = (function(){
2014-03-03 12:51:11 -08:00
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;
if (!(poolOptions.coin.toLowerCase() in coinProfiles)){
logError(poolOptions.coin, 'system', 'could not find coin profile');
return;
}
poolOptions.coin = coinProfiles[poolOptions.coin.toLowerCase()];
2014-03-03 12:51:11 -08:00
configs[poolOptions.coin.name] = poolOptions;
});
return configs;
})();
2014-02-27 15:59:49 -08:00
2014-01-13 17:32:54 -08:00
var serializedConfigs = JSON.stringify(poolConfigs);
2014-02-27 15:59:49 -08:00
var numForks = (function(){
if (!config.clustering || !config.clustering.enabled)
return 1;
if (config.clustering.forks === 'auto')
return os.cpus().length;
if (!config.clustering.forks || isNaN(config.clustering.forks))
return 1;
return config.clustering.forks;
})();
2014-01-13 17:32:54 -08:00
for (var i = 0; i < numForks; i++) {
cluster.fork({
forkId: i,
pools: serializedConfigs
2014-01-13 17:32:54 -08:00
});
}
2014-01-13 17:32:54 -08:00
cluster.on('exit', function(worker, code, signal) {
logError('workerFork', 'system', 'fork with PID ' + worker.process.pid + ' died');
});
2014-01-13 17:32:54 -08:00
2014-02-27 15:59:49 -08:00
var workerListener = new WorkerListener(loggerInstance, poolConfigs);
workerListener.init();
//block notify options
//setup block notify here and use IPC to tell appropriate pools
var listener = new BlocknotifyListener(config.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();
}
else{
var worker = new PoolWorker(loggerInstance);
}