Author: toad
Date: 2007-11-30 18:54:55 +0000 (Fri, 30 Nov 2007)
New Revision: 16145

Added:
   trunk/freenet/src/freenet/support/math/TrivialRunningAverage.java
Modified:
   trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java
   trunk/freenet/src/freenet/node/NodeStats.java
   trunk/freenet/src/freenet/node/RequestSender.java
Log:
Add Success rates box

Modified: trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2007-11-30 18:44:31 UTC (rev 16144)
+++ trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2007-11-30 18:54:55 UTC (rev 16145)
@@ -205,6 +205,12 @@
                                loadStatsList.addChild("li", 
starters.statsPageLine(true, true));
                                loadStatsList.addChild("li", 
starters.diagnosticThrottlesLine(false));
                                loadStatsList.addChild("li", 
starters.diagnosticThrottlesLine(true));
+                               
+                               // Psuccess box
+                               HTMLNode successRateBox = 
nextTableCell.addChild("div", "class", "infobox");
+                               successRateBox.addChild("div", "class", 
"infobox-header", "Success rates");
+                               HTMLNode successRateContent = 
successRateBox.addChild("div", "class", "infobox-content");
+                               stats.fillSuccessRateBox(successRateContent);
                        }
                }


Modified: trunk/freenet/src/freenet/node/NodeStats.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStats.java       2007-11-30 18:44:31 UTC 
(rev 16144)
+++ trunk/freenet/src/freenet/node/NodeStats.java       2007-11-30 18:54:55 UTC 
(rev 16145)
@@ -23,6 +23,7 @@
 import freenet.support.api.LongCallback;
 import freenet.support.math.RunningAverage;
 import freenet.support.math.TimeDecayingRunningAverage;
+import freenet.support.math.TrivialRunningAverage;

 /** Node (as opposed to NodeClientCore) level statistics. Includes 
shouldRejectRequest(), but not limited
  * to stuff required to implement that. */
@@ -115,6 +116,12 @@
        final TimeDecayingRunningAverage 
successfulChkInsertBytesReceivedAverage;
        final TimeDecayingRunningAverage 
successfulSskInsertBytesReceivedAverage;

+       final TrivialRunningAverage globalFetchPSuccess;
+       final TrivialRunningAverage chkFetchPSuccess;
+       final TrivialRunningAverage sskFetchPSuccess;
+       final TrivialRunningAverage localFetchPSuccess;
+       final TrivialRunningAverage remoteFetchPSuccess;
+       
        File persistTarget; 
        File persistTemp;
        private long previous_input_stat;
@@ -299,6 +306,12 @@
                successfulChkInsertBytesReceivedAverage = new 
TimeDecayingRunningAverage(32768+1024+500, 180000, 0.0, 1024*1024*1024, 
throttleFS == null ? null : 
throttleFS.subset("SuccessfulChkInsertBytesReceivedAverage"), node);
                successfulSskInsertBytesReceivedAverage = new 
TimeDecayingRunningAverage(1024+1024+500, 180000, 0.0, 1024*1024*1024, 
throttleFS == null ? null : 
throttleFS.subset("SuccessfulSskInsertBytesReceivedAverage"), node);

+               globalFetchPSuccess = new TrivialRunningAverage();
+               chkFetchPSuccess = new TrivialRunningAverage();
+               sskFetchPSuccess = new TrivialRunningAverage();
+               localFetchPSuccess = new TrivialRunningAverage();
+               remoteFetchPSuccess = new TrivialRunningAverage();
+               
                requestOutputThrottle = 
                        new TokenBucket(Math.max(obwLimit*60, 32768*20), 
(int)((1000L*1000L*1000L) / (obwLimit * 
FRACTION_OF_BANDWIDTH_USED_BY_REQUESTS)), 0);
                requestInputThrottle = 
@@ -934,4 +947,48 @@
                return localPreemptiveRejectReasons.toTableRows(table) > 0;
        }

