Author: toad
Date: 2006-06-01 18:24:08 +0000 (Thu, 01 Jun 2006)
New Revision: 8969
Modified:
trunk/freenet/src/freenet/node/NodePinger.java
trunk/freenet/src/freenet/node/Version.java
Log:
768:
Use median, not mean, of node ping times to calculate overall average ping time.
Exclude backed off nodes unless all are backed off.
Add some temporal averaging to prevent nodes going in and out of backoff from
influencing it too much.
Modified: trunk/freenet/src/freenet/node/NodePinger.java
===================================================================
--- trunk/freenet/src/freenet/node/NodePinger.java 2006-06-01 17:35:43 UTC
(rev 8968)
+++ trunk/freenet/src/freenet/node/NodePinger.java 2006-06-01 18:24:08 UTC
(rev 8969)
@@ -1,6 +1,9 @@
package freenet.node;
+import java.util.Arrays;
+
import freenet.support.Logger;
+import freenet.support.math.TimeDecayingRunningAverage;
/**
* Track average round-trip time for each peer node, get a geometric mean.
@@ -8,9 +11,13 @@
public class NodePinger implements Runnable {
private double meanPing = 0;
+ /** Average over time to avoid nodes flitting in and out of backoff
having too much impact. */
+ private TimeDecayingRunningAverage tdra;
NodePinger(Node n) {
this.node = n;
+ this.tdra = new TimeDecayingRunningAverage(0.0, 30*1000, // 30
seconds
+ 0.0, Double.MAX_VALUE);
Thread t = new Thread(this, "Node pinger");
t.setDaemon(true);
t.start();
@@ -31,21 +38,39 @@
/** Recalculate the mean ping time */
void recalculateMean(PeerNode[] peers) {
- int peerCount = 0;
- double total = 1.0;
+ if(peers.length == 0) return;
+ double d = calculateMedianPing(peers);
+ tdra.report(d);
+ meanPing = tdra.currentValue();
+ Logger.minor(this, "Reporting ping to temporal averager: "+d+"
result "+meanPing);
+ }
+
+ double calculateMedianPing(PeerNode[] peers) {
+
+ double[] allPeers = new double[peers.length];
+
+ /** Not backed off peers' ping times */
+ double[] nbPeers = new double[peers.length];
+
+ /** Number of not backed off peers */
+ int nbCount = 0;
+
for(int i=0;i<peers.length;i++) {
PeerNode peer = peers[i];
- if(!peer.isConnected()) continue;
- peerCount++;
- double avgPingTime = peer.averagePingTime();
- Logger.minor(this, "Peer: "+peer.getPeer()+",
avgPingTime: "+avgPingTime);
- total *= avgPingTime;
+ double pingTime = peer.averagePingTime();
+ if(!peer.isRoutingBackedOff()) {
+ nbPeers[nbCount++] = pingTime;
+ }
+ allPeers[i] = pingTime;
}
- if(peerCount > 0) {
- total = Math.pow(total, 1.0 / peerCount);
- meanPing = total;
- Logger.minor(this, "Mean ping: "+meanPing+"ms");
+
+ if(nbCount > 0) {
+ Arrays.sort(nbPeers, 0, nbCount);
+ return nbPeers[nbCount / 2]; // round down - prefer
lower
}
+
+ Arrays.sort(allPeers);
+ return allPeers[peers.length / 2];
}
public double averagePingTime() {
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-06-01 17:35:43 UTC (rev
8968)
+++ trunk/freenet/src/freenet/node/Version.java 2006-06-01 18:24:08 UTC (rev
8969)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 767;
+ private static final int buildNumber = 768;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 765;