Permalink
Browse files

Blockchain download fixes and improvements.

  • Loading branch information...
1 parent 2a3a539 commit 149b2e96ccb7ddcf35092daa7c5fe79937698164 f committed Jan 23, 2017
Showing with 51 additions and 9 deletions.
  1. +51 −9 src/java/nxt/BlockchainProcessorImpl.java
@@ -138,7 +138,7 @@ public void run() {
e.printStackTrace();
blacklistClean(e.getBlock(), e);
}
- catch (BlockNotAcceptedException e) { // only thrown from cpu prevalidate
+ catch (BlockNotAcceptedException e) {
e.printStackTrace();
blacklistClean(blocks.get(0), e);
}
@@ -193,7 +193,7 @@ public void run() {
}
pushBlock(currentBlock);
} catch (BlockNotAcceptedException e) {
- Logger.logMessage("Block not accepted");
+ Logger.logMessage("Block not accepted", e);
blacklistClean(currentBlock, e);
return;
}
@@ -235,6 +235,7 @@ private void blacklistClean(BlockImpl block, Exception e) {
blockCache.remove(id);
removeId = id;
}
+ lastDownloaded = block.getPreviousBlockId();
blockCache.notify();
}
}
@@ -347,12 +348,21 @@ public void run() {
peer.blacklist();
return;
}
- lastDownloaded = currentBlockId = block.getId();
+ currentBlockId = block.getId();
if(blockCache.containsKey(block.getId()) || BlockDb.hasBlock(block.getId())) {
+ lastDownloaded = currentBlockId;
continue;
}
+ if(reverseCache.containsKey(block.getPreviousBlockId())) {
+ long existingId = reverseCache.get(block.getPreviousBlockId());
+ if(existingId != block.getId()) {
+ Logger.logMessage("Aborting getMoreBlocks. Conflicting fork already in queue.");
+ return;
+ }
+ }
+
block.setPeer(peer);
int blockSize = blockData.toString().length();
block.setByteLength(blockSize);
@@ -386,6 +396,7 @@ public void run() {
forkBlocks.add(block);
}
else {
+ lastDownloaded = currentBlockId;
continue; // don't clutter cache with stuff we already have
}
}
@@ -396,15 +407,17 @@ public void run() {
if(forkBlocks.size() == 0) { // keep old cache separate from fork. blindly adding to reverseCache could cause it to end up in an uncleanable state
// Add to Blockcache
- BlockchainProcessorImpl.blockCache.put(lastDownloaded, block);
+ BlockchainProcessorImpl.blockCache.put(block.getId(), block);
// Add to reverse cache
BlockchainProcessorImpl.reverseCache.put(prevId, currentBlockId);
// Mark for threaded poc verification
- BlockchainProcessorImpl.unverified.add(lastDownloaded);
+ BlockchainProcessorImpl.unverified.add(block.getId());
blockCacheSize += blockSize;
+
+ lastDownloaded = currentBlockId;
}
} catch (RuntimeException | NxtException.ValidationException e) {
@@ -697,10 +710,39 @@ public int getMinRollbackHeight() {
public void processPeerBlock(JSONObject request) throws NxtException {
BlockImpl block = BlockImpl.parseBlock(request);
synchronized (blockchain) {
- Block prevBlock = blockchain.getLastBlock();
- if(block.getPreviousBlockId() == prevBlock.getId()) {
- block.setHeight(prevBlock.getHeight() + 1);
- pushBlock(block);
+ synchronized (blockCache) {
+ Block prevBlock = blockchain.getLastBlock();
+ if(blockCache.containsKey(block.getPreviousBlockId()) && !(reverseCache.containsKey(block.getPreviousBlockId()))) {
+ prevBlock = blockCache.get(block.getPreviousBlockId());
+ }
+ if (block.getPreviousBlockId() == prevBlock.getId()) {
+ if(reverseCache.containsKey(prevBlock.getId())) {
+ Long existingId = reverseCache.get(prevBlock.getId());
+ if(existingId != block.getId()) {
+ Logger.logMessage("Ignoring peer broadcast block with ID " + Convert.toUnsignedLong(block.getId())
+ + ". Conflicting block " + Convert.toUnsignedLong(existingId) + " already exists in queue");
+ }
+ else {
+ Logger.logDebugMessage("Ignoring peer broadcast block with ID " + Convert.toUnsignedLong(block.getId()) + ". Already exists in queue");
+ }
+ }
+ else {
+ block.setHeight(prevBlock.getHeight() + 1);
+ blockCache.put(block.getId(), block);
+ reverseCache.put(block.getPreviousBlockId(), block.getId());
+ int blockSize = block.toString().length();
+ block.setByteLength(blockSize);
+ blockCacheSize += block.getByteLength();
+ // do not add to unverified as it will be processed immediately
+ lastDownloaded = block.getId();
+ blockCache.notify();
+ }
+ }
+ else {
+ Logger.logDebugMessage("Ignoring peer broadcast block with ID " + Convert.toUnsignedLong(block.getId())
+ + ". Previous block " + Convert.toUnsignedLong(block.getPreviousBlockId())
+ + " does not match actual previous block ID " + Convert.toUnsignedLong(prevBlock.getId()));
+ }
}
}
}

0 comments on commit 149b2e9

Please sign in to comment.