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;