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);
+ }
+
+
+}