Skip to content
Snippets Groups Projects
Commit 3a05c69c authored by Cédric Moreau's avatar Cédric Moreau
Browse files

Fix: now pull will also check the last 10 blocks

parent 3d4b3960
No related branches found
No related tags found
No related merge requests found
...@@ -267,6 +267,36 @@ function PeeringService(server, pair, dal) { ...@@ -267,6 +267,36 @@ function PeeringService(server, pair, dal) {
var p = new Peer(peers[i]); var p = new Peer(peers[i]);
logger.info("Try with %s %s", p.getURL(), p.pubkey.substr(0, 6)); logger.info("Try with %s %s", p.getURL(), p.pubkey.substr(0, 6));
let node = yield Q.nfcall(p.connect); let node = yield Q.nfcall(p.connect);
let okUP = yield processAscendingUntilNoBlock(p, node, current);
if (okUP) {
let remoteCurrent = yield Q.nfcall(node.blockchain.current);
if (remoteCurrent.number != current.number) {
yield processLastTen(p, node, current);
}
}
try {
// Try to fork as a final treatment
let nowCurrent = yield dal.getCurrentBlockOrNull();
yield server.BlockchainService.tryToFork(nowCurrent);
} catch (e) {
logger.warn(e);
}
}
}
callback();
})
.catch((err) => {
logger.warn(err.code || err.stack || err.message || err);
callback();
});
}
function isConnectionError(err) {
return err && (err.code == "EINVAL" || err.code == "ECONNREFUSED");
}
function processAscendingUntilNoBlock(p, node, current) {
return co(function *() {
try { try {
let downloaded = yield Q.nfcall(node.blockchain.block, current.number + 1); let downloaded = yield Q.nfcall(node.blockchain.block, current.number + 1);
if (!downloaded) { if (!downloaded) {
...@@ -275,11 +305,18 @@ function PeeringService(server, pair, dal) { ...@@ -275,11 +305,18 @@ function PeeringService(server, pair, dal) {
while (downloaded) { while (downloaded) {
logger.info("Downloaded block #%s from peer %s", downloaded.number, p.getNamedURL()); logger.info("Downloaded block #%s from peer %s", downloaded.number, p.getNamedURL());
downloaded = rawifyTransactions(downloaded); downloaded = rawifyTransactions(downloaded);
try {
let res = yield server.BlockchainService.submitBlock(downloaded, true); let res = yield server.BlockchainService.submitBlock(downloaded, true);
if (!res.fork) { if (!res.fork) {
let nowCurrent = yield dal.getCurrentBlockOrNull(); let nowCurrent = yield dal.getCurrentBlockOrNull();
yield server.BlockchainService.tryToFork(nowCurrent); yield server.BlockchainService.tryToFork(nowCurrent);
} }
} catch (err) {
console.log(err);
if (isConnectionError(err)) {
throw err;
}
}
if (downloaded.number == 0) { if (downloaded.number == 0) {
downloaded = null; downloaded = null;
} else { } else {
...@@ -288,23 +325,51 @@ function PeeringService(server, pair, dal) { ...@@ -288,23 +325,51 @@ function PeeringService(server, pair, dal) {
} }
} catch (err) { } catch (err) {
logger.warn(err.code || err.message || err); logger.warn(err.code || err.message || err);
if (err && err.code == "EINVAL") { if (isConnectionError(err)) {
yield dal.setPeerDown(p.pubkey); yield dal.setPeerDown(p.pubkey);
return false;
}
}
return true;
});
} }
function processLastTen(p, node, current) {
return co(function *() {
try {
let downloaded = yield Q.nfcall(node.blockchain.block, current.number);
if (!downloaded) {
yield dal.setPeerDown(p.pubkey);
}
while (downloaded) {
logger.info("Downloaded block #%s from peer %s", downloaded.number, p.getNamedURL());
downloaded = rawifyTransactions(downloaded);
try { try {
let res = yield server.BlockchainService.submitBlock(downloaded, true);
if (!res.fork) {
let nowCurrent = yield dal.getCurrentBlockOrNull(); let nowCurrent = yield dal.getCurrentBlockOrNull();
yield server.BlockchainService.tryToFork(nowCurrent); yield server.BlockchainService.tryToFork(nowCurrent);
} catch (e) {
logger.warn(e);
} }
} catch (err) {
console.log(err);
if (isConnectionError(err)) {
throw err;
} }
} }
if (downloaded.number == 0 || downloaded.number <= current.number - 10) {
downloaded = null;
} else {
downloaded = yield Q.nfcall(node.blockchain.block, downloaded.number - 1);
} }
callback(); }
}) } catch (err) {
.catch((err) => { logger.warn(err.code || err.message || err);
logger.warn(err.code || err.stack || err.message || err); if (isConnectionError(err)) {
callback(); yield dal.setPeerDown(p.pubkey);
}
return false;
}
return true;
}); });
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment