mempool: add reset method.

This commit is contained in:
Christopher Jeffrey 2016-11-26 00:21:31 -08:00
parent 2dbeb07668
commit 3e37961927
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
3 changed files with 120 additions and 24 deletions

View File

@ -43,22 +43,47 @@ var FREE_THRESHOLD = constants.tx.FREE_THRESHOLD;
* Confirmation stats. * Confirmation stats.
* @exports ConfirmStats * @exports ConfirmStats
* @constructor * @constructor
* @param {Number} buckets
* @param {Number} maxConfirms
* @param {Number} decay
* @param {String} type * @param {String} type
* @param {Logger} logger
*/ */
function ConfirmStats(buckets, maxConfirms, decay, type, logger) { function ConfirmStats(type, logger) {
var i;
if (!(this instanceof ConfirmStats)) if (!(this instanceof ConfirmStats))
return new ConfirmStats(buckets, maxConfirms, decay, type, logger); return new ConfirmStats(type, logger);
this.logger = logger || Logger.global; this.logger = logger || Logger.global;
this.type = type;
this.decay = 0;
this.maxConfirms = 0;
this.buckets = new Float64Array(0);
this.bucketMap = new DoubleMap();
this.confAvg = [];
this.curBlockConf = [];
this.unconfTX = [];
this.oldUnconfTX = new Int32Array(0);
this.curBlockTX = new Int32Array(0);
this.txAvg = new Float64Array(0);
this.curBlockVal = new Float64Array(0);
this.avg = new Float64Array(0);
}
/**
* Initialize stats.
* @param {Array} buckets
* @param {Number} maxConfirms
* @param {Number} decay
* @private
*/
ConfirmStats.prototype.init = function init(buckets, maxConfirms, decay) {
var i;
this.maxConfirms = maxConfirms; this.maxConfirms = maxConfirms;
this.decay = decay; this.decay = decay;
this.type = type;
this.buckets = new Float64Array(buckets.length); this.buckets = new Float64Array(buckets.length);
this.bucketMap = new DoubleMap(); this.bucketMap = new DoubleMap();
@ -83,7 +108,7 @@ function ConfirmStats(buckets, maxConfirms, decay, type, logger) {
this.txAvg = new Float64Array(buckets.length); this.txAvg = new Float64Array(buckets.length);
this.curBlockVal = new Float64Array(buckets.length); this.curBlockVal = new Float64Array(buckets.length);
this.avg = new Float64Array(buckets.length); this.avg = new Float64Array(buckets.length);
} };
/** /**
* Clear data for the current block. * Clear data for the current block.
@ -374,7 +399,9 @@ ConfirmStats.fromRaw = function fromRaw(data, type, logger) {
throw new Error('Mismatch in fee/pri conf average bucket count.'); throw new Error('Mismatch in fee/pri conf average bucket count.');
} }
stats = new ConfirmStats(buckets, maxConfirms, decay, type, logger); stats = new ConfirmStats(type, logger);
stats.init(buckets, maxConfirms, decay);
stats.avg = avg; stats.avg = avg;
stats.txAvg = txAvg; stats.txAvg = txAvg;
@ -392,14 +419,9 @@ ConfirmStats.fromRaw = function fromRaw(data, type, logger) {
*/ */
function PolicyEstimator(minRelay, network, logger) { function PolicyEstimator(minRelay, network, logger) {
var fee, priority, boundary;
if (!(this instanceof PolicyEstimator)) if (!(this instanceof PolicyEstimator))
return new PolicyEstimator(minRelay, network, logger); return new PolicyEstimator(minRelay, network, logger);
fee = [];
priority = [];
this.network = Network.get(network); this.network = Network.get(network);
this.logger = logger || Logger.global; this.logger = logger || Logger.global;
@ -411,6 +433,31 @@ function PolicyEstimator(minRelay, network, logger) {
? MIN_PRIORITY ? MIN_PRIORITY
: FREE_THRESHOLD; : FREE_THRESHOLD;
this.feeStats = new ConfirmStats('FeeRate', this.logger);
this.priStats = new ConfirmStats('Priority', this.logger);
this.feeUnlikely = 0;
this.feeLikely = INF_FEERATE;
this.priUnlikely = 0;
this.priLikely = INF_PRIORITY;
this.map = {};
this.mapSize = 0;
this.bestHeight = 0;
this.init();
}
/**
* Initialize the estimator.
* @private
*/
PolicyEstimator.prototype.init = function init() {
var fee = [];
var priority = [];
var boundary;
for (boundary = this.minTrackedFee; for (boundary = this.minTrackedFee;
boundary <= MAX_FEERATE; boundary <= MAX_FEERATE;
boundary *= FEE_SPACING) { boundary *= FEE_SPACING) {
@ -427,24 +474,26 @@ function PolicyEstimator(minRelay, network, logger) {
priority.push(INF_PRIORITY); priority.push(INF_PRIORITY);
this.feeStats = new ConfirmStats( this.feeStats.init(fee, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY);
fee, MAX_BLOCK_CONFIRMS, this.priStats.init(priority, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY);
DEFAULT_DECAY, 'FeeRate', };
this.logger);
this.priStats = new ConfirmStats( /**
priority, MAX_BLOCK_CONFIRMS, * Reset the estimator.
DEFAULT_DECAY, 'Priority', */
this.logger);
PolicyEstimator.prototype.reset = function reset() {
this.feeUnlikely = 0; this.feeUnlikely = 0;
this.feeLikely = INF_FEERATE; this.feeLikely = INF_FEERATE;
this.priUnlikely = 0; this.priUnlikely = 0;
this.priLikely = INF_PRIORITY; this.priLikely = INF_PRIORITY;
this.map = {}; this.map = {};
this.mapSize = 0; this.mapSize = 0;
this.bestHeight = 0; this.bestHeight = 0;
}
this.init();
};
/** /**
* Stop tracking a tx. Remove from map. * Stop tracking a tx. Remove from map.

View File

@ -240,6 +240,46 @@ Mempool.prototype._removeBlock = function removeBlock(block) {
this.rejects.reset(); this.rejects.reset();
}; };
/**
* Reset the mempool.
* @returns {Promise}
*/
Mempool.prototype.reset = co(function* reset() {
var unlock = yield this.locker.lock();
try {
return this._reset();
} finally {
unlock();
}
});
/**
* Reset the mempool without a lock.
* @private
*/
Mempool.prototype._reset = function reset() {
this.size = 0;
this.totalOrphans = 0;
this.totalTX = 0;
this.waiting = {};
this.orphans = {};
this.tx = {};
this.spents = {};
this.coinIndex.reset();
this.txIndex.reset();
this.freeCount = 0;
this.lastTime = 0;
if (this.fees)
this.fees.reset();
this.rejects.reset();
};
/** /**
* Ensure the size of the mempool stays below 300mb. * Ensure the size of the mempool stays below 300mb.
* @param {Hash} entryHash - TX that initiated the trim. * @param {Hash} entryHash - TX that initiated the trim.
@ -1810,6 +1850,11 @@ function AddressIndex(mempool) {
this.map = {}; this.map = {};
} }
AddressIndex.prototype.reset = function reset() {
this.index = {};
this.map = {};
};
AddressIndex.prototype.getTX = function getTX(address) { AddressIndex.prototype.getTX = function getTX(address) {
var items = this.index[address]; var items = this.index[address];
var out = []; var out = [];

View File

@ -218,6 +218,8 @@ FullNode.prototype._init = function _init() {
this.chain.on('reset', function(tip) { this.chain.on('reset', function(tip) {
self.emit('reset', tip); self.emit('reset', tip);
self.mempool.reset().catch(onError);
}); });
this.miner.on('block', function(block) { this.miner.on('block', function(block) {