optimize chain.size()
This commit is contained in:
parent
8e698673a0
commit
c6c75d509b
@ -44,6 +44,7 @@ function Chain(options) {
|
|||||||
hashes: [],
|
hashes: [],
|
||||||
// Get height by hash
|
// Get height by hash
|
||||||
heights: {},
|
heights: {},
|
||||||
|
count: 0,
|
||||||
lastTs: 0
|
lastTs: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -165,6 +166,7 @@ Chain.prototype._addIndex = function _addIndex(entry) {
|
|||||||
this.index.entries[entry.height] = entry;
|
this.index.entries[entry.height] = entry;
|
||||||
this.index.hashes[entry.height] = entry.hash;
|
this.index.hashes[entry.height] = entry.hash;
|
||||||
this.index.heights[entry.hash] = entry.height;
|
this.index.heights[entry.hash] = entry.height;
|
||||||
|
this.index.count++;
|
||||||
|
|
||||||
this.tip = this.index.entries[this.index.entries.length - 1];
|
this.tip = this.index.entries[this.index.entries.length - 1];
|
||||||
this.emit('tip', this.tip);
|
this.emit('tip', this.tip);
|
||||||
@ -207,6 +209,11 @@ Chain.prototype.resetHeight = function resetHeight(height) {
|
|||||||
}, {});
|
}, {});
|
||||||
this.index.hashes.length = height + 1;
|
this.index.hashes.length = height + 1;
|
||||||
|
|
||||||
|
if (!this.options.fullNode)
|
||||||
|
this.index.count -= this._count(ahead);
|
||||||
|
else
|
||||||
|
this.index.count = height + 1;
|
||||||
|
|
||||||
this.tip = this.index.entries[this.index.entries.length - 1];
|
this.tip = this.index.entries[this.index.entries.length - 1];
|
||||||
this.emit('tip', this.tip);
|
this.emit('tip', this.tip);
|
||||||
|
|
||||||
@ -241,7 +248,7 @@ Chain.prototype.add = function add(block, peer) {
|
|||||||
|
|
||||||
var initial = block;
|
var initial = block;
|
||||||
var code = Chain.codes.unchanged;
|
var code = Chain.codes.unchanged;
|
||||||
var hash, prev, prevProbe, range, i, entry;
|
var hash, prev, i, entry;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// Only validate the initial block (orphans were already validated)
|
// Only validate the initial block (orphans were already validated)
|
||||||
@ -428,7 +435,7 @@ Chain.prototype.hashRange = function hashRange(start, end) {
|
|||||||
hashes = this.index.hashes.slice(start.height, end.height + 1);
|
hashes = this.index.hashes.slice(start.height, end.height + 1);
|
||||||
|
|
||||||
if (!this.options.fullNode)
|
if (!this.options.fullNode)
|
||||||
hashes = hashes.filter(Boolean);
|
hashes = this._filter(hashes);
|
||||||
|
|
||||||
return hashes;
|
return hashes;
|
||||||
};
|
};
|
||||||
@ -516,10 +523,7 @@ Chain.prototype.getNextBlock = function getNextBlock(hash) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Chain.prototype.size = function size() {
|
Chain.prototype.size = function size() {
|
||||||
// This would get called alot. TODO: Optimize.
|
return this.index.count;
|
||||||
if (!this.options.fullNode)
|
|
||||||
return this.index.entries.filter(Boolean).length;
|
|
||||||
return this.index.entries.length;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Chain.prototype.height = function height() {
|
Chain.prototype.height = function height() {
|
||||||
@ -594,13 +598,14 @@ Chain.prototype.compact = function compact(keep) {
|
|||||||
this.index.entries = {};
|
this.index.entries = {};
|
||||||
this.index.hashes = [];
|
this.index.hashes = [];
|
||||||
this.index.heights = {};
|
this.index.heights = {};
|
||||||
|
this.index.count = 0;
|
||||||
json.entries.forEach(function(entry) {
|
json.entries.forEach(function(entry) {
|
||||||
this._addIndex(ChainBlock.fromJSON(this, entry));
|
this._addIndex(ChainBlock.fromJSON(this, entry));
|
||||||
}, this);
|
}, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
Chain.prototype._compact = function _compact(keep) {
|
Chain.prototype._compact = function _compact(keep) {
|
||||||
var entries = this.index.entries.filter(Boolean);
|
var entries = this._filter(this.index.entries);
|
||||||
|
|
||||||
if (!keep)
|
if (!keep)
|
||||||
keep = 1000;
|
keep = 1000;
|
||||||
@ -666,6 +671,20 @@ Chain.prototype._delete = function(hash) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Chain.prototype._count = function(obj) {
|
||||||
|
for (var i = 0, c = 0; i < obj.length; i++)
|
||||||
|
if (obj[i])
|
||||||
|
c++;
|
||||||
|
return c;
|
||||||
|
};
|
||||||
|
|
||||||
|
Chain.prototype._filter = function(obj) {
|
||||||
|
for (var i = 0, a = []; i < obj.length; i++)
|
||||||
|
if (obj[i])
|
||||||
|
a.push(obj[i]);
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
|
||||||
Chain.prototype.toJSON = function toJSON() {
|
Chain.prototype.toJSON = function toJSON() {
|
||||||
var entries = this.index.entries;
|
var entries = this.index.entries;
|
||||||
|
|
||||||
|
|||||||
@ -529,7 +529,7 @@ Pool.prototype._addIndex = function _addIndex(block, peer) {
|
|||||||
|
|
||||||
res = this.chain.add(block, peer);
|
res = this.chain.add(block, peer);
|
||||||
|
|
||||||
if (res > 0)
|
if (res !== bcoin.chain.codes.okay)
|
||||||
this.emit('chain-error', bcoin.chain.msg(res));
|
this.emit('chain-error', bcoin.chain.msg(res));
|
||||||
|
|
||||||
// Do not emit if nothing was added to the chain
|
// Do not emit if nothing was added to the chain
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user