|
|
|
@ -317,10 +317,19 @@ public class ArbitraryDataFileManager extends Thread {
|
|
|
|
|
public boolean fetchDataFilesFromPeersForSignature(byte[] 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
|
|
|
|
|
List<ArbitraryDirectConnectionInfo> connectionInfoList = getDirectConnectionInfoForSignature(signature); |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -340,7 +349,6 @@ public class ArbitraryDataFileManager extends Thread {
|
|
|
|
|
removeDirectConnectionInfo(directConnectionInfo); |
|
|
|
|
|
|
|
|
|
String peerAddressString = directConnectionInfo.getPeerAddress(); |
|
|
|
|
boolean success = Network.getInstance().requestDataFromPeer(peerAddressString, signature); |
|
|
|
|
|
|
|
|
|
// Parse the peer address to find the host and port
|
|
|
|
|
String host = null; |
|
|
|
@ -349,18 +357,23 @@ public class ArbitraryDataFileManager extends Thread {
|
|
|
|
|
if (parts.length > 1) { |
|
|
|
|
host = parts[0]; |
|
|
|
|
port = Integer.parseInt(parts[1]); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
} else { |
|
|
|
|
// Assume no port included
|
|
|
|
|
host = peerAddressString; |
|
|
|
|
// Use default listen port
|
|
|
|
|
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,
|
|
|
|
|
// since almost all nodes use that. This is a workaround to account for any ephemeral ports that may
|
|
|
|
|
// have made it into the dataset.
|
|
|
|
|
if (!success) { |
|
|
|
|
if (host != null && port > 0) { |
|
|
|
|
int defaultPort = Settings.getInstance().getDefaultListenPort(); |
|
|
|
|
if (port != defaultPort) { |
|
|
|
|
String newPeerAddressString = String.format("%s:%d", host, defaultPort); |
|
|
|
|
success = Network.getInstance().requestDataFromPeer(newPeerAddressString, signature); |
|
|
|
@ -379,6 +392,9 @@ public class ArbitraryDataFileManager extends Thread {
|
|
|
|
|
// Loop through each match and attempt a connection
|
|
|
|
|
for (PeerData matchingPeer : knownPeers) { |
|
|
|
|
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); |
|
|
|
|
if (success) { |
|
|
|
|
// Successfully connected, so stop making connections
|
|
|
|
@ -387,12 +403,18 @@ public class ArbitraryDataFileManager extends Thread {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (success) { |
|
|
|
|
// We were able to connect with a peer, so track the request
|
|
|
|
|
ArbitraryDataFileListManager.getInstance().addToSignatureRequests(signature58, false, true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} catch (InterruptedException e) { |
|
|
|
|
// Do nothing
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return success; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|