forked from I2P_Developers/i2p.i2p
Router: FloodfillPeerSelector cleanup (ticket #2694)
This commit is contained in:
@ -51,6 +51,7 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
* after they're complete, sort via kademlia.
|
* after they're complete, sort via kademlia.
|
||||||
* Puts the floodfill peers that are directly connected first in the list.
|
* Puts the floodfill peers that are directly connected first in the list.
|
||||||
* List will not include our own hash.
|
* List will not include our own hash.
|
||||||
|
* Returns new list, may be modified.
|
||||||
*
|
*
|
||||||
* @param key the ROUTING key (NOT the original key)
|
* @param key the ROUTING key (NOT the original key)
|
||||||
* @param peersToIgnore can be null
|
* @param peersToIgnore can be null
|
||||||
@ -66,6 +67,7 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
* after they're complete, sort via kademlia.
|
* after they're complete, sort via kademlia.
|
||||||
* Does not prefer the floodfill peers that are directly connected.
|
* Does not prefer the floodfill peers that are directly connected.
|
||||||
* List will not include our own hash.
|
* List will not include our own hash.
|
||||||
|
* Returns new list, may be modified.
|
||||||
*
|
*
|
||||||
* @param key the ROUTING key (NOT the original key)
|
* @param key the ROUTING key (NOT the original key)
|
||||||
* @param peersToIgnore can be null
|
* @param peersToIgnore can be null
|
||||||
@ -80,6 +82,7 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
* Pick out peers with the floodfill capacity set, returning them first, but then
|
* Pick out peers with the floodfill capacity set, returning them first, but then
|
||||||
* after they're complete, sort via kademlia.
|
* after they're complete, sort via kademlia.
|
||||||
* List will not include our own hash.
|
* List will not include our own hash.
|
||||||
|
* Returns new list, may be modified.
|
||||||
*
|
*
|
||||||
* @param key the ROUTING key (NOT the original key)
|
* @param key the ROUTING key (NOT the original key)
|
||||||
* @param peersToIgnore can be null
|
* @param peersToIgnore can be null
|
||||||
@ -103,10 +106,12 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param kbuckets now unused
|
|
||||||
* @return all floodfills not banlisted forever.
|
|
||||||
* List will not include our own hash.
|
* List will not include our own hash.
|
||||||
* List is not sorted and not shuffled.
|
* List is not sorted and not shuffled.
|
||||||
|
* Returns new list, may be modified.
|
||||||
|
*
|
||||||
|
* @param kbuckets now unused
|
||||||
|
* @return all floodfills not banlisted forever.
|
||||||
*/
|
*/
|
||||||
List<Hash> selectFloodfillParticipants(KBucketSet<Hash> kbuckets) {
|
List<Hash> selectFloodfillParticipants(KBucketSet<Hash> kbuckets) {
|
||||||
Set<Hash> ignore = Collections.singleton(_context.routerHash());
|
Set<Hash> ignore = Collections.singleton(_context.routerHash());
|
||||||
@ -114,11 +119,13 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* List MAY INCLUDE our own hash.
|
||||||
|
* List is not sorted and not shuffled.
|
||||||
|
* Returns new list, may be modified.
|
||||||
|
*
|
||||||
* @param kbuckets now unused
|
* @param kbuckets now unused
|
||||||
* @param toIgnore can be null
|
* @param toIgnore can be null
|
||||||
* @return all floodfills not banlisted forever.
|
* @return all floodfills not banlisted forever.
|
||||||
* List MAY INCLUDE our own hash.
|
|
||||||
* List is not sorted and not shuffled.
|
|
||||||
*/
|
*/
|
||||||
private List<Hash> selectFloodfillParticipants(Set<Hash> toIgnore, KBucketSet<Hash> kbuckets) {
|
private List<Hash> selectFloodfillParticipants(Set<Hash> toIgnore, KBucketSet<Hash> kbuckets) {
|
||||||
/*****
|
/*****
|
||||||
@ -145,6 +152,7 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
* at the front and the bad ones at the back. If they are all good or bad,
|
* at the front and the bad ones at the back. If they are all good or bad,
|
||||||
* searches and stores won't work well.
|
* searches and stores won't work well.
|
||||||
* List will not include our own hash.
|
* List will not include our own hash.
|
||||||
|
* Returns new list, may be modified.
|
||||||
*
|
*
|
||||||
* @return floodfills closest to the key that are not banlisted forever
|
* @return floodfills closest to the key that are not banlisted forever
|
||||||
* @param key the ROUTING key (NOT the original key)
|
* @param key the ROUTING key (NOT the original key)
|
||||||
@ -180,6 +188,8 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
/**
|
/**
|
||||||
* See above for description
|
* See above for description
|
||||||
* List will not include our own hash
|
* List will not include our own hash
|
||||||
|
* Returns new list, may be modified.
|
||||||
|
*
|
||||||
* @param key the ROUTING key (NOT the original key)
|
* @param key the ROUTING key (NOT the original key)
|
||||||
* @param toIgnore can be null
|
* @param toIgnore can be null
|
||||||
* @param kbuckets now unused
|
* @param kbuckets now unused
|
||||||
@ -198,18 +208,16 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
/**
|
/**
|
||||||
* See above for description
|
* See above for description
|
||||||
* List MAY CONTAIN our own hash unless included in toIgnore
|
* List MAY CONTAIN our own hash unless included in toIgnore
|
||||||
|
* Returns new list, may be modified.
|
||||||
|
*
|
||||||
* @param key the ROUTING key (NOT the original key)
|
* @param key the ROUTING key (NOT the original key)
|
||||||
* @param toIgnore can be null
|
* @param toIgnore can be null
|
||||||
* @param kbuckets now unused
|
* @param kbuckets now unused
|
||||||
*/
|
*/
|
||||||
private List<Hash> selectFloodfillParticipantsIncludingUs(Hash key, int howMany, Set<Hash> toIgnore, KBucketSet<Hash> kbuckets) {
|
private List<Hash> selectFloodfillParticipantsIncludingUs(Hash key, int howMany, Set<Hash> toIgnore, KBucketSet<Hash> kbuckets) {
|
||||||
List<Hash> ffs = selectFloodfillParticipants(toIgnore, kbuckets);
|
List<Hash> sorted = selectFloodfillParticipants(toIgnore, kbuckets);
|
||||||
TreeSet<Hash> sorted = new TreeSet<Hash>(new XORComparator<Hash>(key));
|
Collections.sort(sorted, new XORComparator<Hash>(key));
|
||||||
sorted.addAll(ffs);
|
|
||||||
|
|
||||||
List<Hash> rv = new ArrayList<Hash>(howMany);
|
|
||||||
List<Hash> okff = new ArrayList<Hash>(ffs.size());
|
|
||||||
List<Hash> badff = new ArrayList<Hash>(ffs.size());
|
|
||||||
int found = 0;
|
int found = 0;
|
||||||
long now = _context.clock().now();
|
long now = _context.clock().now();
|
||||||
long installed = _context.getProperty("router.firstInstalled", 0L);
|
long installed = _context.getProperty("router.firstInstalled", 0L);
|
||||||
@ -228,15 +236,17 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 5 == FNDF.MAX_TO_FLOOD + 1
|
// 5 == FNDF.MAX_TO_FLOOD + 1
|
||||||
int limit = Math.max(5, howMany);
|
int limit = Math.max(5, howMany + 2);
|
||||||
limit = Math.min(limit, ffs.size());
|
limit = Math.min(limit, sorted.size());
|
||||||
MaskedIPSet maskedIPs = new MaskedIPSet(limit * 3);
|
MaskedIPSet maskedIPs = new MaskedIPSet(limit * 3);
|
||||||
// split sorted list into 3 sorted lists
|
// split sorted list into 3 sorted lists
|
||||||
|
List<Hash> rv = new ArrayList<Hash>(howMany);
|
||||||
|
List<Hash> okff = new ArrayList<Hash>(limit);
|
||||||
|
List<Hash> badff = new ArrayList<Hash>(limit);
|
||||||
for (int i = 0; found < howMany && i < limit; i++) {
|
for (int i = 0; found < howMany && i < limit; i++) {
|
||||||
Hash entry = sorted.first();
|
Hash entry = sorted.get(i);
|
||||||
if (entry == null)
|
if (entry == null)
|
||||||
break; // shouldn't happen
|
break; // shouldn't happen
|
||||||
sorted.remove(entry);
|
|
||||||
// put anybody in the same /16 at the end
|
// put anybody in the same /16 at the end
|
||||||
RouterInfo info = _context.netDb().lookupRouterInfoLocally(entry);
|
RouterInfo info = _context.netDb().lookupRouterInfoLocally(entry);
|
||||||
MaskedIPSet entryIPs = new MaskedIPSet(_context, entry, info, 2);
|
MaskedIPSet entryIPs = new MaskedIPSet(_context, entry, info, 2);
|
||||||
@ -312,7 +322,7 @@ class FloodfillPeerSelector extends PeerSelector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info("Good: " + rv + " OK: " + okff + " Bad: " + badff);
|
_log.info("Wanted: " + howMany + " Good: " + rv + " OK: " + okff + " Bad: " + badff);
|
||||||
|
|
||||||
// Put the ok floodfills after the good floodfills
|
// Put the ok floodfills after the good floodfills
|
||||||
for (int i = 0; found < howMany && i < okff.size(); i++) {
|
for (int i = 0; found < howMany && i < okff.size(); i++) {
|
||||||
|
Reference in New Issue
Block a user