Author: odonata
Date: 2006-06-27 11:51:35 +0000 (Tue, 27 Jun 2006)
New Revision: 9391

Modified:
   trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
More metrics.  Here we add the percent of time a peer is backed off.
This uses a time based running average with a halflife of 30 mins.
The metric is always tracked but is only reported using advanced
mode.  Should we add this to normal mode too?


Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2006-06-27 00:15:18 UTC (rev 9390)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2006-06-27 11:51:35 UTC (rev 9391)
@@ -96,7 +96,7 @@
                long now = System.currentTimeMillis();

                node.alerts.toSummaryHtml(buf);
-               
+       
                /* node status values */
                int bwlimitDelayTime = (int) node.getBwlimitDelayTime();
                int nodeAveragePingTime = (int) node.getNodeAveragePingTime();
@@ -321,7 +321,7 @@
                                row[4] = ( pn.getDetectedPeer() != null ? 
HTMLEncoder.encode(pn.getDetectedPeer().toString()) : "(address unknown)" ) + 
avgPingTimeString;
                                row[5] = 
versionPrefixString+versionString+versionSuffixString;
                                row[6] = new 
Double(pn.getLocation().getValue());
-                               row[7] = backoff/1000 + "/" + 
pn.getRoutingBackoffLength()/1000+lastBackoffReasonOutputString;
+                               row[7] = 
fix1.format(pn.backedOffPercent.currentValue())+" "+backoff/1000 + "/" + 
pn.getRoutingBackoffLength()/1000+lastBackoffReasonOutputString;
                                row[8] = idleToString(now, idle, ((Integer) 
status).intValue());
                                row[9] = HTMLEncoder.encode(pn.getName());
                        }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-06-27 00:15:18 UTC 
(rev 9390)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-06-27 11:51:35 UTC 
(rev 9391)
@@ -683,6 +683,9 @@
         Logger.minor(this, "Sending async: "+msg+" : "+cb+" on "+this);
         if(!isConnected) throw new NotConnectedException();
         MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[] {cb});
+       synchronized(routingBackoffSync) {
+               reportBackoffStatus(System.currentTimeMillis());
+       }
         synchronized(messagesToSendNow) {
             messagesToSendNow.addLast(item);
         }
@@ -1599,7 +1602,11 @@
        String lastRoutingBackoffReason = null;
        /** Previous backoff reason (used by setPeerNodeStatus)*/
        String previousRoutingBackoffReason = null;
-       
+       /* percent of time this peer is backedoff */
+       public RunningAverage backedOffPercent = new 
TimeDecayingRunningAverage(0.0, 180000, 0.0, 1.0);
+       /* time of last sample */
+       private long lastSampleTime = Long.MAX_VALUE;
+    
        /**
         * Got a local RejectedOverload.
         * Back off this node for a while.
@@ -1607,6 +1614,24 @@
        public void localRejectedOverload() {
          localRejectedOverload("");
        }
+
+       /** 
+        * Track the percentage of time a peer spends backed off
+        */
+       private void reportBackoffStatus(long now) {
+               if(now > lastSampleTime) {
+                       if (now > routingBackedOffUntil) {
+                               if (lastSampleTime > routingBackedOffUntil) {
+                                       backedOffPercent.report(0.0);
+                               } else {
+                                       
backedOffPercent.report((double)(routingBackedOffUntil-lastSampleTime)/(double)(now-lastSampleTime));
+                               }
+                       } else {
+                               backedOffPercent.report(1.0);
+                       }
+               }
+               lastSampleTime = now;
+       }

        /**
         * Got a local RejectedOverload.
@@ -1616,6 +1641,7 @@
                Logger.minor(this, "Local rejected overload on "+this);
                synchronized(routingBackoffSync) {
                        long now = System.currentTimeMillis();
+                       reportBackoffStatus(now);
                        // Don't back off any further if we are already backed 
off
                        if(now > routingBackedOffUntil) {
                                routingBackoffLength = routingBackoffLength * 
BACKOFF_MULTIPLIER;
@@ -1629,6 +1655,7 @@
                                if( 0 <= reason.length()) {
                                        reasonWrapper = " because of 
'"+reason+"'";
                                }
+
                                Logger.minor(this, "Backing 
off"+reasonWrapper+": routingBackoffLength="+routingBackoffLength+", until 
"+x+"ms on "+getPeer());
                        } else {
                                Logger.minor(this, "Ignoring 
localRejectedOverload: "+(routingBackedOffUntil-now)+"ms remaining on routing 
backoff on "+getPeer());
@@ -1644,6 +1671,7 @@
                Logger.minor(this, "Success not overload on "+this);
                synchronized(routingBackoffSync) {
                        long now = System.currentTimeMillis();
+                       reportBackoffStatus(now);
                        // Don't un-backoff if still backed off
                        if(now > routingBackedOffUntil) {
                                routingBackoffLength = 
INITIAL_ROUTING_BACKOFF_LENGTH;


Reply via email to