workers: make worker files configurable.

This commit is contained in:
Christopher Jeffrey 2017-07-05 14:35:09 -07:00
parent 8f295a376d
commit 4ebe557807
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
4 changed files with 40 additions and 22 deletions

View File

@ -235,6 +235,8 @@ node = new bcoin.fullnode({
coinCache: 30000000,
logConsole: true,
workers: true,
workerURL: '/bcoin-worker.js',
masterURL: '/bcoin-master.js',
logger: logger
});

View File

@ -88,7 +88,10 @@ Node.prototype.initOptions = function initOptions() {
this.workers = new WorkerPool({
enabled: config.bool('workers'),
size: config.num('workers-size'),
timeout: config.num('workers-timeout')
timeout: config.num('workers-timeout'),
workerFile: config.str('worker-file'),
workerURL: config.str('worker-url'),
masterURL: config.str('master-url')
});
};

View File

@ -84,7 +84,9 @@ Master.prototype._initWebWorkers = function _initWebWorkers() {
global.onmessage = (event) => {
let data;
if (typeof event.data !== 'string') {
data = event.data.buf;
assert(event.data && typeof event.data === 'object');
assert(event.data.data);
data = event.data.data;
data.__proto__ = Buffer.prototype;
} else {
data = Buffer.from(event.data, 'hex');
@ -110,7 +112,7 @@ Master.prototype._initChildProcess = function _initChildProcess() {
process.on('uncaughtException', (err) => {
this.send(new packets.ErrorPacket(err));
setImmediate(() => process.exit(1));
setTimeout(() => process.exit(1), 500);
});
};
@ -133,7 +135,7 @@ Master.prototype.write = function write(data) {
if (HAS_WORKERS) {
if (global.postMessage.length === 2) {
data.__proto__ = Uint8Array.prototype;
global.postMessage({ buf: data }, [data]);
global.postMessage({ data }, [data]);
} else {
global.postMessage(data.toString('hex'));
}

View File

@ -52,6 +52,10 @@ function WorkerPool(options) {
this.nonce = 0;
this.enabled = true;
this.workerFile = WorkerPool.WORKER_FILE;
this.workerURL = WorkerPool.WORKER_URL;
this.masterURL = WorkerPool.MASTER_URL;
bindExit();
pools.add(this);
@ -72,21 +76,21 @@ WorkerPool.CORES = getCores();
* @const {String}
*/
WorkerPool.WORKER_FILE = 'worker.js';
WorkerPool.WORKER_FILE = process.env.BCOIN_WORKER_FILE || 'worker.js';
/**
* Default worker URL.
* @const {String}
*/
WorkerPool.WORKER_URL = '/bcoin-worker.js';
WorkerPool.WORKER_URL = process.env.BCOIN_WORKER_URL || '/bcoin-worker.js';
/**
* Default master URL.
* @const {String}
*/
WorkerPool.MASTER_URL = '/bcoin-master.js';
WorkerPool.MASTER_URL = process.env.BCOIN_MASTER_URL || '/bcoin-master.js';
/**
* Set worker pool options.
@ -113,6 +117,21 @@ WorkerPool.prototype.set = function set(options) {
assert(options.timeout > 0);
this.timeout = options.timeout;
}
if (options.workerFile != null) {
assert(typeof options.workerFile === 'string');
this.workerFile = options.workerFile;
}
if (options.workerURL != null) {
assert(typeof options.workerURL === 'string');
this.workerURL = options.workerURL;
}
if (options.masterURL != null) {
assert(typeof options.masterURL === 'string');
this.masterURL = options.masterURL;
}
};
/**
@ -414,7 +433,7 @@ function Worker(id) {
this.pending = new Map();
this.env = {
BCOIN_MASTER_URL: process.env.BCOIN_MASTER_URL || WorkerPool.MASTER_URL,
BCOIN_MASTER_URL: this.masterURL,
BCOIN_WORKER_NETWORK: Network.type,
BCOIN_WORKER_ISTTY: process.stdout
? (process.stdout.isTTY ? '1' : '0')
@ -463,12 +482,7 @@ Worker.prototype._init = function _init() {
*/
Worker.prototype._initWebWorkers = function _initWebWorkers() {
let file = WorkerPool.WORKER_URL;
if (process.env.BCOIN_WORKER_URL)
file = process.env.BCOIN_WORKER_URL;
this.child = new global.Worker(file);
this.child = new global.Worker(this.workerURL);
this.child.onerror = (err) => {
this.emit('error', err);
@ -478,7 +492,9 @@ Worker.prototype._initWebWorkers = function _initWebWorkers() {
this.child.onmessage = (event) => {
let data;
if (typeof event.data !== 'string') {
data = event.data.buf;
assert(event.data && typeof event.data === 'object');
assert(event.data.data);
data = event.data.data;
data.__proto__ = Buffer.prototype;
} else {
data = Buffer.from(event.data, 'hex');
@ -496,15 +512,10 @@ Worker.prototype._initWebWorkers = function _initWebWorkers() {
Worker.prototype._initChildProcess = function _initChildProcess() {
let bin = process.argv[0];
let file = WorkerPool.WORKER_FILE;
let file = path.resolve(__dirname, this.workerFile);
let env = Object.assign({}, process.env, this.env);
let options = { stdio: 'pipe', env: env };
if (process.env.BCOIN_WORKER_FILE)
file = process.env.BCOIN_WORKER_FILE;
file = path.resolve(__dirname, file);
this.child = cp.spawn(bin, [file], options);
this.child.unref();
@ -601,7 +612,7 @@ Worker.prototype.write = function write(data) {
if (HAS_WORKERS) {
if (this.child.postMessage.length === 2) {
data.__proto__ = Uint8Array.prototype;
this.child.postMessage({ buf: data }, [data]);
this.child.postMessage({ data }, [data]);
} else {
this.child.postMessage(data.toString('hex'));
}