From 9fba12519f9f724c979e7aa8cfcf3893741ff1a4 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Thu, 18 Feb 2016 22:27:17 +0000 Subject: [PATCH] Transport: - Implement mayDisconnect() for outbound connections also - Run UDP idle disconnect loop faster if floodfill or near connection limit NetDB: - Call mayDisconnect() after direct netdb store - Fix check to publish RI faster, broken in .24, we were publishing at every check, causing increased load on floodfills --- .../router/networkdb/PublishLocalRouterInfoJob.java | 5 +++-- .../net/i2p/router/networkdb/kademlia/StoreJob.java | 7 +++++++ .../src/net/i2p/router/transport/ntcp/EventPumper.java | 5 ++++- .../net/i2p/router/transport/ntcp/NTCPTransport.java | 2 +- .../src/net/i2p/router/transport/udp/PeerState.java | 3 +++ .../src/net/i2p/router/transport/udp/UDPTransport.java | 10 +++++++--- 6 files changed, 25 insertions(+), 7 deletions(-) diff --git a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java index 5054d44c80..353663cc52 100644 --- a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java +++ b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java @@ -86,7 +86,8 @@ public class PublishLocalRouterInfoJob extends JobImpl { // 3 times out of 4, we don't republish if everything is the same... // If something changed, including the cost, then publish, // otherwise don't. - boolean different = !oldRI.getCapabilities().equals(ri.getCapabilities()); + String newcaps = getContext().router().getCapabilities(); + boolean different = !oldRI.getCapabilities().equals(newcaps); if (!different) { Comparator<RouterAddress> comp = new AddrComparator(); Collections.sort(oldAddrs, comp); @@ -107,7 +108,7 @@ public class PublishLocalRouterInfoJob extends JobImpl { } if (_log.shouldLog(Log.INFO)) _log.info("Republishing early because addresses or costs or caps have changed -" + - " oldCaps: " + oldRI.getCapabilities() + " newCaps: " + ri.getCapabilities() + + " oldCaps: " + oldRI.getCapabilities() + " newCaps: " + newcaps + " old:\n" + oldAddrs + "\nnew:\n" + newAddrs); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java index 5a76332fae..b233beaeae 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java @@ -562,9 +562,12 @@ class StoreJob extends JobImpl { private final TunnelInfo _sendThrough; private final int _msgSize; + /** direct */ public SendSuccessJob(RouterContext enclosingContext, RouterInfo peer) { this(enclosingContext, peer, null, 0); } + + /** through tunnel */ public SendSuccessJob(RouterContext enclosingContext, RouterInfo peer, TunnelInfo sendThrough, int size) { super(enclosingContext); _peer = peer; @@ -597,6 +600,10 @@ class StoreJob extends JobImpl { getContext().profileManager().tunnelDataPushed(_sendThrough.getPeer(i), howLong, _msgSize); _sendThrough.incrementVerifiedBytesTransferred(_msgSize); } + if (_sendThrough == null) { + // advise comm system, to reduce lifetime of direct connections to floodfills + getContext().commSystem().mayDisconnect(_peer.getHash()); + } if (_state.getCompleteCount() >= getRedundancy()) { succeed(); diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java index c90a51b89a..9b73d597f3 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -273,9 +273,12 @@ class EventPumper implements Runnable { } final long expire; - if (!haveCap && con.getMayDisconnect() && + if ((!haveCap || !con.isInbound()) && + con.getMayDisconnect() && con.getMessagesReceived() <= 2 && con.getMessagesSent() <= 1) { expire = MAY_DISCON_TIMEOUT; + if (_log.shouldInfo()) + _log.info("Possible early disconnect for " + con); } else { expire = _expireIdleWriteTime; } diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index d164499685..d371a936f5 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -495,7 +495,7 @@ public class NTCPTransport extends TransportImpl { @Override public void mayDisconnect(final Hash peer) { final NTCPConnection con = _conByIdent.get(peer); - if (con != null && con.isEstablished() && con.isInbound() && + if (con != null && con.isEstablished() && con.getMessagesReceived() <= 2 && con.getMessagesSent() <= 1) { con.setMayDisconnect(); } diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index 3c902883c9..dcaa7527bc 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -773,7 +773,10 @@ class PeerState { return _remoteIP.length == 16; } + /** the last time we used them as an introducer, or 0 */ public long getIntroducerTime() { return _lastIntroducerTime; } + + /** set the last time we used them as an introducer to now */ public void setIntroducerTime() { _lastIntroducerTime = _context.clock().now(); } /** 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 85e6e3d1c8..268c3e6c7a 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -2504,8 +2504,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority @Override public void mayDisconnect(final Hash peer) { final PeerState ps = _peersByIdent.get(peer); - if (ps != null && ps.isInbound() && + if (ps != null && ps.getWeRelayToThemAs() <= 0 && + (ps.getTheyRelayToUsAs() <= 0 || ps.getIntroducerTime() < _context.clock().now() - 2*60*60*1000) && ps.getMessagesReceived() <= 2 && ps.getMessagesSent() <= 2) { ps.setMayDisconnect(); } @@ -2935,7 +2936,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority boolean shouldPingFirewall = _reachabilityStatus != Status.OK; int currentListenPort = getListenPort(false); boolean pingOneOnly = shouldPingFirewall && getExternalPort(false) == currentListenPort; - boolean shortLoop = shouldPingFirewall; + boolean shortLoop = shouldPingFirewall || !haveCap || _context.netDb().floodfillEnabled(); _lastLoopShort = shortLoop; _expireBuffer.clear(); _runCount++; @@ -2946,8 +2947,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // if we offered to introduce them, or we used them as introducer in last 2 hours if (peer.getWeRelayToThemAs() > 0 || peer.getIntroducerTime() > pingCutoff) { inactivityCutoff = longInactivityCutoff; - } else if (!haveCap && peer.getMayDisconnect() && + } else if ((!haveCap || !peer.isInbound()) && + peer.getMayDisconnect() && peer.getMessagesReceived() <= 2 && peer.getMessagesSent() <= 2) { + if (_log.shouldInfo()) + _log.info("Possible early disconnect for: " + peer); inactivityCutoff = mayDisconCutoff; } else { inactivityCutoff = shortInactivityCutoff; -- GitLab