From 680ebe51b060d217fb9a317dfb29985da70a6141 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Wed, 21 Oct 2015 18:00:38 +0200 Subject: [PATCH] Make peer discovery timeout configurable. Add milliseconds to error message if timeout kicks in. --- .../main/java/org/bitcoinj/core/PeerGroup.java | 16 +++++++++++++--- .../net/discovery/MultiplexingDiscovery.java | 3 ++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/PeerGroup.java b/core/src/main/java/org/bitcoinj/core/PeerGroup.java index 2cafb7ea..c96e0b5b 100644 --- a/core/src/main/java/org/bitcoinj/core/PeerGroup.java +++ b/core/src/main/java/org/bitcoinj/core/PeerGroup.java @@ -79,6 +79,8 @@ public class PeerGroup implements TransactionBroadcaster { public static final int DEFAULT_CONNECTIONS = 12; private static final int TOR_TIMEOUT_SECONDS = 60; private volatile int vMaxPeersToDiscoverCount = 100; + private static final long DEFAULT_PEER_DISCOVERY_TIMEOUT_MILLIS = 5000; + private volatile long vPeerDiscoveryTimeoutMillis = DEFAULT_PEER_DISCOVERY_TIMEOUT_MILLIS; protected final ReentrantLock lock = Threading.lock("peergroup"); @@ -420,6 +422,13 @@ public class PeerGroup implements TransactionBroadcaster { return result; } + /** + * This is how many milliseconds we wait for peer discoveries to return their results. + */ + public void setPeerDiscoveryTimeoutMillis(long peerDiscoveryTimeoutMillis) { + this.vPeerDiscoveryTimeoutMillis = peerDiscoveryTimeoutMillis; + } + /** * Adjusts the desired number of connections that we will create to peers. Note that if there are already peers * open and the new value is lower than the current number of peers, those connections will be terminated. Likewise @@ -786,11 +795,12 @@ public class PeerGroup implements TransactionBroadcaster { // Don't hold the lock whilst doing peer discovery: it can take a long time and cause high API latency. checkState(!lock.isHeldByCurrentThread()); int maxPeersToDiscoverCount = this.vMaxPeersToDiscoverCount; + long peerDiscoveryTimeoutMillis = this.vPeerDiscoveryTimeoutMillis; long start = System.currentTimeMillis(); final List addressList = Lists.newLinkedList(); for (PeerDiscovery peerDiscovery : peerDiscoverers /* COW */) { InetSocketAddress[] addresses; - addresses = peerDiscovery.getPeers(5, TimeUnit.SECONDS); + addresses = peerDiscovery.getPeers(peerDiscoveryTimeoutMillis, TimeUnit.MILLISECONDS); for (InetSocketAddress address : addresses) addressList.add(new PeerAddress(address)); if (addressList.size() >= maxPeersToDiscoverCount) break; } @@ -808,8 +818,8 @@ public class PeerGroup implements TransactionBroadcaster { }); } } - log.info("Peer discovery took {}msec and returned {} items", - System.currentTimeMillis() - start, addressList.size()); + log.info("Peer discovery took {}ms and returned {} items", System.currentTimeMillis() - start, + addressList.size()); return addressList.size(); } diff --git a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java index db6e3b7d..6855dbee 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java @@ -82,7 +82,8 @@ public class MultiplexingDiscovery implements PeerDiscovery { Collections.addAll(addrs, inetAddresses); } if (addrs.size() == 0) - throw new PeerDiscoveryException("No peer discovery returned any results: check internet connection?"); + throw new PeerDiscoveryException("No peer discovery returned any results in " + + timeoutUnit.toMillis(timeoutValue) + "ms. Check internet connection?"); Collections.shuffle(addrs); vThreadPool.shutdownNow(); return addrs.toArray(new InetSocketAddress[addrs.size()]);