diff --git a/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java b/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java index c8d0998e..c6a0e403 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/DnsDiscovery.java @@ -17,11 +17,10 @@ package org.bitcoinj.net.discovery; -import org.bitcoinj.core.NetworkParameters; +import org.bitcoinj.core.*; +import org.bitcoinj.utils.*; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.UnknownHostException; +import java.net.*; import java.util.*; import java.util.concurrent.*; @@ -63,6 +62,16 @@ public class DnsDiscovery extends MultiplexingDiscovery { return discoveries; } + @Override + protected ExecutorService createExecutor() { + // Attempted workaround for reported bugs on Linux in which gethostbyname does not appear to be properly + // thread safe and can cause segfaults on some libc versions. + if (System.getProperty("os.name").toLowerCase().contains("linux")) + return Executors.newSingleThreadExecutor(new DaemonThreadFactory()); + else + return Executors.newFixedThreadPool(seeds.size(), new DaemonThreadFactory()); + } + /** Implements discovery from a single DNS host. */ public static class DnsSeedDiscovery implements PeerDiscovery { private final String hostname; 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 f65a4365..2d9f9110 100644 --- a/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java +++ b/core/src/main/java/org/bitcoinj/net/discovery/MultiplexingDiscovery.java @@ -33,7 +33,7 @@ import static com.google.common.base.Preconditions.checkArgument; /** * MultiplexingDiscovery queries multiple PeerDiscovery objects, shuffles their responses and then returns the results, * thus selecting randomly between them and reducing the influence of any particular seed. Any that don't respond - * within the timeout are ignored. Backends are queried in parallel. Backends may block + * within the timeout are ignored. Backends are queried in parallel. Backends may block. */ public class MultiplexingDiscovery implements PeerDiscovery { private static final Logger log = LoggerFactory.getLogger(MultiplexingDiscovery.class); @@ -53,7 +53,7 @@ public class MultiplexingDiscovery implements PeerDiscovery { @Override public InetSocketAddress[] getPeers(final long timeoutValue, final TimeUnit timeoutUnit) throws PeerDiscoveryException { - vThreadPool = Executors.newFixedThreadPool(seeds.size(), new DaemonThreadFactory()); + vThreadPool = createExecutor(); try { List> tasks = Lists.newArrayList(); for (final PeerDiscovery seed : seeds) { @@ -93,6 +93,10 @@ public class MultiplexingDiscovery implements PeerDiscovery { } } + protected ExecutorService createExecutor() { + return Executors.newFixedThreadPool(seeds.size(), new DaemonThreadFactory()); + } + @Override public void shutdown() { ExecutorService tp = vThreadPool;