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