From 76b8ba91dd1f69df9e38990b76195bc5a4e1b72e Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 9 Mar 2022 20:50:03 +0000 Subject: [PATCH] Only add an entry to directConnectionInfo if one with this peer-signature combination doesn't already exist. --- .../ArbitraryDataFileListManager.java | 2 +- .../arbitrary/ArbitraryDataFileManager.java | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java index 5c07275c..a3ba4438 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java @@ -483,7 +483,7 @@ public class ArbitraryDataFileListManager { // Keep track of the source peer, for direct connections if (arbitraryDataFileListMessage.getPeerAddress() != null) { - ArbitraryDataFileManager.getInstance().directConnectionInfo.add( + ArbitraryDataFileManager.getInstance().addDirectConnectionInfoIfUnique( new ArbitraryDirectConnectionInfo(signature, arbitraryDataFileListMessage.getPeerAddress(), hashes, now)); } } diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java index f8c9298e..2f2a66dd 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java @@ -53,7 +53,7 @@ public class ArbitraryDataFileManager extends Thread { /** * List to keep track of peers potentially available for direct connections, based on recent requests */ - public List directConnectionInfo = Collections.synchronizedList(new ArrayList<>()); + private List directConnectionInfo = Collections.synchronizedList(new ArrayList<>()); public static int MAX_FILE_HASH_RESPONSES = 1000; @@ -293,6 +293,23 @@ public class ArbitraryDataFileManager extends Thread { } } + /** + * Add an ArbitraryDirectConnectionInfo item, but only if one with this peer-signature combination + * doesn't already exist. + * @param connectionInfo - the direct connection info to add + */ + public void addDirectConnectionInfoIfUnique(ArbitraryDirectConnectionInfo connectionInfo) { + boolean peerAlreadyExists; + synchronized (directConnectionInfo) { + peerAlreadyExists = directConnectionInfo.stream() + .anyMatch(i -> Arrays.equals(i.getSignature(), connectionInfo.getSignature()) + && Objects.equals(i.getPeerAddress(), connectionInfo.getPeerAddress())); + } + if (!peerAlreadyExists) { + directConnectionInfo.add(connectionInfo); + } + } + private void removeDirectConnectionInfo(ArbitraryDirectConnectionInfo connectionInfo) { this.directConnectionInfo.remove(connectionInfo); }