From 391fa008d0efa40a3a752c99c39f232edb84d389 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 1 Jan 2022 21:37:23 +0000 Subject: [PATCH] When making a direct connection to a peer, try using the default listen port along with the one specified in the ArbitraryPeers table. This is a workaround to account for any ephemeral ports that may have made it into the dataset. --- .../arbitrary/ArbitraryDataFileManager.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java index 5d298c92..d2ab6b87 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java @@ -253,7 +253,23 @@ public class ArbitraryDataFileManager { int index = new SecureRandom().nextInt(peers.size()); ArbitraryPeerData arbitraryPeerData = peers.get(index); String peerAddressString = arbitraryPeerData.getPeerAddress(); - return Network.getInstance().requestDataFromPeer(peerAddressString, signature); + boolean success = Network.getInstance().requestDataFromPeer(peerAddressString, signature); + + // If using a non-standard port, try a second connection with the default listen port, since almost all nodes use that + // This is a workaround to account for any ephemeral ports that may have made it into the dataset + boolean success2 = false; + String[] parts = peerAddressString.split(":"); + if (parts.length > 1) { + String host = parts[0]; + int port = Integer.parseInt(parts[1]); + int defaultPort = Settings.getInstance().getDefaultListenPort(); + if (port != defaultPort) { + String newPeerAddressString = String.format("%s:%d", host, defaultPort); + success2 = Network.getInstance().requestDataFromPeer(newPeerAddressString, signature); + } + } + + return success || success2; } catch (DataException e) { LOGGER.debug("Unable to fetch peer list from repository");