From 1864468818955edeada607b0be0cc0fdcdbcd649 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 18 Feb 2022 13:41:29 +0000 Subject: [PATCH] Prefer the route with the least number of hops when relaying. --- .../arbitrary/ArbitraryDataFileManager.java | 29 ++++++++++++++++++- 1 file changed, 28 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 9b437e2b..e60e32a9 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java @@ -392,6 +392,33 @@ public class ArbitraryDataFileManager extends Thread { } } + private ArbitraryRelayInfo getOptimalRelayInfoEntryForHash(String hash58) { + LOGGER.trace("Fetching relay info for hash: {}", hash58); + List relayInfoList = this.getRelayInfoListForHash(hash58); + if (relayInfoList != null && !relayInfoList.isEmpty()) { + + // Remove any with null requestHops + relayInfoList.removeIf(r -> r.getRequestHops() == null); + + // If list is now empty, then just return one at random + if (relayInfoList.isEmpty()) { + return this.getRandomRelayInfoEntryForHash(hash58); + } + + // Sort by number of hops (lowest first) + relayInfoList.sort(Comparator.comparingInt(ArbitraryRelayInfo::getRequestHops)); + + // FUTURE: secondary sort by requestTime? + + ArbitraryRelayInfo relayInfo = relayInfoList.get(0); + + LOGGER.trace("Returning optimal relay info for hash: {} (requestHops {})", hash58, relayInfo.getRequestHops()); + return relayInfo; + } + LOGGER.trace("No relay info exists for hash: {}", hash58); + return null; + } + private ArbitraryRelayInfo getRandomRelayInfoEntryForHash(String hash58) { LOGGER.trace("Fetching random relay info for hash: {}", hash58); List relayInfoList = this.getRelayInfoListForHash(hash58); @@ -442,7 +469,7 @@ public class ArbitraryDataFileManager extends Thread { try { ArbitraryDataFile arbitraryDataFile = ArbitraryDataFile.fromHash(hash, signature); - ArbitraryRelayInfo relayInfo = this.getRandomRelayInfoEntryForHash(hash58); + ArbitraryRelayInfo relayInfo = this.getOptimalRelayInfoEntryForHash(hash58); if (arbitraryDataFile.exists()) { LOGGER.trace("Hash {} exists", hash58);