Synchronize this.allKnownPeers and this.connectedPeers in Network.requestDataFromPeer(), to make the method thread-safe.

This could be further improved by taking an immutable copy, but I'll leave this until the same approach is applied to other Network methods.
This commit is contained in:
CalDescent 2022-02-20 11:04:33 +00:00
parent f4f7cc58e3
commit 146e7970bf

View File

@ -251,12 +251,15 @@ public class Network {
public boolean requestDataFromPeer(String peerAddressString, byte[] signature) { public boolean requestDataFromPeer(String peerAddressString, byte[] signature) {
if (peerAddressString != null) { if (peerAddressString != null) {
PeerAddress peerAddress = PeerAddress.fromString(peerAddressString); PeerAddress peerAddress = PeerAddress.fromString(peerAddressString);
PeerData peerData = null;
// Reuse an existing PeerData instance if it's already in the known peers list // Reuse an existing PeerData instance if it's already in the known peers list
PeerData peerData = this.allKnownPeers.stream() synchronized (this.allKnownPeers) {
.filter(knownPeerData -> knownPeerData.getAddress().equals(peerAddress)) peerData = this.allKnownPeers.stream()
.findFirst() .filter(knownPeerData -> knownPeerData.getAddress().equals(peerAddress))
.orElse(null); .findFirst()
.orElse(null);
}
if (peerData == null) { if (peerData == null) {
// Not a known peer, so we need to create one // Not a known peer, so we need to create one
@ -271,10 +274,13 @@ public class Network {
} }
// Check if we're already connected to and handshaked with this peer // Check if we're already connected to and handshaked with this peer
Peer connectedPeer = this.connectedPeers.stream() Peer connectedPeer = null;
.filter(p -> p.getPeerData().getAddress().equals(peerAddress)) synchronized (this.connectedPeers) {
.findFirst() connectedPeer = this.connectedPeers.stream()
.orElse(null); .filter(p -> p.getPeerData().getAddress().equals(peerAddress))
.findFirst()
.orElse(null);
}
boolean isConnected = (connectedPeer != null); boolean isConnected = (connectedPeer != null);
boolean isHandshaked = this.getHandshakedPeers().stream() boolean isHandshaked = this.getHandshakedPeers().stream()