Author: robert
Date: 2008-02-14 19:06:52 +0000 (Thu, 14 Feb 2008)
New Revision: 17898
Modified:
trunk/freenet/src/freenet/node/NetworkIDManager.java
Log:
explicitly order network groups
Modified: trunk/freenet/src/freenet/node/NetworkIDManager.java
===================================================================
--- trunk/freenet/src/freenet/node/NetworkIDManager.java 2008-02-14
18:51:14 UTC (rev 17897)
+++ trunk/freenet/src/freenet/node/NetworkIDManager.java 2008-02-14
19:06:52 UTC (rev 17898)
@@ -3,6 +3,8 @@
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -27,7 +29,7 @@
* @author robert
* @created 2008-02-06
*/
-public class NetworkIDManager implements Runnable {
+public class NetworkIDManager implements Runnable, Comparator {
public static boolean disableSecretPings=true;
public static boolean disableSecretPinger=true;
public static boolean disableSwapSegregation=true;
@@ -249,7 +251,7 @@
synchronized (secretsByPeer) {
StoredSecret
prev=(StoredSecret)secretsByPeer.get(s.peer);
if (prev!=null) {
- Logger.normal(this, "Removing on replacement:
"+s);
+ if (logMINOR) Logger.minor(this, "Removing on
replacement: "+s);
removeSecret(prev);
}
//Need to remember by peer (so we can remove it on
disconnect)
@@ -590,12 +592,13 @@
List newNetworkGroups=new ArrayList();
HashSet all=getAllConnectedPeers();
HashSet todo=(HashSet)all.clone();
- HashSet takenNetworkIds=new HashSet();
synchronized (transitionLock) {
inTransition=true;
}
+ if (logMINOR) Logger.minor(this, "doNetworkIDReckoning for
"+all.size()+" peers");
+
if (todo.isEmpty())
return;
@@ -617,6 +620,16 @@
members=xferConnectedPeerSetFor(mostConnected,
todo);
}
newGroup.setMembers(members);
+ }
+
+ //The groups are broken up, now sort by priority & assign them
a network id.
+ Collections.sort(newNetworkGroups, this);
+
+ HashSet takenNetworkIds=new HashSet();
+ Iterator i=newNetworkGroups.iterator();
+
+ while (i.hasNext()) {
+ PeerNetworkGroup newGroup=(PeerNetworkGroup)i.next();
newGroup.setForbiddenIds(takenNetworkIds);
int id=newGroup.getConsensus();
@@ -624,14 +637,15 @@
id=node.random.nextInt();
newGroup.assignNetworkId(id);
takenNetworkIds.add(new Integer(id));
+ if (logMINOR) Logger.minor(this, "net "+id+" has
"+newGroup.members.size()+" peers");
}
- //for now, we'll just say we are in our most-connected group.
really it needs to be most-successful, or dungeons may support themselves!
PeerNetworkGroup
ourgroup=(PeerNetworkGroup)newNetworkGroups.get(0);
ourgroup.ourGroup=true;
ourNetworkId=ourgroup.networkid;
Logger.error(this, "I am in network: "+ourNetworkId+", and have
divided my "+all.size()+" peers into "+newNetworkGroups.size()+" network
groups");
+ Logger.error(this, "largestGroup="+ourgroup.members.size());
Logger.error(this,
"bestFirst="+cheat_stats_general_bestOther.currentValue());
Logger.error(this,
"bestGeneralFactor="+cheat_stats_findBestSetwisePingAverage_best_general.currentValue());
@@ -854,6 +868,7 @@
long lastAssign;
/*
Returns the group consensus. If no peer in this group has
advertised an id, then the last-assigned id is returned.
+ @todo should be explict or weighted towards most-successful
(not neccesarily just 'consensus')
*/
int getConsensus() {
HashMap h=new HashMap();
@@ -955,4 +970,16 @@
return !a.networkGroup.equals(b.networkGroup);
}
}
+
+ /**
+ * Orders PeerNetworkGroups by size largest first. Determines the
priority-order in the master list.
+ * Throws on comparison of non-network-groups or those without members
assigned.
+ */
+ public int compare(Object a1, Object b1) {
+ PeerNetworkGroup a=(PeerNetworkGroup)a1;
+ PeerNetworkGroup b=(PeerNetworkGroup)b1;
+ //since we want largest-first, this is backwards of what it
would normally be (a-b).
+ return b.members.size()-a.members.size();
+ }
+
}
\ No newline at end of file