From bf674ea0cf3c67b4dcfd6a2ae437bdd30ed96066 Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Wed, 7 Oct 2020 15:34:31 -0500 Subject: [PATCH] Use getPersistedPeers for peerList.getList() calls Rename getOptionalPersistedPeer to findPersistedPeer Improve getConnectedReportedPeers method --- .../bisq/network/p2p/peers/PeerManager.java | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java b/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java index 57641fd2d2..8fa179a6f4 100644 --- a/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java +++ b/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java @@ -112,7 +112,7 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { // Peers we got reported from other peers @Getter private final Set reportedPeers = new HashSet<>(); - // Peer of last 30 min. + // Most recent peers with activity date of last 30 min. private final Set latestLivePeers = new HashSet<>(); private Timer checkMaxConnectionsTimer; @@ -249,7 +249,7 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { public Set getAllPeers() { Set allPeers = new HashSet<>(getLivePeers()); - allPeers.addAll(peerList.getList()); + allPeers.addAll(getPersistedPeers()); allPeers.addAll(reportedPeers); return allPeers; } @@ -510,7 +510,7 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { reportedPeers.addAll(reportedPeersToAdd); purgeReportedPeersIfExceeds(); - peerList.getList().addAll(reportedPeersToAdd); + getPersistedPeers().addAll(reportedPeersToAdd); purgePersistedPeersIfExceeds(); requestPersistence(); @@ -585,8 +585,8 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { /////////////////////////////////////////////////////////////////////////////////////////// private boolean removePersistedPeer(Peer persistedPeer) { - if (peerList.getList().contains(persistedPeer)) { - peerList.getList().remove(persistedPeer); + if (getPersistedPeers().contains(persistedPeer)) { + getPersistedPeers().remove(persistedPeer); requestPersistence(); return true; } else { @@ -600,31 +600,31 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { @SuppressWarnings("UnusedReturnValue") private boolean removePersistedPeer(NodeAddress nodeAddress) { - Optional optionalPersistedPeer = getOptionalPersistedPeer(nodeAddress); + Optional optionalPersistedPeer = findPersistedPeer(nodeAddress); return optionalPersistedPeer.isPresent() && removePersistedPeer(optionalPersistedPeer.get()); } - private Optional getOptionalPersistedPeer(NodeAddress nodeAddress) { - return peerList.getList().stream() + private Optional findPersistedPeer(NodeAddress nodeAddress) { + return getPersistedPeers().stream() .filter(e -> e.getNodeAddress().equals(nodeAddress)) .findAny(); } private void removeTooOldPersistedPeers() { - Set persistedPeersToRemove = peerList.getList().stream() + Set persistedPeersToRemove = getPersistedPeers().stream() .filter(reportedPeer -> new Date().getTime() - reportedPeer.getDate().getTime() > MAX_AGE) .collect(Collectors.toSet()); persistedPeersToRemove.forEach(this::removePersistedPeer); } private void purgePersistedPeersIfExceeds() { - int size = peerList.getList().size(); + int size = getPersistedPeers().size(); int limit = MAX_PERSISTED_PEERS; if (size > limit) { log.trace("We have already {} persisted peers which exceeds our limit of {}." + "We remove random peers from the persisted peers list.", size, limit); int diff = size - limit; - List list = new ArrayList<>(peerList.getList()); + List list = new ArrayList<>(getPersistedPeers()); // we don't use sorting by lastActivityDate to avoid attack vectors and keep it more random for (int i = 0; i < diff; i++) { if (!list.isEmpty()) { @@ -687,7 +687,7 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { log.debug("handleConnectionFault called: nodeAddress=" + nodeAddress); boolean doRemovePersistedPeer = false; removeReportedPeer(nodeAddress); - Optional persistedPeerOptional = getOptionalPersistedPeer(nodeAddress); + Optional persistedPeerOptional = findPersistedPeer(nodeAddress); if (persistedPeerOptional.isPresent()) { Peer persistedPeer = persistedPeerOptional.get(); persistedPeer.increaseFailedConnectionAttempts(); @@ -758,25 +758,27 @@ public class PeerManager implements ConnectionListener, PersistedDataHost { // and if so we use that. Optional peersNodeAddressOptional = connection.getPeersNodeAddressOptional(); checkArgument(peersNodeAddressOptional.isPresent()); // getConfirmedConnections delivers only connections where we know the address - boolean getCapabilitiesFromConnection = !supportedCapabilities.isEmpty(); - if (supportedCapabilities.isEmpty()) { - // If not set we look up if we got the Capabilities set from any of the reported or persisted peers - Set allPeers = new HashSet<>(getPersistedPeers()); - allPeers.addAll(getReportedPeers()); - Optional ourPeer = allPeers.stream() - .filter(peer -> peer.getNodeAddress().equals(peersNodeAddressOptional.get())) + NodeAddress peersNodeAddress = peersNodeAddressOptional.get(); + boolean capabilitiesNotFoundInConnection = supportedCapabilities.isEmpty(); + if (capabilitiesNotFoundInConnection) { + // If not found in connection we look up if we got the Capabilities set from any of the + // reported or persisted peers + Set persistedAndReported = new HashSet<>(getPersistedPeers()); + persistedAndReported.addAll(getReportedPeers()); + Optional candidate = persistedAndReported.stream() + .filter(peer -> peer.getNodeAddress().equals(peersNodeAddress)) .filter(peer -> !peer.getCapabilities().isEmpty()) .findAny(); - if (ourPeer.isPresent()) { - supportedCapabilities = new Capabilities(ourPeer.get().getCapabilities()); + if (candidate.isPresent()) { + supportedCapabilities = new Capabilities(candidate.get().getCapabilities()); } } - Peer peer = new Peer(peersNodeAddressOptional.get(), supportedCapabilities); + Peer peer = new Peer(peersNodeAddress, supportedCapabilities); - // If we only got the capabilities from a reported peer of did not get any we add a listener, + // If we did not found the capability from our own connection we add a listener, // so once we get a connection with that peer and exchange a message containing the capabilities - // we get set the capabilities - if (!getCapabilitiesFromConnection) { + // we get set the capabilities. + if (capabilitiesNotFoundInConnection) { connection.addWeakCapabilitiesListener(peer); } return peer;