From f49277087c86b663f428a306a5dee4ef95aa97bb Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 23 Sep 2008 18:47:10 +0000
Subject: [PATCH]     * TunnelPeerSelector: Avoid a peer for 20s after a reject
 or timeout

---
 .../router/peermanager/ProfileOrganizer.java  | 19 +++++++++++++++++++
 .../tunnel/pool/TunnelPeerSelector.java       |  1 +
 2 files changed, 20 insertions(+)

diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index 660324deed..e759441d94 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -477,6 +477,25 @@ public class ProfileOrganizer {
         return l;
     }
 
+    /**
+     * Get the peers that have recently rejected us for bandwidth
+     * recent == last 20s
+     *
+     */
+    public List selectPeersRecentlyRejecting() { 
+        synchronized (_reorganizeLock) {
+            long cutoff = _context.clock().now() - (20*1000);
+            int count = _notFailingPeers.size();
+            List l = new ArrayList(count / 128);
+            for (Iterator iter = _notFailingPeers.values().iterator(); iter.hasNext(); ) {
+                PeerProfile prof = (PeerProfile) iter.next();
+                if (prof.getTunnelHistory().getLastRejectedBandwidth() > cutoff)
+                    l.add(prof.getPeer());
+            }
+            return l;
+        }
+    }
+
     /**
      * Find the hashes for all peers we are actively profiling
      *
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
index beb52ca41a..2bd6ee7aa8 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
@@ -176,6 +176,7 @@ public abstract class TunnelPeerSelector {
         // Defaults changed to true for inbound only in filterUnreachable below.
 
         Set peers = new HashSet(1);
+        peers.addAll(ctx.profileOrganizer().selectPeersRecentlyRejecting());
         // if (false && filterUnreachable(ctx, isInbound, isExploratory)) {
         if (filterUnreachable(ctx, isInbound, isExploratory)) {
             List caps = ctx.peerManager().getPeersByCapability(Router.CAPABILITY_UNREACHABLE);
-- 
GitLab