From 6ef09f39eccfb9d30e4f58aedc07f0cd0e729ad6 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 17 Feb 2016 17:07:12 -0800 Subject: [PATCH] better events. --- lib/bcoin/blockdb.js | 8 ++++-- lib/bcoin/chain.js | 67 +++++++++++++++++++++++++++----------------- lib/bcoin/chaindb.js | 8 ++++-- lib/bcoin/pool.js | 10 +++---- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/lib/bcoin/blockdb.js b/lib/bcoin/blockdb.js index e597a78b..f48c6615 100644 --- a/lib/bcoin/blockdb.js +++ b/lib/bcoin/blockdb.js @@ -1050,7 +1050,9 @@ BlockData.prototype.closeAsync = function closeAsync(callback) { }; BlockData.prototype._malloc = function _malloc(size) { - return new Buffer(size); + if (!this.options.usePool) + return new Buffer(size); + if (size > 500) return new Buffer(size); @@ -1066,7 +1068,9 @@ BlockData.prototype._malloc = function _malloc(size) { }; BlockData.prototype._free = function _free(buf) { - return; + if (!this.options.usePool) + return; + if (this._bufferPool.used[buf.length] === buf) { assert(this._bufferPool[buf.length] === buf); delete this._bufferPool.used[buf.length]; diff --git a/lib/bcoin/chain.js b/lib/bcoin/chain.js index 1ef46053..543386ae 100644 --- a/lib/bcoin/chain.js +++ b/lib/bcoin/chain.js @@ -69,7 +69,25 @@ Chain.prototype._init = function _init() { var self = this; // Hook into events for debugging - this.on('fork', function(data, peer) { + this.on('block', function(block, entry, peer) { + var host = peer ? peer.host : 'unknown'; + // utils.debug('Block %s (%d) added to chain (%s)', + // utils.revHex(entry.hash), entry.height, host); + }); + + this.on('resolved', function(block, entry, peer) { + var host = peer ? peer.host : 'unknown'; + utils.debug('Orphan %s (%d) was resolved (%s)', + utils.revHex(entry.hash), entry.height, host); + }); + + this.on('checkpoint', function(block, data, peer) { + var host = peer ? peer.host : 'unknown'; + utils.debug('Hit checkpoint block %s (%d) (%s)', + utils.revHex(data.checkpoint), data.height, host); + }); + + this.on('fork', function(block, data, peer) { var host = peer ? peer.host : 'unknown'; utils.debug( 'Fork at height %d: expected=%s received=%s checkpoint=%s peer=%s', @@ -79,9 +97,11 @@ Chain.prototype._init = function _init() { data.checkpoint, host ); + if (data.checkpoint) + utils.debug('WARNING: Block failed a checkpoint.'); }); - this.on('invalid', function(data, peer) { + this.on('invalid', function(block, data, peer) { var host = peer ? peer.host : 'unknown'; utils.debug( 'Invalid block at height %d: hash=%s peer=%s', @@ -98,19 +118,19 @@ Chain.prototype._init = function _init() { } }); - this.on('exists', function(data, peer) { + this.on('exists', function(block, data, peer) { var host = peer ? peer.host : 'unknown'; utils.debug('Already have block %s (%s)', data.height, host); }); - this.on('orphan', function(data, peer) { + this.on('orphan', function(block, data, peer) { var host = peer ? peer.host : 'unknown'; utils.debug('Handled orphan %s (%s)', utils.revHex(data.hash), host); }); - this.on('purge', function(count, size) { - utils.debug('Warning: %dmb of orphans cleared!', utils.mb(size)); + this.on('purge', function(count, size, peer) { + utils.debug('Warning: %d (%dmb) orphans cleared!', coin, utils.mb(size)); }); this.loading = true; @@ -392,10 +412,8 @@ Chain.prototype._removeBlock = function _removeBlock(tip, callback) { if (self.mempool) self.mempool.removeBlock(block); - self.emit('reorg block', block.hash('hex')); - block.txs.forEach(function(tx) { - self.emit('reorg tx', tx.hash('hex')); + self.emit('remove', tx.hash('hex'), block.hash('hex')); }); return callback(); @@ -841,7 +859,7 @@ Chain.prototype.add = function add(initial, peer, callback) { // Do not revalidate known invalid blocks. if (self.invalid[hash] || self.invalid[prevHash]) { - self.emit('invalid', { + self.emit('invalid', block, { height: -1, hash: hash, seen: true, @@ -859,7 +877,7 @@ Chain.prototype.add = function add(initial, peer, callback) { // orphans. if (block === initial && !block.verify()) { self.invalid[hash] = true; - self.emit('invalid', { + self.emit('invalid', block, { height: prevHeight + 1, hash: hash, seen: false, @@ -875,12 +893,12 @@ Chain.prototype.add = function add(initial, peer, callback) { // If the orphan chain forked, simply // reset the orphans and find a new peer. if (orphan.hash('hex') !== hash) { - self.emit('purge', self.orphan.count, self.orphan.size); + self.emit('purge', self.orphan.count, self.orphan.size, peer); self.orphan.map = {}; self.orphan.bmap = {}; self.orphan.count = 0; self.orphan.size = 0; - self.emit('fork', { + self.emit('fork', block, { height: -1, expected: orphan.hash('hex'), received: hash, @@ -888,7 +906,7 @@ Chain.prototype.add = function add(initial, peer, callback) { }, peer); return done(); } - self.emit('orphan', { + self.emit('orphan', block, { height: -1, hash: hash, seen: true @@ -903,7 +921,7 @@ Chain.prototype.add = function add(initial, peer, callback) { self.orphan.size += block.getSize(); self.orphan.map[prevHash] = block; self.orphan.bmap[hash] = block; - self.emit('orphan', { + self.emit('orphan', block, { height: -1, hash: hash, seen: false @@ -932,18 +950,18 @@ Chain.prototype.add = function add(initial, peer, callback) { // who isn't trying to fool us. checkpoint = network.checkpoints[entry.height]; if (checkpoint) { - self.emit('checkpoint', { + self.emit('checkpoint', block, { height: entry.height, hash: entry.hash, checkpoint: checkpoint - }); + }, peer); if (hash !== checkpoint) { // Resetting to the last checkpoint _really_ isn't // necessary (even bitcoind doesn't do it), but it // could be used if you want to be on the overly // safe (see: paranoid) side. // this.resetLastCheckpoint(entry.height); - self.emit('fork', { + self.emit('fork', block, { height: entry.height, expected: network.checkpoints[entry.height], received: entry.hash, @@ -964,7 +982,7 @@ Chain.prototype.add = function add(initial, peer, callback) { // a stack overflow if there are a lot of // existing blocks. if (existing.hash === hash) { - self.emit('exists', { + self.emit('exists', block, { height: entry.height, hash: entry.hash }, peer); @@ -993,7 +1011,7 @@ Chain.prototype.add = function add(initial, peer, callback) { self.resetHeight(existing.height - 1); - self.emit('fork', { + self.emit('fork', block, { height: existing.height, expected: existing.hash, received: entry.hash, @@ -1020,7 +1038,7 @@ Chain.prototype.add = function add(initial, peer, callback) { if (!verified) { self.invalid[entry.hash] = true; - self.emit('invalid', { + self.emit('invalid', block, { height: entry.height, hash: entry.hash, seen: false, @@ -1051,10 +1069,9 @@ Chain.prototype.add = function add(initial, peer, callback) { // Emit our block (and potentially resolved // orphan) so the programmer can save it. - self.emit('block', block, peer); - self.emit('entry', entry); + self.emit('block', block, entry, peer); if (block !== initial) - self.emit('resolved', block, peer); + self.emit('resolved', block, entry, peer); // Fullfill request self.request.fullfill(hash, block); @@ -1084,7 +1101,7 @@ Chain.prototype.add = function add(initial, peer, callback) { // Failsafe for large orphan chains. Do not // allow more than 20mb stored in memory. if (self.orphan.size > self.orphanLimit) { - self.emit('purge', self.orphan.count, self.orphan.size); + self.emit('purge', self.orphan.count, self.orphan.size, peer); Object.keys(self.orphan.bmap).forEach(function(hash) { self.emit('unresolved', self.orphan.bmap[hash], peer); }); diff --git a/lib/bcoin/chaindb.js b/lib/bcoin/chaindb.js index 8ebd4f45..2f88f327 100644 --- a/lib/bcoin/chaindb.js +++ b/lib/bcoin/chaindb.js @@ -113,7 +113,9 @@ ChainDB.prototype.closeAsync = function closeAsync(callback) { }; ChainDB.prototype._malloc = function _malloc(size) { - return new Buffer(size); + if (!this.options.usePool) + return new Buffer(size); + if (!this._bufferPool[size]) this._bufferPool[size] = new Buffer(size); @@ -126,7 +128,9 @@ ChainDB.prototype._malloc = function _malloc(size) { }; ChainDB.prototype._free = function _free(buf) { - return; + if (!this.options.usePool) + return; + if (this._bufferPool.used[buf.length] === buf) { assert(this._bufferPool[buf.length] === buf); delete this._bufferPool.used[buf.length]; diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index b8c17ebc..1e576ca7 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -176,7 +176,7 @@ Pool.prototype._init = function _init() { this._addPeer(); } - this.chain.on('block', function(block, peer) { + this.chain.on('block', function(block, entry, peer) { self.emit('block', block, peer); // Emit merkle txs after the fact if (block.subtype === 'merkleblock') { @@ -186,7 +186,7 @@ Pool.prototype._init = function _init() { } }); - this.chain.on('fork', function(data, peer) { + this.chain.on('fork', function(block, data, peer) { self.emit('fork', data, peer); if (!peer) @@ -202,21 +202,21 @@ Pool.prototype._init = function _init() { peer.destroy(); }); - this.chain.on('invalid', function(data, peer) { + this.chain.on('invalid', function(block, data, peer) { if (!peer) return; self.setMisbehavior(peer, 100); }); - this.chain.on('exists', function(data, peer) { + this.chain.on('exists', function(block, data, peer) { if (!peer) return; self.setMisbehavior(peer, 1); }); - this.chain.on('orphan', function(data, peer) { + this.chain.on('orphan', function(block, data, peer) { var host = peer ? peer.host : 'unknown'; if (!peer)