mirror of
https://github.com/bitcoinj/bitcoinj.git
synced 2025-03-13 11:36:15 +01:00
PeerDiscovery: migrate getPeers() to java.time
API
This commit is contained in:
parent
35c4fd9025
commit
913f5ac8c6
9 changed files with 40 additions and 27 deletions
|
@ -1078,7 +1078,7 @@ public class PeerGroup implements TransactionBroadcaster {
|
|||
for (PeerDiscovery peerDiscovery : peerDiscoverers /* COW */) {
|
||||
List<InetSocketAddress> addresses;
|
||||
try {
|
||||
addresses = peerDiscovery.getPeers(requiredServices, peerDiscoveryTimeout.toMillis(), TimeUnit.MILLISECONDS);
|
||||
addresses = peerDiscovery.getPeers(requiredServices, peerDiscoveryTimeout);
|
||||
} catch (PeerDiscoveryException e) {
|
||||
log.warn(e.getMessage());
|
||||
continue;
|
||||
|
|
|
@ -28,11 +28,11 @@ import org.slf4j.LoggerFactory;
|
|||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* <p>Supports peer discovery through DNS.</p>
|
||||
|
@ -96,7 +96,7 @@ public class DnsDiscovery extends MultiplexingDiscovery {
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<InetSocketAddress> getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException {
|
||||
public List<InetSocketAddress> getPeers(long services, Duration timeout) throws PeerDiscoveryException {
|
||||
InetAddress[] response = null;
|
||||
if (services != 0) {
|
||||
String hostnameWithServices = "x" + Long.toHexString(services) + "." + hostname;
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
|
@ -95,23 +96,23 @@ public class MultiplexingDiscovery implements PeerDiscovery {
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<InetSocketAddress> getPeers(final long services, final long timeoutValue, final TimeUnit timeoutUnit) throws PeerDiscoveryException {
|
||||
public List<InetSocketAddress> getPeers(final long services, final Duration timeout) throws PeerDiscoveryException {
|
||||
vThreadPool = createExecutor();
|
||||
try {
|
||||
List<Callable<List<InetSocketAddress>>> tasks = new ArrayList<>();
|
||||
if (parallelQueries) {
|
||||
for (final PeerDiscovery seed : seeds) {
|
||||
tasks.add(() -> seed.getPeers(services, timeoutValue, timeoutUnit));
|
||||
tasks.add(() -> seed.getPeers(services, timeout));
|
||||
}
|
||||
} else {
|
||||
tasks.add(() -> {
|
||||
List<InetSocketAddress> peers = new LinkedList<>();
|
||||
for (final PeerDiscovery seed : seeds)
|
||||
peers.addAll(seed.getPeers(services, timeoutValue, timeoutUnit));
|
||||
peers.addAll(seed.getPeers(services, timeout));
|
||||
return peers;
|
||||
});
|
||||
}
|
||||
final List<Future<List<InetSocketAddress>>> futures = vThreadPool.invokeAll(tasks, timeoutValue, timeoutUnit);
|
||||
final List<Future<List<InetSocketAddress>>> futures = vThreadPool.invokeAll(tasks, timeout.toMillis(), TimeUnit.MILLISECONDS);
|
||||
List<InetSocketAddress> addrs = new ArrayList<>();
|
||||
for (int i = 0; i < futures.size(); i++) {
|
||||
Future<List<InetSocketAddress>> future = futures.get(i);
|
||||
|
@ -130,7 +131,7 @@ public class MultiplexingDiscovery implements PeerDiscovery {
|
|||
}
|
||||
if (addrs.size() == 0)
|
||||
throw new PeerDiscoveryException("No peer discovery returned any results in "
|
||||
+ timeoutUnit.toMillis(timeoutValue) + "ms. Check internet connection?");
|
||||
+ timeout.toMillis() + " ms. Check internet connection?");
|
||||
if (shufflePeers)
|
||||
Collections.shuffle(addrs);
|
||||
vThreadPool.shutdownNow();
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.bitcoinj.net.discovery;
|
|||
import org.bitcoinj.core.VersionMessage;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Duration;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
@ -31,10 +32,20 @@ public interface PeerDiscovery {
|
|||
// TODO: Flesh out this interface a lot more.
|
||||
|
||||
/**
|
||||
* Queries the addresses. This method may block.
|
||||
* @param services Required services as a bitmask, e.g. {@link VersionMessage#NODE_NETWORK}.
|
||||
* Queries for addresses. This method may block.
|
||||
* @param services required services as a bitmask, e.g. {@link VersionMessage#NODE_NETWORK}
|
||||
* @param timeout query timeout
|
||||
* @return found addresses
|
||||
*/
|
||||
List<InetSocketAddress> getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException;
|
||||
List<InetSocketAddress> getPeers(long services, Duration timeout) throws PeerDiscoveryException;
|
||||
|
||||
/**
|
||||
* @deprecated use {@link #getPeers(long, Duration)}
|
||||
*/
|
||||
@Deprecated
|
||||
default List<InetSocketAddress> getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException {
|
||||
return getPeers(services, Duration.ofMillis(timeoutUnit.toMillis(timeoutValue)));
|
||||
}
|
||||
|
||||
/** Stops any discovery in progress when we want to shut down quickly. */
|
||||
void shutdown();
|
||||
|
|
|
@ -25,11 +25,11 @@ import javax.annotation.Nullable;
|
|||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.time.Duration;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* SeedPeers stores a pre-determined list of Bitcoin node addresses. These nodes are selected based on being
|
||||
|
@ -105,13 +105,12 @@ public class SeedPeers implements PeerDiscovery {
|
|||
/**
|
||||
* Returns all the Bitcoin nodes within the list.
|
||||
*
|
||||
* @param services ignored
|
||||
* @param timeoutValue ignored
|
||||
* @param timeoutUnit ignored
|
||||
* @param services ignored
|
||||
* @param timeout ignored
|
||||
* @return the pre-determined list of peers
|
||||
*/
|
||||
@Override
|
||||
public List<InetSocketAddress> getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) {
|
||||
public List<InetSocketAddress> getPeers(long services, Duration timeout) {
|
||||
if (services != 0)
|
||||
log.info("Pre-determined peers cannot be filtered by services: {}", services);
|
||||
return Collections.unmodifiableList(seedAddrs);
|
||||
|
|
|
@ -20,6 +20,7 @@ import org.bitcoinj.params.MainNetParams;
|
|||
import org.junit.Test;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Duration;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
@ -34,21 +35,21 @@ public class DnsDiscoveryTest {
|
|||
DnsDiscovery dnsDiscovery = new DnsDiscovery(seeds, MainNetParams.get());
|
||||
assertTrue(dnsDiscovery.seeds.size() == 2);
|
||||
for (PeerDiscovery peerDiscovery : dnsDiscovery.seeds) {
|
||||
assertTrue(peerDiscovery.getPeers(0, 100, TimeUnit.MILLISECONDS).size() > 0);
|
||||
assertTrue(peerDiscovery.getPeers(0, Duration.ofMillis(100)).size() > 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = PeerDiscoveryException.class)
|
||||
public void testGetPeersThrowsPeerDiscoveryExceptionWithServicesGreaterThanZero() throws PeerDiscoveryException {
|
||||
DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(), "");
|
||||
dnsSeedDiscovery.getPeers(1, 100, TimeUnit.MILLISECONDS);
|
||||
dnsSeedDiscovery.getPeers(1, Duration.ofMillis(100));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetPeersReturnsNotEmptyListOfSocketAddresses() throws PeerDiscoveryException {
|
||||
DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(),
|
||||
"localhost");
|
||||
List<InetSocketAddress> inetSocketAddresses = dnsSeedDiscovery.getPeers(0, 100, TimeUnit.MILLISECONDS);
|
||||
List<InetSocketAddress> inetSocketAddresses = dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100));
|
||||
assertNotEquals(0, inetSocketAddresses.size());
|
||||
}
|
||||
|
||||
|
@ -56,6 +57,6 @@ public class DnsDiscoveryTest {
|
|||
public void testGetPeersThrowsPeerDiscoveryExceptionForUnknownHost() throws PeerDiscoveryException {
|
||||
DnsDiscovery.DnsSeedDiscovery dnsSeedDiscovery = new DnsDiscovery.DnsSeedDiscovery(MainNetParams.get(),
|
||||
"unknown host");
|
||||
dnsSeedDiscovery.getPeers(0, 100, TimeUnit.MILLISECONDS);
|
||||
dnsSeedDiscovery.getPeers(0, Duration.ofMillis(100));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,8 +22,8 @@ import org.bitcoinj.params.MainNetParams;
|
|||
import org.junit.Test;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Duration;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||
|
@ -50,7 +50,7 @@ public class SeedPeersTest {
|
|||
@Test
|
||||
public void getPeers_length() throws Exception{
|
||||
SeedPeers seedPeers = new SeedPeers(MAINNET);
|
||||
List<InetSocketAddress> addresses = seedPeers.getPeers(0, 0, TimeUnit.SECONDS);
|
||||
List<InetSocketAddress> addresses = seedPeers.getPeers(0, Duration.ZERO);
|
||||
assertThat(addresses.size(), equalTo(MAINNET.getAddrSeeds().length));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,10 +32,10 @@ import com.google.common.util.concurrent.Futures;
|
|||
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Prints a list of IP addresses obtained from DNS.
|
||||
|
@ -58,7 +58,7 @@ public class PrintPeers {
|
|||
private static void printDNS(Network network) throws PeerDiscoveryException {
|
||||
long start = System.currentTimeMillis();
|
||||
DnsDiscovery dns = new DnsDiscovery(NetworkParameters.of(network));
|
||||
dnsPeers = dns.getPeers(0, 10, TimeUnit.SECONDS);
|
||||
dnsPeers = dns.getPeers(0, Duration.ofSeconds(10));
|
||||
printPeers(dnsPeers);
|
||||
printElapsed(start);
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ import java.net.BindException;
|
|||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
@ -174,7 +175,7 @@ public class PeerGroupTest extends TestWithPeerGroup {
|
|||
final AtomicBoolean result = new AtomicBoolean();
|
||||
peerGroup.addPeerDiscovery(new PeerDiscovery() {
|
||||
@Override
|
||||
public List<InetSocketAddress> getPeers(long services, long unused, TimeUnit unused2) throws PeerDiscoveryException {
|
||||
public List<InetSocketAddress> getPeers(long services, Duration unused) throws PeerDiscoveryException {
|
||||
if (!result.getAndSet(true)) {
|
||||
// Pretend we are not connected to the internet.
|
||||
throw new PeerDiscoveryException("test failure");
|
||||
|
@ -204,7 +205,7 @@ public class PeerGroupTest extends TestWithPeerGroup {
|
|||
addresses.add(new InetSocketAddress("localhost", port + addressNr));
|
||||
}
|
||||
return new PeerDiscovery() {
|
||||
public List<InetSocketAddress> getPeers(long services, long unused, TimeUnit unused2) throws PeerDiscoveryException {
|
||||
public List<InetSocketAddress> getPeers(long services, Duration unused) throws PeerDiscoveryException {
|
||||
return addresses;
|
||||
}
|
||||
public void shutdown() {
|
||||
|
@ -559,7 +560,7 @@ public class PeerGroupTest extends TestWithPeerGroup {
|
|||
peerGroup.addPreMessageReceivedEventListener(preMessageReceivedListener);
|
||||
peerGroup.addPeerDiscovery(new PeerDiscovery() {
|
||||
@Override
|
||||
public List<InetSocketAddress> getPeers(long services, long unused, TimeUnit unused2) throws PeerDiscoveryException {
|
||||
public List<InetSocketAddress> getPeers(long services, Duration unused) throws PeerDiscoveryException {
|
||||
return addresses;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue