bitcoind: subscribe to zmq events without interval if already synced

This commit is contained in:
Braydon Fuller 2016-04-19 16:40:54 -04:00
parent 2b38f08175
commit b092adcc21
2 changed files with 38 additions and 9 deletions

View File

@ -435,11 +435,12 @@ Bitcoin.prototype._zmqTransactionHandler = function(node, message) {
Bitcoin.prototype._checkSyncedAndSubscribeZmqEvents = function(node) {
var self = this;
var interval;
interval = setInterval(function() {
function checkAndSubscribe(callback) {
// update tip
node.client.getBestBlockHash(function(err, response) {
if (err) {
return log.error(self._wrapRPCError(err));
return callback(self._wrapRPCError(err));
}
var blockhash = new Buffer(response.result, 'hex');
self._updateTip(node, blockhash);
@ -447,17 +448,36 @@ Bitcoin.prototype._checkSyncedAndSubscribeZmqEvents = function(node) {
// check if synced
node.client.getBlockchainInfo(function(err, response) {
if (err) {
return log.error(self._wrapRPCError(err));
return callback(self._wrapRPCError(err));
}
var percentSynced = response.result.verificationprogress * 100;
if (Math.round(percentSynced) >= 99) {
// subscribe to events for further updates
self._subscribeZmqEvents(node);
clearInterval(interval);
callback(null, true);
} else {
callback(null, false);
}
});
});
}, node._tipUpdateInterval || Bitcoin.DEFAULT_TIP_UPDATE_INTERVAL).unref();
}
checkAndSubscribe(function(err, synced) {
if (err) {
log.error(err);
}
if (!synced) {
interval = setInterval(function() {
checkAndSubscribe(function(err) {
if (err) {
log.error(err);
}
});
}, node._tipUpdateInterval || Bitcoin.DEFAULT_TIP_UPDATE_INTERVAL).unref();
}
});
};
Bitcoin.prototype._subscribeZmqEvents = function(node) {

View File

@ -685,11 +685,20 @@ describe('Bitcoin Service', function() {
result: '00000000000000001bb82a7f5973618cfd3185ba1ded04dd852a653f92a27c45'
});
getBestBlockHash.onCall(0).callsArgWith(0, {code: -1 , message: 'Test error'});
var getBlockchainInfo = sinon.stub().callsArgWith(0, null, {
result: {
verificationprogress: 0.99
var progress = 0.90;
function getProgress() {
progress = progress + 0.01;
return progress;
}
var info = {};
Object.defineProperty(info, 'result', {
get: function() {
return {
verificationprogress: getProgress()
};
}
});
var getBlockchainInfo = sinon.stub().callsArgWith(0, null, info);
getBlockchainInfo.onCall(0).callsArgWith(0, {code: -1, message: 'Test error'});
var node = {
_reindex: true,
@ -703,10 +712,10 @@ describe('Bitcoin Service', function() {
bitcoind._checkSyncedAndSubscribeZmqEvents(node);
setTimeout(function() {
log.error.callCount.should.equal(2);
bitcoind._updateTip.callCount.should.equal(2);
bitcoind._updateTip.callCount.should.equal(10);
bitcoind._subscribeZmqEvents.callCount.should.equal(1);
done();
}, 10);
}, 20);
});
});