From 58e95dc353b8a0e3ca0762fc60803673377e9955 Mon Sep 17 00:00:00 2001 From: zzz <zzz@i2pmail.org> Date: Sat, 17 Dec 2022 09:41:41 -0500 Subject: [PATCH] SSU: Don't call test forceRunSoon() in addPeer() to prevent test thrashing. Also removes the rebuildIfNecessary() call claimed to be removed in previous checkin. Since we aren't thrashing any more, reschedule test after UNKNOWN results, with the delay depending on current state. log tweaks --- .../router/transport/udp/UDPTransport.java | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 1a58c1d944..a075ed7f41 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1885,11 +1885,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - // Should always be direct... except maybe for hidden mode? - // or do we always know the IP by now? - if (remoteId.getIP() == null && _log.shouldLog(Log.WARN)) - _log.warn("Add indirect: " + peer); - // don't do this twice PeerState oldPeer2 = _peersByRemoteHost.put(remoteId, peer); if (oldPeer2 != null && oldPeer2 != peer && oldPeer2 != oldPeer) { @@ -1953,6 +1948,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } +/* synchronized(_rebuildLock) { rebuildIfNecessary(); Status status = getReachabilityStatus(); @@ -1961,6 +1957,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _testEvent.forceRunSoon(peer.isIPv6()); } } +*/ return true; } @@ -3063,8 +3060,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldLog(Log.WARN)) _log.warn("Wanted to rebuild my SSU address, but couldn't specify either the direct or indirect info (needs introducers? " + introducersRequired + - " ipv6? " + isIPv6 + - ')', new Exception()); + " ipv6? " + isIPv6 + ')'); _needsRebuild = true; // save the external address, even if we didn't publish it if (port > 0 && host != null) { @@ -3863,6 +3859,39 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority */ private void locked_setReachabilityStatus(Status newStatus, boolean isIPv6) { Status old = _reachabilityStatus; + if (newStatus == Status.UNKNOWN) { + // now that addRemotePeerState() doesn't schedule peer tests like crazy, + // we need to reschedule here + boolean runtest = false; + switch (old) { + case UNKNOWN: + runtest = true; + break; + + case IPV4_UNKNOWN_IPV6_OK: + case IPV4_UNKNOWN_IPV6_FIREWALLED: + if (!isIPv6) + runtest = true; + break; + + case IPV4_OK_IPV6_UNKNOWN: + case IPV4_DISABLED_IPV6_UNKNOWN: + case IPV4_FIREWALLED_IPV6_UNKNOWN: + case IPV4_SNAT_IPV6_UNKNOWN: + if (isIPv6) + runtest = true; + break; + } + if (runtest || old != _reachabilityStatusPending) { + if (_log.shouldWarn()) + _log.warn("Old status: " + old + " unchanged after update: UNKNOWN, reschedule test! ipv6? " + isIPv6); + _testEvent.forceRunSoon(isIPv6); + } else { + // run a little sooner than usual + _testEvent.forceRunSoon(isIPv6, 5*60*1000); + } + return; + } // merge new status into old Status status = Status.merge(old, newStatus); _testEvent.setLastTested(isIPv6); -- GitLab