From a3a1110b413de3eab32a002696df650fc2b40e8f Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 31 Oct 2011 16:48:46 +0000
Subject: [PATCH]   * ProfileOrganizer:     - Fix rare NSEE thx sponge

---
 .../net/i2p/router/peermanager/ProfileOrganizer.java |  2 +-
 .../net/i2p/router/peermanager/SpeedComparator.java  | 12 +++++++++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index a3eebc3329..875223c21b 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -894,7 +894,7 @@ public class ProfileOrganizer {
             Set<PeerProfile> sorted = new TreeSet(new SpeedComparator());
             sorted.addAll(_fastPeers.values());
             Iterator<PeerProfile> iter = sorted.iterator();
-            for (int i = 0; i < numToDemote; i++) {
+            for (int i = 0; i < numToDemote && iter.hasNext(); i++) {
                 _fastPeers.remove(iter.next().getPeer());
             }
         }
diff --git a/router/java/src/net/i2p/router/peermanager/SpeedComparator.java b/router/java/src/net/i2p/router/peermanager/SpeedComparator.java
index 793501e235..aad4043357 100644
--- a/router/java/src/net/i2p/router/peermanager/SpeedComparator.java
+++ b/router/java/src/net/i2p/router/peermanager/SpeedComparator.java
@@ -2,6 +2,8 @@ package net.i2p.router.peermanager;
 
 import java.util.Comparator;
 
+import net.i2p.data.DataHelper;
+
 /**
  * Order profiles by their speed (lowest first).
  * @since 0.7.10
@@ -17,6 +19,14 @@ class SpeedComparator implements Comparator<PeerProfile> {
             return 1;
         if (lval < rval)
             return -1;
-        return 0;
+
+        // we don't wan't to return 0 so profiles don't vanish in the TreeSet
+        lval = left.getCapacityValue();
+        rval = right.getCapacityValue();
+        if (lval > rval)
+            return 1;
+        if (lval < rval)
+            return -1;
+        return DataHelper.compareTo(right.getPeer().getData(), left.getPeer().getData());
     }
 }
-- 
GitLab