diff --git a/app/lib/dal/fileDALs/BlockDAL.js b/app/lib/dal/fileDALs/BlockDAL.js index 8f04a17238c6d252605a73256ce40b344d3699bc..d2e1e0c8ab3dcee36e1e74d1f144ea6cea2d1643 100644 --- a/app/lib/dal/fileDALs/BlockDAL.js +++ b/app/lib/dal/fileDALs/BlockDAL.js @@ -191,28 +191,31 @@ function BlockDAL(loki, rootFS, getLowerWindowBlock) { if (!lowerInLoki) { return; } - logger.debug("LastUD in loki = %s", that.lastBlockWithDividend().number); - logger.debug("Lower in loki = %s", lowerInLoki.number); - let deadBlocksInLoki = number - lowerInLoki.number; - logger.debug("Dead blocks = %s", deadBlocksInLoki); - if (deadBlocksInLoki >= constants.BLOCKS_COLLECT_THRESHOLD) { - let blocksToPersist = blocksDB.branchResultset().find({ - $and: [{ - number: { $gte: lowerInLoki.number } - }, { - number: { $lte: number } - }] - }).simplesort('number').data(); - logger.debug("To store in files = %s to %s", blocksToPersist[0].number, blocksToPersist[blocksToPersist.length - 1].number); - for (let i = 0; i < blocksToPersist.length; i++) { - let block = blocksToPersist[i]; - yield rootFS.makeTree(pathOfBlock(block.number)); - yield rootFS.writeJSON(pathOfBlock(block.number) + blockFileName(block.number) + '.json', block); - collection.remove(block); + let lastUDBlock = that.lastBlockWithDividend(); + if (lastUDBlock) { + logger.debug("LastUD in loki = %s", lastUDBlock.number); + logger.debug("Lower in loki = %s", lowerInLoki.number); + let deadBlocksInLoki = number - lowerInLoki.number; + logger.debug("Dead blocks = %s", deadBlocksInLoki); + if (deadBlocksInLoki >= constants.BLOCKS_COLLECT_THRESHOLD) { + let blocksToPersist = blocksDB.branchResultset().find({ + $and: [{ + number: { $gte: lowerInLoki.number } + }, { + number: { $lte: number } + }] + }).simplesort('number').data(); + logger.debug("To store in files = %s to %s", blocksToPersist[0].number, blocksToPersist[blocksToPersist.length - 1].number); + for (let i = 0; i < blocksToPersist.length; i++) { + let block = blocksToPersist[i]; + yield rootFS.makeTree(pathOfBlock(block.number)); + yield rootFS.writeJSON(pathOfBlock(block.number) + blockFileName(block.number) + '.json', block); + collection.remove(block); + } + lowerInLoki = collection.chain().simplesort('number').limit(1).data()[0]; + logger.debug("Lower in loki now = %s", lowerInLoki.number); + logger.debug("LastUD in loki = %s", that.lastBlockWithDividend().number); } - lowerInLoki = collection.chain().simplesort('number').limit(1).data()[0]; - logger.debug("Lower in loki now = %s", lowerInLoki.number); - logger.debug("LastUD in loki = %s", that.lastBlockWithDividend().number); } }); diff --git a/app/service/BlockchainService.js b/app/service/BlockchainService.js index 084626c2b07aafe4abe3c4459e96a747c5b98d54..f4bd75775e511afc6d63136f3e88a3a2536fd7ee 100644 --- a/app/service/BlockchainService.js +++ b/app/service/BlockchainService.js @@ -193,17 +193,21 @@ function BlockchainService (conf, mainDAL, pair) { throw 'Already processed side block #' + obj.number + '-' + obj.hash; } let res = yield mainContext.addSideBlock(obj, doCheck); - yield eventuallySwitchOnSideChain(current); - let newCurrent = yield mainContext.current(); - let forked = newCurrent.number != current.number || newCurrent.hash != current.hash; - if (forked) { - yield Q.nfcall(that.stopPoWThenProcessAndRestartPoW.bind(that)); - } + yield that.tryToFork(current); return res; } }); } + that.tryToFork = (current) => co(function *() { + yield eventuallySwitchOnSideChain(current); + let newCurrent = yield mainContext.current(); + let forked = newCurrent.number != current.number || newCurrent.hash != current.hash; + if (forked) { + yield Q.nfcall(that.stopPoWThenProcessAndRestartPoW.bind(that)); + } + }); + function eventuallySwitchOnSideChain(current) { return co(function *() { let branches = yield that.branches(); diff --git a/app/service/PeeringService.js b/app/service/PeeringService.js index e5b66e80307e33b736a51a371075c740ec174e33..2dd7de85ce38aab95e10165168ec015f8e4a0e06 100644 --- a/app/service/PeeringService.js +++ b/app/service/PeeringService.js @@ -249,7 +249,7 @@ function PeeringService(server, pair, dal) { function syncBlock(callback) { return co(function *() { - let current = dal.getCurrentBlockOrNull(); + let current = yield dal.getCurrentBlockOrNull(); if (current) { logger.info("Check network for new blocks..."); let peers = yield dal.findAllPeersNEWUPBut([selfPubkey]); @@ -266,7 +266,11 @@ function PeeringService(server, pair, dal) { while (downloaded) { logger.info("Downloaded block #%s from peer %s", downloaded.number, p.getNamedURL()); downloaded = rawifyTransactions(downloaded); - yield server.BlockchainService.submitBlock(downloaded, true, FROM_PULL); + let res = yield server.BlockchainService.submitBlock(downloaded, true, FROM_PULL); + if (!res.fork) { + let nowCurrent = yield dal.getCurrentBlockOrNull(); + yield server.BlockchainService.tryToFork(nowCurrent); + } if (downloaded.number == 0) { downloaded = null; } else { @@ -277,8 +281,8 @@ function PeeringService(server, pair, dal) { logger.warn(err); } } - callback(); } + callback(); }) .catch((err) => { logger.warn(err.code || err.stack || err.message || err);