forked from Qortal/qortal
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:
parent
f4f7cc58e3
commit
146e7970bf
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user