mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-12 02:05:53 +00:00
PeerGroup: fix the IPv6 routing failure detection which was broken by a recent change and improve logging in a bunch of places.
This commit is contained in:
parent
b9cf28d358
commit
46344dd0b1
@ -65,7 +65,8 @@ public interface PeerEventListener {
|
|||||||
/**
|
/**
|
||||||
* Called when a peer is disconnected. Note that this won't be called if the listener is registered on a
|
* Called when a peer is disconnected. Note that this won't be called if the listener is registered on a
|
||||||
* {@link PeerGroup} and the group is in the process of shutting down. If this listener is registered to a
|
* {@link PeerGroup} and the group is in the process of shutting down. If this listener is registered to a
|
||||||
* {@link Peer} instead of a {@link PeerGroup}, peerCount will always be 0.
|
* {@link Peer} instead of a {@link PeerGroup}, peerCount will always be 0. This handler can be called without
|
||||||
|
* a corresponding invocation of onPeerConnected if the initial connection is never successful.
|
||||||
*
|
*
|
||||||
* @param peer
|
* @param peer
|
||||||
* @param peerCount the total number of connected peers
|
* @param peerCount the total number of connected peers
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
package org.bitcoinj.core;
|
package org.bitcoinj.core;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
import com.google.common.base.*;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
@ -1169,10 +1170,15 @@ public class PeerGroup implements TransactionBroadcaster {
|
|||||||
pendingPeers.add(peer);
|
pendingPeers.add(peer);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
channels.openConnection(address.toSocketAddress(), peer);
|
log.info("Attempting connection to {} ({} connected, {} pending, {} max)", address,
|
||||||
} catch (Exception e) {
|
peers.size(), pendingPeers.size(), maxConnections);
|
||||||
log.warn("Failed to connect to " + address + ": " + e.getMessage());
|
ListenableFuture<SocketAddress> future = channels.openConnection(address.toSocketAddress(), peer);
|
||||||
handlePeerDeath(peer, e);
|
if (future.isDone())
|
||||||
|
Uninterruptibles.getUninterruptibly(future);
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
Throwable cause = Throwables.getRootCause(e);
|
||||||
|
log.warn("Failed to connect to " + address + ": " + cause.getMessage());
|
||||||
|
handlePeerDeath(peer, cause);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
peer.setSocketTimeout(connectTimeoutMillis);
|
peer.setSocketTimeout(connectTimeoutMillis);
|
||||||
@ -1245,10 +1251,10 @@ public class PeerGroup implements TransactionBroadcaster {
|
|||||||
backoffMap.get(peer.getAddress()).trackSuccess();
|
backoffMap.get(peer.getAddress()).trackSuccess();
|
||||||
|
|
||||||
// Sets up the newly connected peer so it can do everything it needs to.
|
// Sets up the newly connected peer so it can do everything it needs to.
|
||||||
log.info("{}: New peer", peer);
|
|
||||||
pendingPeers.remove(peer);
|
pendingPeers.remove(peer);
|
||||||
peers.add(peer);
|
peers.add(peer);
|
||||||
newSize = peers.size();
|
newSize = peers.size();
|
||||||
|
log.info("{}: New peer ({} connected, {} pending, {} max)", peer, newSize, pendingPeers.size(), maxConnections);
|
||||||
// Give the peer a filter that can be used to probabilistically drop transactions that
|
// Give the peer a filter that can be used to probabilistically drop transactions that
|
||||||
// aren't relevant to our wallet. We may still receive some false positives, which is
|
// aren't relevant to our wallet. We may still receive some false positives, which is
|
||||||
// OK because it helps improve wallet privacy. Old nodes will just ignore the message.
|
// OK because it helps improve wallet privacy. Old nodes will just ignore the message.
|
||||||
@ -1386,7 +1392,7 @@ public class PeerGroup implements TransactionBroadcaster {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void handlePeerDeath(final Peer peer, @Nullable Exception exception) {
|
protected void handlePeerDeath(final Peer peer, @Nullable Throwable exception) {
|
||||||
// Peer deaths can occur during startup if a connect attempt after peer discovery aborts immediately.
|
// Peer deaths can occur during startup if a connect attempt after peer discovery aborts immediately.
|
||||||
if (!isRunning()) return;
|
if (!isRunning()) return;
|
||||||
|
|
||||||
@ -1417,7 +1423,7 @@ public class PeerGroup implements TransactionBroadcaster {
|
|||||||
|
|
||||||
groupBackoff.trackFailure();
|
groupBackoff.trackFailure();
|
||||||
|
|
||||||
if (!(exception instanceof NoRouteToHostException)) {
|
if (exception instanceof NoRouteToHostException) {
|
||||||
if (address.getAddr() instanceof Inet6Address && !ipv6Unreachable) {
|
if (address.getAddr() instanceof Inet6Address && !ipv6Unreachable) {
|
||||||
ipv6Unreachable = true;
|
ipv6Unreachable = true;
|
||||||
log.warn("IPv6 peer connect failed due to routing failure, ignoring IPv6 addresses from now on");
|
log.warn("IPv6 peer connect failed due to routing failure, ignoring IPv6 addresses from now on");
|
||||||
|
@ -30,7 +30,8 @@ import java.net.SocketAddress;
|
|||||||
*/
|
*/
|
||||||
public interface ClientConnectionManager extends Service {
|
public interface ClientConnectionManager extends Service {
|
||||||
/**
|
/**
|
||||||
* Creates a new connection to the given address, with the given parser used to handle incoming data.
|
* Creates a new connection to the given address, with the given parser used to handle incoming data. Any errors
|
||||||
|
* that occur during connection will be returned in the given future, including errors that can occur immediately.
|
||||||
*/
|
*/
|
||||||
ListenableFuture<SocketAddress> openConnection(SocketAddress serverAddress, StreamParser parser);
|
ListenableFuture<SocketAddress> openConnection(SocketAddress serverAddress, StreamParser parser);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user