Browse Source

Loop through all available direct peer connections and try each one in turn.

Also added some extra conditionals to avoid repeated attempts with the same port.
pull/75/head
CalDescent 3 years ago
parent
commit
c185d79672
  1. 32
      src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java

32
src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java

@ -317,10 +317,19 @@ public class ArbitraryDataFileManager extends Thread {
public boolean fetchDataFilesFromPeersForSignature(byte[] signature) { public boolean fetchDataFilesFromPeersForSignature(byte[] signature) {
String signature58 = Base58.encode(signature); String signature58 = Base58.encode(signature);
boolean success = false;
try {
while (!success) {
if (isStopping) {
return false;
}
Thread.sleep(500L);
// Firstly fetch peers that claim to be hosting files for this signature // Firstly fetch peers that claim to be hosting files for this signature
List<ArbitraryDirectConnectionInfo> connectionInfoList = getDirectConnectionInfoForSignature(signature); List<ArbitraryDirectConnectionInfo> connectionInfoList = getDirectConnectionInfoForSignature(signature);
if (connectionInfoList == null || connectionInfoList.isEmpty()) { if (connectionInfoList == null || connectionInfoList.isEmpty()) {
LOGGER.debug("No direct connection peers found for signature {}", signature58); LOGGER.debug("No remaining direct connection peers found for signature {}", signature58);
return false; return false;
} }
@ -340,7 +349,6 @@ public class ArbitraryDataFileManager extends Thread {
removeDirectConnectionInfo(directConnectionInfo); removeDirectConnectionInfo(directConnectionInfo);
String peerAddressString = directConnectionInfo.getPeerAddress(); String peerAddressString = directConnectionInfo.getPeerAddress();
boolean success = Network.getInstance().requestDataFromPeer(peerAddressString, signature);
// Parse the peer address to find the host and port // Parse the peer address to find the host and port
String host = null; String host = null;
@ -349,18 +357,23 @@ public class ArbitraryDataFileManager extends Thread {
if (parts.length > 1) { if (parts.length > 1) {
host = parts[0]; host = parts[0];
port = Integer.parseInt(parts[1]); port = Integer.parseInt(parts[1]);
} } else {
else { // Assume no port included
host = peerAddressString;
// Use default listen port // Use default listen port
port = Settings.getInstance().getDefaultListenPort(); port = Settings.getInstance().getDefaultListenPort();
} }
String peerAddressStringWithPort = String.format("%s:%d", host, port);
success = Network.getInstance().requestDataFromPeer(peerAddressStringWithPort, signature);
int defaultPort = Settings.getInstance().getDefaultListenPort();
// If unsuccessful, and using a non-standard port, try a second connection with the default listen port, // If unsuccessful, and 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 // since almost all nodes use that. This is a workaround to account for any ephemeral ports that may
// have made it into the dataset. // have made it into the dataset.
if (!success) { if (!success) {
if (host != null && port > 0) { if (host != null && port > 0) {
int defaultPort = Settings.getInstance().getDefaultListenPort();
if (port != defaultPort) { if (port != defaultPort) {
String newPeerAddressString = String.format("%s:%d", host, defaultPort); String newPeerAddressString = String.format("%s:%d", host, defaultPort);
success = Network.getInstance().requestDataFromPeer(newPeerAddressString, signature); success = Network.getInstance().requestDataFromPeer(newPeerAddressString, signature);
@ -379,6 +392,9 @@ public class ArbitraryDataFileManager extends Thread {
// Loop through each match and attempt a connection // Loop through each match and attempt a connection
for (PeerData matchingPeer : knownPeers) { for (PeerData matchingPeer : knownPeers) {
String matchingPeerAddress = matchingPeer.getAddress().toString(); String matchingPeerAddress = matchingPeer.getAddress().toString();
int matchingPeerPort = matchingPeer.getAddress().getPort();
// Make sure that it's not a port we've already tried
if (matchingPeerPort != port && matchingPeerPort != defaultPort) {
success = Network.getInstance().requestDataFromPeer(matchingPeerAddress, signature); success = Network.getInstance().requestDataFromPeer(matchingPeerAddress, signature);
if (success) { if (success) {
// Successfully connected, so stop making connections // Successfully connected, so stop making connections
@ -387,12 +403,18 @@ public class ArbitraryDataFileManager extends Thread {
} }
} }
} }
}
if (success) { if (success) {
// We were able to connect with a peer, so track the request // We were able to connect with a peer, so track the request
ArbitraryDataFileListManager.getInstance().addToSignatureRequests(signature58, false, true); ArbitraryDataFileListManager.getInstance().addToSignatureRequests(signature58, false, true);
} }
}
} catch (InterruptedException e) {
// Do nothing
}
return success; return success;
} }

Loading…
Cancel
Save