+       public void requestCompleted(boolean succeeded, boolean isRemote, 
boolean isSSK) {
+               globalFetchPSuccess.report(succeeded ? 1.0 : 0.0);
+               if(isSSK)
+                       sskFetchPSuccess.report(succeeded ? 1.0 : 0.0);
+               else
+                       chkFetchPSuccess.report(succeeded ? 1.0 : 0.0);
+               if(isRemote)
+                       remoteFetchPSuccess.report(succeeded ? 1.0 : 0.0);
+               else
+                       localFetchPSuccess.report(succeeded ? 1.0 : 0.0);
+       }
+
+       private final DecimalFormat fix3p3pct = new DecimalFormat("##0.000%");
+       
+       public void fillSuccessRateBox(HTMLNode parent) {
+               HTMLNode list = parent.addChild("table", "border", "0");
+               final TrivialRunningAverage[] averages = new 
TrivialRunningAverage[] {
+                               globalFetchPSuccess,
+                               chkFetchPSuccess,
+                               sskFetchPSuccess,
+                               localFetchPSuccess,
+                               remoteFetchPSuccess
+               };
+               final String[] names = new String[] {
+                               // FIXME l10n, but atm this only shows up in 
advanced mode
+                               "All requests",
+                               "CHKs",
+                               "SSKs",
+                               "Local requests",
+                               "Remote requests"
+               };
+               HTMLNode row = list.addChild("tr");
+               row.addChild("th", "Group"); 
+               row.addChild("th", "P(success)");
+               row.addChild("th", "Count");
+               
+               for(int i=0;i<averages.length;i++) {
+                       row = list.addChild("tr");
+                       row.addChild("td", names[i]);
+                       row.addChild("td", 
fix3p3pct.format(averages[i].currentValue()));
+                       row.addChild("td", 
Double.toString(averages[i].countReports()));
+               }
+       }
+       
 }

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2007-11-30 18:44:31 UTC 
(rev 16144)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2007-11-30 18:54:55 UTC 
(rev 16145)
@@ -626,13 +626,15 @@
                if(next != null) {
                        next.onSuccess(false, key instanceof NodeSSK);
                }
+               node.nodeStats.requestCompleted(true, source != null, key 
instanceof NodeSSK);

                if(key instanceof NodeCHK && next != null && 
                                (next.isOpennet() || 
node.passOpennetRefsThroughDarknet()) ) {
                        finishOpennet(next);
                } else
                        finishOpennetNull(next);
-        }
+        } else
+               node.nodeStats.requestCompleted(false, source != null, key 
instanceof NodeSSK);

                synchronized(this) {
                        opennetFinished = true;

Added: trunk/freenet/src/freenet/support/math/TrivialRunningAverage.java
===================================================================
--- trunk/freenet/src/freenet/support/math/TrivialRunningAverage.java           
                (rev 0)
+++ trunk/freenet/src/freenet/support/math/TrivialRunningAverage.java   
2007-11-30 18:54:55 UTC (rev 16145)
@@ -0,0 +1,47 @@
+package freenet.support.math;
+
+public class TrivialRunningAverage implements RunningAverage {
+
+       private static final long serialVersionUID = 1L;
+       private long reports;
+       private double total;
+       
+       public TrivialRunningAverage(TrivialRunningAverage average) {
+               this.reports = average.reports;
+               this.total = average.total;
+       }
+
+       public TrivialRunningAverage() {
+               reports = 0;
+               total = 0.0;
+       }
+
+       public synchronized long countReports() {
+               return reports;
+       }
+
+       public synchronized double currentValue() {
+               return total / reports;
+       }
+
+       public synchronized void report(double d) {
+               total += d;
+               reports++;
+               // TODO Auto-generated method stub
+
+       }
+
+       public void report(long d) {
+               report((double)d);
+       }
+
+       public synchronized double valueIfReported(double r) {
+               return (total + r) / (reports + 1);
+       }
+
+    public Object clone() {
+       return new TrivialRunningAverage(this);
+    }
+
+       
+}


Reply via email to