diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index 7f32f3f72..b559ac3c9 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -61,6 +61,8 @@ public abstract class TransportImpl implements Transport { /** map from routerIdentHash to timestamp (Long) that the peer was last unreachable */ private final Map _unreachableEntries; private final Map _wasUnreachableEntries; + // one-entry cache for reachable check + private volatile Hash _lastReachablePeer; private final Set _localAddresses; /** global router ident -> IP */ private static final Map _IPMap; @@ -851,14 +853,18 @@ public abstract class TransportImpl implements Transport { public void mayDisconnect(Hash peer) {} public boolean isUnreachable(Hash peer) { + if (peer == _lastReachablePeer) return false; boolean rv; Long when = _unreachableEntries.get(peer); if ((rv = when != null)) { long now = _context.clock().now(); rv = when.longValue() + UNREACHABLE_PERIOD >= now; if (!rv) { + _lastReachablePeer = peer; _unreachableEntries.remove(peer); } + } else { + _lastReachablePeer = peer; } return rv; } @@ -872,6 +878,8 @@ public abstract class TransportImpl implements Transport { Long now = Long.valueOf(_context.clock().now()); // This isn't very useful since it is cleared when they contact us _unreachableEntries.put(peer, now); + if (peer == _lastReachablePeer) + _lastReachablePeer = null; // This is not cleared when they contact us markWasUnreachable(peer, true); }