diff --git a/lib/services/block/index.js b/lib/services/block/index.js index 539ac4ba..57954569 100644 --- a/lib/services/block/index.js +++ b/lib/services/block/index.js @@ -298,20 +298,22 @@ BlockService.prototype._getHash = function(blockArg) { BlockService.prototype._handleReorg = function(hash, allHeaders) { - this._reorging = true; // while this is set, we won't be sending blocks + var self = this; + + self._reorging = true; // while self is set, we won't be sending blocks log.warn('Block Service: Chain reorganization detected! Our current block tip is: ' + - this._tip.hash + ' the current block: ' + hash + '.'); + self._tip.hash + ' the current block: ' + hash + '.'); - this._findCommonAncestor(hash, allHeaders, function(err, newHash, commonAncestorHash, oldBlocks) { + self._findCommonAncestor(hash, allHeaders, function(err, newHash, commonAncestorHash, oldBlocks) { if (err) { log.error('Block Service: A common ancestor block between hash: ' + - this._tip.hash + ' (our current tip) and: ' + newHash + + self._tip.hash + ' (our current tip) and: ' + newHash + ' (the forked block) could not be found. Bitcore-node must exit.'); - this.node.stop(); + self.node.stop(); return; } @@ -319,11 +321,12 @@ BlockService.prototype._handleReorg = function(hash, allHeaders) { var commonAncestorHeader = allHeaders.get(commonAncestorHash); log.warn('Block Service: A common ancestor block was found to at hash: ' + commonAncestorHeader + '.'); - this._broadcast(this.subscriptions.reorg, 'block/reorg', [commonAncestorHeader, oldBlocks]); + self._broadcast(self.subscriptions.reorg, 'block/reorg', [commonAncestorHeader, oldBlocks]); - this._onReorg(commonAncestorHeader, oldBlocks); + self._onReorg(commonAncestorHeader, oldBlocks); - this._reorging = false; + self._reorging = false; + self._sync(); }); @@ -425,16 +428,20 @@ BlockService.prototype._processBlock = function() { function(err) { if (err) { - log.error('Block Service: Error: ' + err); - self.node.stop(); + if (!self.node.stopping) { + log.error('Block Service: Error: ' + err); + self.node.stop(); + } return; } self._db.batch(operations, function(err) { if (err) { - log.error('Block Service: Error: ' + err); - self.node.stop(); + if (!self.node.stopping) { + log.error('Block Service: Error: ' + err); + self.node.stop(); + } return; } @@ -445,8 +452,10 @@ BlockService.prototype._processBlock = function() { self._db.put(tipOps.key, tipOps.value, function(err) { if (err) { - log.error('Block Service: Error: ' + err); - self.node.stop(); + if (!self.node.stopping) { + log.error('Block Service: Error: ' + err); + self.node.stop(); + } return; } @@ -460,7 +469,6 @@ BlockService.prototype._processBlock = function() { BlockService.prototype.onBlock = function(block, callback) { var self = this; - setImmediate(function() { callback(null, [{ type: 'put', diff --git a/lib/services/db/index.js b/lib/services/db/index.js index 59933e7b..471feddf 100644 --- a/lib/services/db/index.js +++ b/lib/services/db/index.js @@ -47,8 +47,10 @@ util.inherits(DB, Service); DB.dependencies = []; DB.prototype._onError = function(err) { - log.error('Db Service: error: ' + err); - this.node.stop(); + if (!this._stopping) { + log.error('Db Service: error: ' + err); + this.node.stop(); + } }; DB.prototype._setDataPath = function() { diff --git a/lib/services/header/index.js b/lib/services/header/index.js index 865859a3..ab5e4dfd 100644 --- a/lib/services/header/index.js +++ b/lib/services/header/index.js @@ -223,7 +223,13 @@ HeaderService.prototype._onHeaders = function(headers) { value: self._encoding.encodeHeaderValue(header) }); - var newHdr = { hash: header.hash, prevHash: header.prevHash, height: header.height }; + var newHdr = { + hash: header.hash, + prevHash: header.prevHash, + height: header.height, + chainwork: header.chainwork + }; + self._headers.set(header.hash, newHdr, header.height); } @@ -249,7 +255,7 @@ HeaderService.prototype._onHeaders = function(headers) { return; } - log.debug('Header Service: ' + self._headers.getLastIndex().hash + ' is the best block hash.'); + log.debug('Header Service: ' + self._headers.getIndex(self._bestHeight).hash + ' is the best block hash.'); // at this point, we can check our header list to see if our starting tip diverged from the tip // that we have now @@ -360,19 +366,31 @@ HeaderService.prototype._getPersistedHeaders = function(callback) { }); return; } - self._headers.set(self._encoding.decodeHeaderKey(data.key).hash, header, header.height); + + // hold a bit less in memory + var newHdr = { + hash: header.hash, + prevHash: header.prevHash, + height: header.height, + chainwork: header.chainwork + }; + + self._headers.set(self._encoding.decodeHeaderKey(data.key).hash, newHdr, header.height); + }); stream.on('end', function() { + if (streamErr) { return streamErr; } - self._tip.hash = self._headers.getIndex(self._tip.height).hash; - var lastHeader = self._headers.getLastIndex(); - if (lastHeader && lastHeader.chainwork) { - self._lastChainwork = lastHeader.chainwork; - } + + var tipHeader = self._headers.getIndex(self._tip.height); + self._tip.hash = tipHeader.hash; + self._lastChainwork = tipHeader.chainwork; + self._db.batch(removalOps, callback); + }); };