PeerDiscovery: migrate getPeers() to java.time API

This commit is contained in:
Andreas Schildbach 2023-03-02 23:59:19 +01:00
parent 35c4fd9025
commit 913f5ac8c6
9 changed files with 40 additions and 27 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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();

View file

@ -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();

View file

@ -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);

View file

@ -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));
}
}

View file

@ -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));
}
}

View file

@ -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);
}

View file

@ -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;
}