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;


Reply via email to