forked from I2P_Developers/i2p.i2p
Profiles: Change slice selection argument from an int to an enum for clarity
This commit is contained in:
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user