From ae6e2fab6fa56fde11c86b393a011fd4970b48b0 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 24 Jun 2022 10:36:06 +0100 Subject: [PATCH] Rewrite of isNotOldPeer predicate, to fix logic issue (second attempt - first had too many issues) Previously, a peer would be continuously considered not 'old' if it had a connection attempt in the past day. This prevented some peers from being removed, causing nodes to hold a large repository of peers. On slower systems, this large number of known peers resulted in low numbers of outbound connections being made, presumably because of the time taken to iterate through dataset, using up a lot of allKnownPeers lock time. On devices that experienced the problem, it could be solved by deleting all known peers. This adds confidence that the old peers were the problem. --- src/main/java/org/qortal/network/Network.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/qortal/network/Network.java b/src/main/java/org/qortal/network/Network.java index 6bc58bb4..9648f153 100644 --- a/src/main/java/org/qortal/network/Network.java +++ b/src/main/java/org/qortal/network/Network.java @@ -1373,17 +1373,26 @@ public class Network { // We attempted to connect within the last day // but we last managed to connect over a week ago. Predicate isNotOldPeer = peerData -> { - if (peerData.getLastAttempted() == null - || peerData.getLastAttempted() < now - OLD_PEER_ATTEMPTED_PERIOD) { + + // First check if there was a connection attempt within the last day + if (peerData.getLastAttempted() != null + && peerData.getLastAttempted() > now - OLD_PEER_ATTEMPTED_PERIOD) { + + // There was, so now check if we had a successful connection in the last 7 days + if (peerData.getLastConnected() != null + && peerData.getLastConnected() > now - OLD_PEER_CONNECTION_PERIOD) { + + // We did, so this is NOT an 'old' peer + return true; + } + + // Last successful connection was more than 1 week ago - this is an 'old' peer + return false; + } + else { + // Best to wait until we have a connection attempt - assume not an 'old' peer until then return true; } - - if (peerData.getLastConnected() == null - || peerData.getLastConnected() > now - OLD_PEER_CONNECTION_PERIOD) { - return true; - } - - return false; }; // Disregard peers that are NOT 'old'