From 5bea36edc684ea52065d77e1c797af40e2fc07c6 Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Mon, 11 Apr 2016 10:14:36 -0400 Subject: [PATCH] bitcoind: try querying all bitcoind nodes --- lib/services/bitcoind.js | 34 +++++++++++++++++++++++----------- regtest/cluster.js | 4 +--- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/services/bitcoind.js b/lib/services/bitcoind.js index 220a8e53..77cabe92 100644 --- a/lib/services/bitcoind.js +++ b/lib/services/bitcoind.js @@ -235,6 +235,10 @@ Bitcoin.prototype._resetCaches = function() { this.summaryCache.reset(); }; +Bitcoin.prototype._tryAll = function(func, callback) { + async.retry({times: this.nodes.length, interval: 1000}, func, callback); +}; + Bitcoin.prototype._wrapRPCError = function(errObj) { var err = new Error(errObj.message); err.code = errObj.code; @@ -1036,14 +1040,16 @@ Bitcoin.prototype.getBlock = function(blockArg, callback) { var self = this; function queryBlock(blockhash) { - self.client.getBlock(blockhash, false, function(err, response) { - if (err) { - return callback(self._wrapRPCError(err)); - } - var blockObj = bitcore.Block.fromString(response.result); - self.blockCache.set(blockhash, blockObj); - callback(null, blockObj); - }); + self._tryAll(function(done) { + self.client.getBlock(blockhash, false, function(err, response) { + if (err) { + return done(self._wrapRPCError(err)); + } + var blockObj = bitcore.Block.fromString(response.result); + self.blockCache.set(blockhash, blockObj); + done(null, blockObj); + }); + }, callback); } var cachedBlock = self.blockCache.get(blockArg); @@ -1053,11 +1059,17 @@ Bitcoin.prototype.getBlock = function(blockArg, callback) { }); } else { if (_.isNumber(blockArg)) { - self.client.getBlockHash(blockArg, function(err, response) { + self._tryAll(function(done) { + self.client.getBlockHash(blockArg, function(err, response) { + if (err) { + return done(self._wrapRPCError(err)); + } + done(null, response.result); + }); + }, function(err, blockhash) { if (err) { - return callback(self._wrapRPCError(err)); + return callback(err); } - var blockhash = response.result; queryBlock(blockhash); }); } else { diff --git a/regtest/cluster.js b/regtest/cluster.js index 30db5377..51a6e573 100644 --- a/regtest/cluster.js +++ b/regtest/cluster.js @@ -157,9 +157,7 @@ describe('Bitcoin Cluster', function() { it('step 2: receive block events', function(done) { this.timeout(10000); node.services.bitcoind.once('tip', function() { - setTimeout(function() { - done(); - }, 1000); + done(); }); node.generateBlock(1, function(err, hashes) { if (err) {