diff --git a/app/lib/sync.js b/app/lib/sync.js index f4f11562e89b9797643ed29eb3ba6a3edd533847..9cb2661d0ffa48ba8f435e17a249daf2789e76c4 100644 --- a/app/lib/sync.js +++ b/app/lib/sync.js @@ -1,20 +1,16 @@ "use strict"; var co = require('co'); -var async = require('async'); var _ = require('underscore'); var Q = require('q'); -var superagent = require("superagent"); var sha1 = require('sha1'); var moment = require('moment'); var vucoin = require('vucoin'); -var lokijs = require('lokijs'); var dos2unix = require('./dos2unix'); var localValidator = require('./localValidator'); var logger = require('./logger')('sync'); var rawer = require('../lib/rawer'); var constants = require('../lib/constants'); var Peer = require('../lib/entity/peer'); -var BlockDAL = require('../lib/dal/fileDALs/BlockDAL'); var multimeter = require('multimeter'); var CONST_BLOCKS_CHUNK = 500; @@ -54,8 +50,6 @@ module.exports = function Synchroniser (server, host, port, conf, interactive) { var node = yield getVucoin(host, port, vucoinOptions); logger.info('Sync started.'); - let loki = new lokijs('download', { autosave: false }); - let downloadedDAL = new BlockDAL(loki); var lastSavedNumber = yield server.dal.getLastSavedBlockFileNumber(); var lCurrent = yield dal.getCurrentBlockOrNull(); @@ -99,13 +93,7 @@ module.exports = function Synchroniser (server, host, port, conf, interactive) { logger.info('Blocks #%s to #%s...', chunk[0], chunk[1]); var blocks = yield Q.nfcall(node.blockchain.blocks, chunk[1] - chunk[0] + 1, chunk[0]); watcher.downloadPercent(Math.floor(chunk[1] / remoteNumber * 100)); - if (cautious) { - for (let i = 0; i < blocks.length; i++) { - yield downloadedDAL.saveBlock(blocks[i]); - } - } else { - chunk[2] = blocks; - } + chunk[2] = blocks; }) // Resolve the promise .then(() => @@ -116,39 +104,42 @@ module.exports = function Synchroniser (server, host, port, conf, interactive) { }) )); - if (cautious) { - for (let i = 0; i < toApply.length; i++) { - // Wait for download chunk to be completed - let range = yield toApply[i].promise; - // Apply downloaded blocks - for (var j = range[0]; j < range[1] + 1; j++) { - yield downloadedDAL.getBlock(j).then((block) => applyGivenBlock(cautious, remoteNumber)(block)); - } + function incrementBlocks(increment) { + blocksApplied += increment; + speed = blocksApplied / Math.round(Math.max((new Date() - syncStart) / 1000, 1)); + if (watcher.appliedPercent() != Math.floor((blocksApplied + localNumber) / remoteNumber * 100)) { + watcher.appliedPercent(Math.floor((blocksApplied + localNumber) / remoteNumber * 100)); } - } else { - // Reduce fork window to zero - yield BlockchainService.pruneAllForks(); - // Wait for all downloads to be done - // Do not use the first which stands for blocks applied before sync - let toApplyNoCautious = toApply.slice(1); - for (let i = 0; i < toApplyNoCautious.length; i++) { - // Wait for download chunk to be completed - let chunk = yield toApplyNoCautious[i].promise; - let blocks = chunk[2]; - blocks = _.sortBy(blocks, 'number'); - logger.info("Applying blocks #%s to #%s...", blocks[0].number, blocks[blocks.length - 1].number); - yield BlockchainService.saveBlocksInMainBranch(blocks, remoteNumber); - blocksApplied += blocks.length; - speed = blocksApplied / Math.round(Math.max((new Date() - syncStart) / 1000, 1)); - if (watcher.appliedPercent() != Math.floor(blocks[blocks.length - 1].number / remoteNumber * 100)) { - watcher.appliedPercent(Math.floor(blocks[blocks.length - 1].number / remoteNumber * 100)); + } + + // Do not use the first which stands for blocks applied before sync + let toApplyNoCautious = toApply.slice(1); + for (let i = 0; i < toApplyNoCautious.length; i++) { + // Wait for download chunk to be completed + let chunk = yield toApplyNoCautious[i].promise; + let blocks = chunk[2]; + blocks = _.sortBy(blocks, 'number'); + logger.info("Applying blocks #%s to #%s...", blocks[0].number, blocks[blocks.length - 1].number); + if (cautious) { + for (let j = 0, len = blocks.length; j < len; j++) { + yield applyGivenBlock(cautious, remoteNumber)(blocks[j]); + incrementBlocks(1); } + } else { + yield BlockchainService.saveBlocksInMainBranch(blocks, remoteNumber); + incrementBlocks(blocks.length); } + } + + // Specific treatment for nocautious + if (!cautious) { let lastChunk = yield toApplyNoCautious[toApplyNoCautious.length - 1].promise; let lastBlocks = lastChunk[2]; let lastBlock = lastBlocks[lastBlocks.length - 1]; yield BlockchainService.obsoleteInMainBranch(lastBlock); } + + // Finished blocks yield Q.all(toApply).then(() => watcher.appliedPercent(100.0)); // Save currency parameters given by root block