Author: toad
Date: 2009-01-12 18:27:49 +0000 (Mon, 12 Jan 2009)
New Revision: 25026
Added:
trunk/freenet/src/freenet/support/math/MedianMeanRunningAverage.java
Modified:
trunk/freenet/src/freenet/io/xfer/BlockReceiver.java
trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
trunk/freenet/src/freenet/node/RequestSender.java
Log:
Median+mean running average, and use it to provide more stats. FIXME must be
configurable, as is theoretically a memory leak.
Modified: trunk/freenet/src/freenet/io/xfer/BlockReceiver.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/BlockReceiver.java 2009-01-12
17:38:42 UTC (rev 25025)
+++ trunk/freenet/src/freenet/io/xfer/BlockReceiver.java 2009-01-12
18:27:49 UTC (rev 25026)
@@ -34,6 +34,7 @@
import freenet.support.BitArray;
import freenet.support.Buffer;
import freenet.support.Logger;
+import freenet.support.math.MedianMeanRunningAverage;
import freenet.support.math.TrivialRunningAverage;
/**
@@ -171,7 +172,7 @@
long transferTime = (endTime - startTime);
synchronized(avgTimeTaken) {
avgTimeTaken.report(transferTime);
- Logger.minor(this, "Block transfer took
"+transferTime+"ms - average is "+avgTimeTaken.currentValue());
+ Logger.minor(this, "Block transfer took
"+transferTime+"ms - average is "+avgTimeTaken);
}
return _prb.getBlock();
@@ -192,7 +193,7 @@
}
}
- private static TrivialRunningAverage avgTimeTaken = new
TrivialRunningAverage();
+ private static MedianMeanRunningAverage avgTimeTaken = new
MedianMeanRunningAverage();
private void maybeResetDiscardFilter() {
long timeleft=discardEndTime-System.currentTimeMillis();
Modified: trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java
===================================================================
--- trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java 2009-01-12
17:38:42 UTC (rev 25025)
+++ trunk/freenet/src/freenet/io/xfer/BlockTransmitter.java 2009-01-12
18:27:49 UTC (rev 25026)
@@ -36,6 +36,8 @@
import freenet.support.Logger;
import freenet.support.TimeUtil;
import freenet.support.io.NativeThread;
+import freenet.support.math.MedianMeanRunningAverage;
+import freenet.support.math.TrivialRunningAverage;
/**
* @author ian
@@ -152,6 +154,7 @@
}
public boolean send(Executor executor) {
+ long startTime = System.currentTimeMillis();
PartiallyReceivedBlock.PacketReceivedListener myListener=null;
try {
@@ -226,6 +229,13 @@
}
}
} else if
(msg.getSpec().equals(DMT.allReceived)) {
+ long endTime =
System.currentTimeMillis();
+ long transferTime = (endTime -
startTime);
+ synchronized(avgTimeTaken) {
+
avgTimeTaken.report(transferTime);
+ Logger.minor(this, "Block send
took "+transferTime+" : "+avgTimeTaken);
+ }
+
return true;
} else if
(msg.getSpec().equals(DMT.sendAborted)) {
// Overloaded: receiver no longer wants
the data
@@ -264,6 +274,8 @@
}
}
+ private static MedianMeanRunningAverage avgTimeTaken = new
MedianMeanRunningAverage();
+
public int getNumSent() {
int ret = 0;
for (int x=0; x<_sentPackets.getSize(); x++) {
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2009-01-12 17:38:42 UTC
(rev 25025)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2009-01-12 18:27:49 UTC
(rev 25026)
@@ -34,6 +34,7 @@
import freenet.support.ShortBuffer;
import freenet.support.SimpleFieldSet;
import freenet.support.io.NativeThread;
+import freenet.support.math.MedianMeanRunningAverage;
/**
* @author amphibian
@@ -97,6 +98,7 @@
static final int GET_OFFER_TRANSFER_FAILED = 11;
private PeerNode successFrom;
private PeerNode lastNode;
+ private final long startTime;
static String getStatusString(int status) {
switch(status) {
@@ -147,6 +149,7 @@
*/
public RequestSender(Key key, DSAPublicKey pubKey, short htl, long uid,
Node n,
PeerNode source, boolean offersOnly) {
+ startTime = System.currentTimeMillis();
this.key = key;
this.pubKey = pubKey;
this.htl = htl;
@@ -1054,6 +1057,8 @@
}
}
+ private static MedianMeanRunningAverage avgTimeTaken = new
MedianMeanRunningAverage();
+
private void finish(int code, PeerNode next, boolean fromOfferedKey) {
if(logMINOR) Logger.minor(this, "finish("+code+ ')');
@@ -1065,6 +1070,13 @@
}
if(status == SUCCESS) {
+ if(key instanceof NodeCHK) {
+ long timeTaken = System.currentTimeMillis() - startTime;
+ synchronized(avgTimeTaken) {
+ avgTimeTaken.report(timeTaken);
+ if(logMINOR) Logger.minor(this, "Successful CHK
request took "+timeTaken+" average "+avgTimeTaken);
+ }
+ }
if(next != null) {
next.onSuccess(false, key instanceof NodeSSK);
}
Added: trunk/freenet/src/freenet/support/math/MedianMeanRunningAverage.java
===================================================================
--- trunk/freenet/src/freenet/support/math/MedianMeanRunningAverage.java
(rev 0)
+++ trunk/freenet/src/freenet/support/math/MedianMeanRunningAverage.java
2009-01-12 18:27:49 UTC (rev 25026)
@@ -0,0 +1,54 @@
+package freenet.support.math;
+
+import java.util.ArrayList;
+import java.util.TreeSet;
+
+public class MedianMeanRunningAverage implements RunningAverage {
+
+ final ArrayList<Double> reports;
+ final TrivialRunningAverage mean;
+
+ public MedianMeanRunningAverage() {
+ reports = new ArrayList<Double>();
+ mean = new TrivialRunningAverage();
+ }
+
+ public MedianMeanRunningAverage(MedianMeanRunningAverage average) {
+ this.mean = new TrivialRunningAverage(average.mean);
+ this.reports = new ArrayList<Double>();
+ reports.addAll(average.reports);
+ }
+
+ public Object clone() {
+ return new MedianMeanRunningAverage(this);
+ }
+
+ public synchronized long countReports() {
+ return reports.size();
+ }
+
+ public synchronized double currentValue() {
+ int size = reports.size();
+ int middle = size / 2;
+ java.util.Collections.sort(reports);
+ return reports.get(middle);
+ }
+
+ public synchronized void report(double d) {
+ mean.report(d);
+ reports.add(d);
+ }
+
+ public void report(long d) {
+ report((double)d);
+ }
+
+ public double valueIfReported(double r) {
+ throw new UnsupportedOperationException();
+ }
+
+ public synchronized String toString() {
+ return "Median "+currentValue()+" mean "+mean.currentValue();
+ }
+
+}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs