Browse Source

Synchronize hasInvalidBlock predicate, as it wasn't thread safe

pull/91/head
CalDescent 2 years ago
parent
commit
a2e1efab90
  1. 50
      src/main/java/org/qortal/controller/Controller.java
  2. 2
      src/main/java/org/qortal/network/Peer.java

50
src/main/java/org/qortal/controller/Controller.java

@ -723,39 +723,41 @@ public class Controller extends Thread {
}; };
public static final Predicate<Peer> hasInvalidBlock = peer -> { public static final Predicate<Peer> hasInvalidBlock = peer -> {
final PeerChainTipData peerChainTipData = peer.getChainTipData(); synchronized (peer.peerInfoLock) {
Map<ByteArray, Long> invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures(); final PeerChainTipData peerChainTipData = peer.getChainTipData();
List<byte[]> peerSignatures = new ArrayList<>(); Map<ByteArray, Long> invalidBlockSignatures = Synchronizer.getInstance().getInvalidBlockSignatures();
List<byte[]> peerSignatures = new ArrayList<>();
// Add peer's latest block signature // Add peer's latest block signature
if (peerChainTipData != null) { if (peerChainTipData != null) {
peerSignatures.add(peerChainTipData.getLastBlockSignature()); peerSignatures.add(peerChainTipData.getLastBlockSignature());
} }
// Add peer's blocks since common block // Add peer's blocks since common block
if (peer.getCommonBlockData() != null) { if (peer.getCommonBlockData() != null) {
List<BlockSummaryData> peerSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock(); List<BlockSummaryData> peerSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock();
if (peerSummaries != null) { if (peerSummaries != null) {
for (BlockSummaryData blockSummaryData : peerSummaries) { for (BlockSummaryData blockSummaryData : peerSummaries) {
peerSignatures.add(blockSummaryData.getSignature()); peerSignatures.add(blockSummaryData.getSignature());
}
} }
} }
}
// Shortcut if no data // Shortcut if no data
if (peerSignatures.isEmpty() || invalidBlockSignatures == null || invalidBlockSignatures.isEmpty()) { if (peerSignatures.isEmpty() || invalidBlockSignatures == null || invalidBlockSignatures.isEmpty()) {
return false; return false;
} }
// Loop through our known invalid blocks and check each one against supplied block summaries // Loop through our known invalid blocks and check each one against supplied block summaries
for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) { for (ByteArray invalidSignature : invalidBlockSignatures.keySet()) {
for (byte[] peerSignature : peerSignatures) { for (byte[] peerSignature : peerSignatures) {
if (Arrays.equals(peerSignature, invalidSignature.value)) { if (Arrays.equals(peerSignature, invalidSignature.value)) {
return true; return true;
}
} }
} }
return false;
} }
return false;
}; };
public static final Predicate<Peer> hasNoRecentBlock = peer -> { public static final Predicate<Peer> hasNoRecentBlock = peer -> {

2
src/main/java/org/qortal/network/Peer.java

@ -121,7 +121,7 @@ public class Peer {
// Peer info // Peer info
private final Object peerInfoLock = new Object(); public final Object peerInfoLock = new Object();
private String peersNodeId; private String peersNodeId;
private byte[] peersPublicKey; private byte[] peersPublicKey;

Loading…
Cancel
Save