From f17f3b5bee58ae5e39d6cd796e1e11234cbf4bff Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Tue, 12 Jan 2016 00:38:11 -0800 Subject: [PATCH] pool: add startSync and stopSync. --- lib/bcoin/pool.js | 51 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index b7ecc9a2..bd1c21cd 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -65,6 +65,8 @@ function Pool(options) { if (!this.options.headers) this.options.multiplePeers = false; + this.syncing = false; + this.backoff = { delta: options.backoffDelta || 500, max: options.backoffMax || 5000 @@ -201,6 +203,9 @@ Pool.prototype._startTimer = function _startTimer() { this._stopTimer(); function destroy() { + if (!self.syncing) + return; + // Chain is full and up-to-date if (self.chain.isFull()) { self._stopTimer(); @@ -229,6 +234,8 @@ Pool.prototype._startInterval = function _startInterval() { this._stopInterval(); function load() { + if (!self.syncing) + return; // self._load(); } @@ -301,12 +308,16 @@ Pool.prototype._addLoader = function _addLoader() { }); peer.once('ack', function() { + if (!self.syncing) + return; peer.updateWatch(); if (!self._load()) self._stopTimer(); }); peer.on('merkleblock', function(block) { + if (!self.syncing) + return; // If the peer sent us a block that was added // to the chain (not orphans), reset the timeout. if (self._handleBlock(block, peer)) { @@ -316,6 +327,8 @@ Pool.prototype._addLoader = function _addLoader() { }); peer.on('block', function(block) { + if (!self.syncing) + return; // If the peer sent us a block that was added // to the chain (not orphans), reset the timeout. if (self._handleBlock(block, peer)) { @@ -326,20 +339,50 @@ Pool.prototype._addLoader = function _addLoader() { if (self.options.headers) { peer.on('blocks', function(hashes) { + if (!self.syncing) + return; self._handleInv(hashes, peer); }); peer.on('headers', function(headers) { + if (!self.syncing) + return; self._handleHeaders(headers, peer); }); } else { peer.on('blocks', function(hashes) { + if (!self.syncing) + return; self._handleBlocks(hashes, peer); }); } +}; + +Pool.prototype.startSync = function startSync() { + this.syncing = true; this._startInterval(); this._startTimer(); + + if (!this.peers.load) { + this._addLoader(); + return; + } + + if (this.peers.load.ack) { + if (!this._load()) + this._stopTimer(); + } +}; + +Pool.prototype.stopSync = function stopSync() { + if (!this.syncing) + return; + + this.syncing = false; + + this._stopInterval(); + this._stopTimer(); }; Pool.prototype._handleHeaders = function _handleHeaders(headers, peer) { @@ -574,6 +617,9 @@ Pool.prototype._load = function _load() { var self = this; var next; + if (!this.syncing) + return true; + if (this.request.queue.length >= this.load.hwm) { this.load.hiReached = true; return false; @@ -1000,7 +1046,6 @@ Pool.prototype.searchWallet = function(w) { ); }); - // this.search(ts); this.chain.resetTime(ts); }; @@ -1085,10 +1130,12 @@ Pool.prototype.search = function search(id, range, e) { this.chain.resetTime(range.start); + this.stopSync(); + if (this.peers.load) this.peers.load.destroy(); - this._load(); + this.startSync(); return e; }