errors in sync header
This commit is contained in:
parent
92dc356b0b
commit
18bbe828cd
@ -26,6 +26,6 @@ module.exports.broadcast_address_tx = function(address, tx) {
|
|||||||
ios.sockets.in(address).emit('atx', tx);
|
ios.sockets.in(address).emit('atx', tx);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports.broadcastSyncInfo = function(syncInfo) {
|
module.exports.broadcastSyncInfo = function(historicSync) {
|
||||||
ios.sockets.in('sync').emit('status', syncInfo);
|
ios.sockets.in('sync').emit('status', historicSync);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -50,6 +50,6 @@ exports.show = function(req, res) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
exports.sync = function(req, res) {
|
exports.sync = function(req, res) {
|
||||||
if (req.syncInfo)
|
if (req.historicSync)
|
||||||
res.jsonp(req.syncInfo);
|
res.jsonp(req.historicSync.info());
|
||||||
};
|
};
|
||||||
|
|||||||
@ -31,7 +31,7 @@ module.exports = function(app, historicSync) {
|
|||||||
|
|
||||||
//custom middleware
|
//custom middleware
|
||||||
function setHistoric(req, res, next) {
|
function setHistoric(req, res, next) {
|
||||||
req.syncInfo = historicSync.syncInfo;
|
req.historicSync = historicSync;
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
app.use('/api/sync', setHistoric);
|
app.use('/api/sync', setHistoric);
|
||||||
|
|||||||
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
require('classtool');
|
require('classtool');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function spec() {
|
function spec() {
|
||||||
var util = require('util');
|
var util = require('util');
|
||||||
var RpcClient = require('bitcore/RpcClient').class();
|
var RpcClient = require('bitcore/RpcClient').class();
|
||||||
@ -12,6 +14,9 @@ function spec() {
|
|||||||
var Sync = require('./Sync').class();
|
var Sync = require('./Sync').class();
|
||||||
var sockets = require('../app/controllers/socket.js');
|
var sockets = require('../app/controllers/socket.js');
|
||||||
|
|
||||||
|
|
||||||
|
var BAD_GEN_ERROR = 'Bad genesis block. Network mismatch between Insight and bitcoind? Insight is configured for:';
|
||||||
|
|
||||||
function HistoricSync(opts) {
|
function HistoricSync(opts) {
|
||||||
this.network = config.network === 'testnet' ? networks.testnet: networks.livenet;
|
this.network = config.network === 'testnet' ? networks.testnet: networks.livenet;
|
||||||
|
|
||||||
@ -22,7 +27,12 @@ function spec() {
|
|||||||
|
|
||||||
//available status: new / syncing / finished / aborted
|
//available status: new / syncing / finished / aborted
|
||||||
this.status = 'new';
|
this.status = 'new';
|
||||||
this.syncInfo = {};
|
this.error = null;
|
||||||
|
|
||||||
|
this.syncPercentage = 0;
|
||||||
|
this.syncedBlocks = 0;
|
||||||
|
this.skippedBlocks = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function p() {
|
function p() {
|
||||||
@ -34,6 +44,13 @@ function spec() {
|
|||||||
console.log.apply(this, args);
|
console.log.apply(this, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HistoricSync.prototype.setError = function(err) {
|
||||||
|
var self = this;
|
||||||
|
self.error = err.toString();
|
||||||
|
self.status='error';
|
||||||
|
self.showProgress();
|
||||||
|
};
|
||||||
|
|
||||||
HistoricSync.prototype.init = function(opts, cb) {
|
HistoricSync.prototype.init = function(opts, cb) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
@ -41,17 +58,15 @@ function spec() {
|
|||||||
self.opts = opts;
|
self.opts = opts;
|
||||||
self.sync.init(opts, function(err) {
|
self.sync.init(opts, function(err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
self.err = err.message;
|
self.setError(err);
|
||||||
self.syncInfo = util._extend(self.syncInfo, { error: err.message });
|
|
||||||
return cb(err);
|
return cb(err);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// check testnet?
|
// check testnet?
|
||||||
self.rpc.getBlockHash(0, function(err, res){
|
self.rpc.getBlockHash(0, function(err, res){
|
||||||
if (!err && ( res && res.result !== self.genesis)) {
|
if (!err && ( res && res.result !== self.genesis)) {
|
||||||
self.err = 'Bad genesis block. Network mismatch between Insight and bitcoind? Insight is configured for:' + config.network;
|
err = new Error(BAD_GEN_ERROR + config.network);
|
||||||
err = new Error(self.err);
|
self.setError(err);
|
||||||
self.syncInfo = util._extend(self.syncInfo, { error: err.message });
|
|
||||||
}
|
}
|
||||||
return cb(err);
|
return cb(err);
|
||||||
});
|
});
|
||||||
@ -64,14 +79,29 @@ function spec() {
|
|||||||
this.sync.close();
|
this.sync.close();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
HistoricSync.prototype.info = function() {
|
||||||
|
return {
|
||||||
|
status: this.status,
|
||||||
|
blockChainHeight: this.blockChainHeight,
|
||||||
|
syncPercentage: this.syncPercentage,
|
||||||
|
skippedBlocks: this.skippedBlocks,
|
||||||
|
syncedBlocks: this.syncedBlocks,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
HistoricSync.prototype.showProgress = function() {
|
HistoricSync.prototype.showProgress = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var i = self.syncInfo;
|
if (self.error) {
|
||||||
var per = parseInt(100 * i.syncedBlocks / i.blocksToSync);
|
p('ERROR:' + self.error);
|
||||||
p(util.format('status: %d/%d [%d%%]', i.syncedBlocks, i.blocksToSync, per));
|
}
|
||||||
|
else {
|
||||||
|
self.syncPercentage = parseFloat(100 * self.syncedBlocks / self.blockChainHeight).toFixed(3);
|
||||||
|
p(util.format('status: [%d%%] skipped: %d', self.syncPercentage, self.skippedBlocks));
|
||||||
|
}
|
||||||
if (self.opts.shouldBroadcast) {
|
if (self.opts.shouldBroadcast) {
|
||||||
sockets.broadcastSyncInfo(self.syncInfo);
|
sockets.broadcastSyncInfo(self.info());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -105,17 +135,10 @@ function spec() {
|
|||||||
},
|
},
|
||||||
//show some (inacurate) status
|
//show some (inacurate) status
|
||||||
function(c) {
|
function(c) {
|
||||||
if (!self.step) {
|
if ( ( self.syncedBlocks + self.skippedBlocks) % self.step === 1) {
|
||||||
var step = parseInt(self.syncInfo.blocksToSync / 100);
|
|
||||||
if (self.opts.progressStep) {
|
|
||||||
step = self.opts.progressStep;
|
|
||||||
}
|
|
||||||
if (step < 2) step = 2;
|
|
||||||
self.step = step;
|
|
||||||
}
|
|
||||||
if (self.syncInfo.syncedBlocks % self.step === 1) {
|
|
||||||
self.showProgress();
|
self.showProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
return c();
|
return c();
|
||||||
},
|
},
|
||||||
//get Info from RPC
|
//get Info from RPC
|
||||||
@ -154,57 +177,49 @@ function spec() {
|
|||||||
], function(err) {
|
], function(err) {
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
self.err = util.format('ERROR: @%s: %s [count: syncedBlocks: %d]', blockHash, err, self.syncInfo.syncedBlocks);
|
self.err = util.format('ERROR: @%s: %s [count: syncedBlocks: %d]', blockHash, err, self.syncedBlocks);
|
||||||
self.status = 'aborted';
|
self.status = 'aborted';
|
||||||
|
self.showProgress();
|
||||||
p(self.err);
|
p(self.err);
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
self.err = null;
|
self.err = null;
|
||||||
self.status = 'syncing';
|
self.status = 'syncing';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts.upToExisting && existed) {
|
if ( (opts.upToExisting && existed && self.syncedBlocks >= self.blockChainHeight) ||
|
||||||
var diff = self.syncInfo.blocksToSync - self.syncInfo.syncedBlocks;
|
(blockEnd && blockEnd === blockHash)) {
|
||||||
if (diff <= 0) {
|
|
||||||
self.status = 'finished';
|
self.status = 'finished';
|
||||||
p('DONE. Found existing block: ', blockHash);
|
p('DONE. Found existing block: ', blockHash);
|
||||||
|
self.showProgress();
|
||||||
return cb(err);
|
return cb(err);
|
||||||
}
|
|
||||||
else {
|
|
||||||
self.syncInfo.skipped_blocks = self.syncInfo.skipped_blocks || 1;
|
|
||||||
if ((self.syncInfo.skipped_blocks++ % 1000) === 1) {
|
|
||||||
p('WARN found target block\n\tbut blockChain Height is still higher that ours. Previous light sync must be interrupted.\n\tWill keep syncing.', self.syncInfo.syncedBlocks, self.syncInfo.blocksToSync, self.syncInfo.skipped_blocks);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blockEnd && blockEnd === blockHash) {
|
|
||||||
self.status = 'finished';
|
|
||||||
p('DONE. Found END block: ', blockHash);
|
|
||||||
return cb(err);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Continue
|
// Continue
|
||||||
if (blockInfo && blockInfo.result) {
|
if (blockInfo && blockInfo.result) {
|
||||||
if (!existed) self.syncInfo.syncedBlocks++;
|
|
||||||
if (opts.prev && blockInfo.result.previousblockhash) {
|
|
||||||
return self.getPrevNextBlock(blockInfo.result.previousblockhash, blockEnd, opts, cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (opts.next && blockInfo.result.nextblockhash) return self.getPrevNextBlock(blockInfo.result.nextblockhash, blockEnd, opts, cb);
|
if (existed)
|
||||||
|
self.skippedBlocks++;
|
||||||
|
else
|
||||||
|
self.syncedBlocks++;
|
||||||
|
|
||||||
|
// recursion
|
||||||
|
if (opts.prev && blockInfo.result.previousblockhash)
|
||||||
|
return self.getPrevNextBlock(blockInfo.result.previousblockhash, blockEnd, opts, cb);
|
||||||
|
|
||||||
|
if (opts.next && blockInfo.result.nextblockhash)
|
||||||
|
return self.getPrevNextBlock(blockInfo.result.nextblockhash, blockEnd, opts, cb);
|
||||||
}
|
}
|
||||||
return cb(err);
|
return cb(err);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
HistoricSync.prototype.import_history = function(opts, next) {
|
HistoricSync.prototype.importHistory = function(opts, next) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var retry_secs = 2;
|
var retry_secs = 2;
|
||||||
|
|
||||||
var bestBlock;
|
var bestBlock;
|
||||||
var blockChainHeight;
|
|
||||||
|
|
||||||
async.series([
|
async.series([
|
||||||
function(cb) {
|
function(cb) {
|
||||||
@ -220,14 +235,14 @@ function spec() {
|
|||||||
|
|
||||||
self.rpc.getBlockCount(function(err, res) {
|
self.rpc.getBlockCount(function(err, res) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
blockChainHeight = res.result;
|
self.blockChainHeight = res.result;
|
||||||
return cb();
|
return cb();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
function(cb) {
|
function(cb) {
|
||||||
if (!opts.reverse) return cb();
|
if (!opts.reverse) return cb();
|
||||||
|
|
||||||
self.rpc.getBlockHash(blockChainHeight, function(err, res) {
|
self.rpc.getBlockHash(self.blockChainHeight, function(err, res) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
bestBlock = res.result;
|
bestBlock = res.result;
|
||||||
@ -236,15 +251,8 @@ function spec() {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
function(cb) {
|
function(cb) {
|
||||||
// This is only to inform progress.
|
if (opts.upToExisting) {
|
||||||
if (!opts.upToExisting) {
|
|
||||||
self.rpc.getInfo(function(err, res) {
|
|
||||||
if (err) return cb(err);
|
|
||||||
self.syncInfo.blocksToSync = res.result.blocks;
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// should be isOrphan = true or null to be more accurate.
|
// should be isOrphan = true or null to be more accurate.
|
||||||
Block.count({
|
Block.count({
|
||||||
isOrphan: null
|
isOrphan: null
|
||||||
@ -252,14 +260,12 @@ function spec() {
|
|||||||
function(err, count) {
|
function(err, count) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
self.syncInfo.blocksToSync = blockChainHeight - count;
|
self.syncedBlocks = count || 0;
|
||||||
if (self.syncInfo.blocksToSync < 1) self.syncInfo.blocksToSync = 1;
|
|
||||||
return cb();
|
return cb();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
], function(err) {
|
], function(err) {
|
||||||
|
|
||||||
var start, end;
|
var start, end;
|
||||||
function sync() {
|
function sync() {
|
||||||
if (opts.reverse) {
|
if (opts.reverse) {
|
||||||
@ -272,18 +278,6 @@ function spec() {
|
|||||||
end = null;
|
end = null;
|
||||||
opts.next = true;
|
opts.next = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.syncInfo = util._extend(self.syncInfo, {
|
|
||||||
start: start,
|
|
||||||
isStartGenesis: start === self.genesis,
|
|
||||||
end: end,
|
|
||||||
isEndGenesis: end === self.genesis,
|
|
||||||
scanningForward: opts.next,
|
|
||||||
scanningBackward: opts.prev,
|
|
||||||
upToExisting: opts.upToExisting,
|
|
||||||
syncedBlocks: 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
p('Starting from: ', start);
|
p('Starting from: ', start);
|
||||||
p(' to : ', end);
|
p(' to : ', end);
|
||||||
p(' opts: ', JSON.stringify(opts));
|
p(' opts: ', JSON.stringify(opts));
|
||||||
@ -300,10 +294,20 @@ function spec() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!self.step) {
|
||||||
|
var step = parseInt( (self.blockChainHeight - self.syncedBlocks) / 100);
|
||||||
|
|
||||||
|
if (self.opts.progressStep) {
|
||||||
|
step = self.opts.progressStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (step < 100) step = 100;
|
||||||
|
self.step = step;
|
||||||
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
self.syncInfo = util._extend(self.syncInfo, {
|
self.setError(err);
|
||||||
error: err.message
|
|
||||||
});
|
|
||||||
return next(err, 0);
|
return next(err, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -313,7 +317,7 @@ function spec() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// upto if we have genesis block?
|
// upto if we have genesis block?
|
||||||
HistoricSync.prototype.smart_import = function(next) {
|
HistoricSync.prototype.smartImport = function(next) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
Block.findOne({
|
Block.findOne({
|
||||||
@ -335,7 +339,7 @@ function spec() {
|
|||||||
upToExisting: b ? true: false,
|
upToExisting: b ? true: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
return self.import_history(opts, next);
|
return self.importHistory(opts, next);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -24,10 +24,7 @@ function($scope, $routeParams, $location, $rootScope, Global, Status, Sync, get_
|
|||||||
|
|
||||||
var on_sync_update = function(sync) {
|
var on_sync_update = function(sync) {
|
||||||
|
|
||||||
if (sync.error) {
|
if (!sync.error) {
|
||||||
$scope.syncError = sync.error;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (sync.blocksToSync > sync.syncedBlocks) {
|
if (sync.blocksToSync > sync.syncedBlocks) {
|
||||||
var p = parseInt(100*(sync.syncedBlocks) / sync.blocksToSync);
|
var p = parseInt(100*(sync.syncedBlocks) / sync.blocksToSync);
|
||||||
var delta = sync.blocksToSync - sync.syncedBlocks;
|
var delta = sync.blocksToSync - sync.syncedBlocks;
|
||||||
@ -40,24 +37,23 @@ function($scope, $routeParams, $location, $rootScope, Global, Status, Sync, get_
|
|||||||
sync.tooltip = 'Synced blocks: '+sync.syncedBlocks;
|
sync.tooltip = 'Synced blocks: '+sync.syncedBlocks;
|
||||||
}
|
}
|
||||||
$scope.sync = sync;
|
$scope.sync = sync;
|
||||||
$scope.hola = 'hola';
|
|
||||||
console.log('[status.js.43:hola:]'); //TODO
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.getSync = function() {
|
$scope.getSync = function() {
|
||||||
Sync.get({},
|
Sync.get({},
|
||||||
function(sync) {
|
function(sync) {
|
||||||
$scope.syncError = null;
|
|
||||||
on_sync_update(sync);
|
on_sync_update(sync);
|
||||||
},
|
},
|
||||||
function(e) {
|
function(e) {
|
||||||
$scope.syncError = 'Could not get sync information' + e;
|
$scope.sync = { error: 'Could not get sync information' + e };
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var socket = get_socket($scope);
|
var socket = get_socket($scope);
|
||||||
socket.emit('subscribe', 'sync');
|
socket.emit('subscribe', 'sync');
|
||||||
socket.on('status', function(sync) {
|
socket.on('status', function(sync) {
|
||||||
|
|
||||||
|
console.log('[status.js.55::] sync status update received!');
|
||||||
on_sync_update(sync);
|
on_sync_update(sync);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="status" data-ng-controller="StatusController">
|
<div class="status" data-ng-controller="StatusController">
|
||||||
<span data-ng-init="getSync()">
|
<span data-ng-init="getSync()">
|
||||||
<div class="text-danger" data-ng-show="syncError" tooltip="{{sync.error}}" tooltip-placement="bottom"> ERROR </div>
|
<div class="text-danger" data-ng-show="sync.error" tooltip="{{sync.error}}" tooltip-placement="bottom"> ERROR </div>
|
||||||
|
|
||||||
<span class="small" tooltip="{{sync.tooltip}}" tooltip-placement="down">
|
<span class="small" tooltip="{{sync.tooltip}}" tooltip-placement="down">
|
||||||
<i class="{{sync.style}}"><strong> {{sync.message}} </strong></i>
|
<i class="{{sync.style}}"><strong> {{sync.message}} </strong></i>
|
||||||
|
|||||||
@ -71,11 +71,11 @@ if (!config.disableHistoricSync) {
|
|||||||
console.log('[historic_sync] ' + txt);
|
console.log('[historic_sync] ' + txt);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
historicSync.smart_import(function(err){
|
historicSync.smartImport(function(err){
|
||||||
var txt= 'ended.';
|
var txt= 'ended.';
|
||||||
if (err) txt = 'ABORTED with error: ' + err.message;
|
if (err) txt = 'ABORTED with error: ' + err.message;
|
||||||
|
|
||||||
console.log('[historic_sync] ' + txt, historicSync.syncInfo);
|
console.log('[historic_sync] ' + txt, historicSync.info());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -33,10 +33,10 @@ async.series([
|
|||||||
},
|
},
|
||||||
function(cb) {
|
function(cb) {
|
||||||
if (program.smart) {
|
if (program.smart) {
|
||||||
historicSync.smart_import(cb);
|
historicSync.smartImport(cb);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
historicSync.import_history({
|
historicSync.importHistory({
|
||||||
destroy: program.destroy,
|
destroy: program.destroy,
|
||||||
reverse: program.reverse,
|
reverse: program.reverse,
|
||||||
upToExisting: program.uptoexisting,
|
upToExisting: program.uptoexisting,
|
||||||
@ -50,7 +50,7 @@ async.series([
|
|||||||
console.log('CRITICAL ERROR: ', err);
|
console.log('CRITICAL ERROR: ', err);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.log('Finished.\n Status:\n', historicSync.syncInfo);
|
console.log('Finished.\n Status:\n', historicSync.info());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user