From a2e1efab9067ec8b7f04429c9aa4ed4c0e323a97 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 25 Jun 2022 14:12:21 +0100 Subject: [PATCH] Synchronize hasInvalidBlock predicate, as it wasn't thread safe --- .../org/qortal/controller/Controller.java | 50 ++++++++++--------- src/main/java/org/qortal/network/Peer.java | 2 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 1a4decb6..64a30fae 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -723,39 +723,41 @@ public class Controller extends Thread { }; public static final Predicate hasInvalidBlock = peer -> { - final PeerChainTipData peerChainTipData = peer.getChainTipData(); - Map invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures(); - List peerSignatures = new ArrayList<>(); + synchronized (peer.peerInfoLock) { + final PeerChainTipData peerChainTipData = peer.getChainTipData(); + Map invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures(); + List peerSignatures = new ArrayList<>(); - // Add peer's latest block signature - if (peerChainTipData != null) { - peerSignatures.add(peerChainTipData.getLastBlockSignature()); - } + // Add peer's latest block signature + if (peerChainTipData != null) { + peerSignatures.add(peerChainTipData.getLastBlockSignature()); + } - // Add peer's blocks since common block - if (peer.getCommonBlockData() != null) { - List peerSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock(); - if (peerSummaries != null) { - for (BlockSummaryData blockSummaryData : peerSummaries) { - peerSignatures.add(blockSummaryData.getSignature()); + // Add peer's blocks since common block + if (peer.getCommonBlockData() != null) { + List peerSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock(); + if (peerSummaries != null) { + for (BlockSummaryData blockSummaryData : peerSummaries) { + peerSignatures.add(blockSummaryData.getSignature()); + } } } - } - // Shortcut if no data - if (peerSignatures.isEmpty() || invalidBlockSignatures == null || invalidBlockSignatures.isEmpty()) { - return false; - } + // Shortcut if no data + if (peerSignatures.isEmpty() || invalidBlockSignatures == null || invalidBlockSignatures.isEmpty()) { + return false; + } - // Loop through our known invalid blocks and check each one against supplied block summaries - for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) { - for (byte[] peerSignature : peerSignatures) { - if (Arrays.equals(peerSignature, invalidSignature.value)) { - return true; + // Loop through our known invalid blocks and check each one against supplied block summaries + for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) { + for (byte[] peerSignature : peerSignatures) { + if (Arrays.equals(peerSignature, invalidSignature.value)) { + return true; + } } } + return false; } - return false; }; public static final Predicate hasNoRecentBlock = peer -> { diff --git a/src/main/java/org/qortal/network/Peer.java b/src/main/java/org/qortal/network/Peer.java index f99a94b1..2b3f597a 100644 --- a/src/main/java/org/qortal/network/Peer.java +++ b/src/main/java/org/qortal/network/Peer.java @@ -121,7 +121,7 @@ public class Peer { // Peer info - private final Object peerInfoLock = new Object(); + public final Object peerInfoLock = new Object(); private String peersNodeId; private byte[] peersPublicKey;