From 5383f9f097d221e578d213a098a74eb53b04ea96 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 25 Nov 2014 14:25:42 +0000
Subject: [PATCH] Profiles: Change slice selection argument from an int to an
 enum for clarity

---
 .../router/peermanager/ProfileOrganizer.java  | 45 +++++++++++++------
 .../tunnel/pool/ClientPeerSelector.java       |  7 +--
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index ca2829b151..7ebc4ce936 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -367,6 +367,29 @@ public class ProfileOrganizer {
         return;
     }
     
+    /**
+     *  Replaces integer subTierMode argument, for clarity
+     *
+     *  @since 0.9.18
+     */
+    public enum Slice {
+
+        SLICE_ALL(0x00, 0),
+        SLICE_0_1(0x02, 0),
+        SLICE_2_3(0x02, 2),
+        SLICE_0(0x03, 0),
+        SLICE_1(0x03, 1),
+        SLICE_2(0x03, 2),
+        SLICE_3(0x03, 3);
+
+        final int mask, val;
+
+        Slice(int mask, int val) {
+            this.mask = mask;
+            this.val = val;
+        }
+    }
+
     /**
      * Return a set of Hashes for peers that are both fast and reliable.  If an insufficient
      * number of peers are both fast and reliable, fall back onto high capacity peers, and if that
@@ -388,15 +411,15 @@ public class ProfileOrganizer {
      *    7: return only from group 3
      *</pre>
      */
-    public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, Hash randomKey, int subTierMode) {
+    public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, Hash randomKey, Slice subTierMode) {
         getReadLock();
         try {
-            if (subTierMode > 0) {
+            if (subTierMode != Slice.SLICE_ALL) {
                 int sz = _fastPeers.size();
-                if (sz < 6 || (subTierMode >= 4 && sz < 12))
-                    subTierMode = 0;
+                if (sz < 6 || (subTierMode.mask >= 3 && sz < 12))
+                    subTierMode = Slice.SLICE_ALL;
             }
-            if (subTierMode > 0)
+            if (subTierMode != Slice.SLICE_ALL)
                 locked_selectPeers(_fastPeers, howMany, exclude, matches, randomKey, subTierMode);
             else
                 locked_selectPeers(_fastPeers, howMany, exclude, matches, 2);
@@ -1302,7 +1325,8 @@ public class ProfileOrganizer {
      *    7: return only from group 3
      *</pre>
      */
-    private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches, Hash randomKey, int subTierMode) {
+    private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude,
+                                    Set<Hash> matches, Hash randomKey, Slice subTierMode) {
         List<Hash> all = new ArrayList<Hash>(peers.keySet());
         // use RandomIterator to avoid shuffling the whole thing
         for (Iterator<Hash> iter = new RandomIterator<Hash>(all); (matches.size() < howMany) && iter.hasNext(); ) {
@@ -1314,13 +1338,8 @@ public class ProfileOrganizer {
             if (_us.equals(peer))
                 continue;
             int subTier = getSubTier(peer, randomKey);
-            if (subTierMode >= 4) {
-                if (subTier != (subTierMode & 0x03))
-                    continue;
-            } else {
-                if ((subTier >> 1) != (subTierMode & 0x01))
-                    continue;
-            }
+            if ((subTier & subTierMode.mask) != subTierMode.val)
+                continue;
             boolean ok = isSelectable(peer);
             if (ok)
                 matches.add(peer);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java
index 2e13c4c57f..a96504b7c7 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java
@@ -8,6 +8,7 @@ import java.util.Set;
 import net.i2p.data.Hash;
 import net.i2p.router.RouterContext;
 import net.i2p.router.TunnelPoolSettings;
+import static net.i2p.router.peermanager.ProfileOrganizer.Slice.*;
 
 /**
  * Pick peers randomly out of the fast pool, and put them into tunnels
@@ -49,7 +50,7 @@ class ClientPeerSelector extends TunnelPeerSelector {
                 if (!settings.isInbound()) {
                     // exclude existing OBEPs to get some diversity
                 }
-                ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? 2 : 4);
+                ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? SLICE_0_1 : SLICE_0);
                 matches.remove(ctx.routerHash());
                 exclude.addAll(matches);
                 rv.addAll(matches);
@@ -57,7 +58,7 @@ class ClientPeerSelector extends TunnelPeerSelector {
                 if (length > 2) {
                     // middle hop(s)
                     // group 2 or 3
-                    ctx.profileOrganizer().selectFastPeers(length - 2, exclude, matches, settings.getRandomKey(), 3);
+                    ctx.profileOrganizer().selectFastPeers(length - 2, exclude, matches, settings.getRandomKey(), SLICE_2_3);
                     matches.remove(ctx.routerHash());
                     if (matches.size() > 1) {
                         // order the middle peers for tunnels >= 4 hops
@@ -75,7 +76,7 @@ class ClientPeerSelector extends TunnelPeerSelector {
                 if (settings.isInbound()) {
                     // exclude existing IBGWs to get some diversity
                 }
-                ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? 3 : 5);
+                ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? SLICE_2_3 : SLICE_1);
                 matches.remove(ctx.routerHash());
                 rv.addAll(matches);
             }
-- 
GitLab