Author: zothar
Date: 2006-06-09 21:29:39 +0000 (Fri, 09 Jun 2006)
New Revision: 9110
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/Version.java
Log:
794: Added a peer routing backoff summary to the /darknet/ page.
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-06-09 21:10:34 UTC (rev 9109)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-06-09 21:29:39 UTC (rev 9110)
@@ -146,6 +146,26 @@
buf.append("</div>");
buf.append("</div>\n");
+ buf.append("</td><td class=\"last\">");
+
+ // Peer routing backoff reason box
+ buf.append("<div class=\"infobox\">");
+ buf.append("<div class=\"infobox-header\">Peer backoff
reasons</div>");
+ buf.append("<div class=\"infobox-content\">");
+ String [] routingBackoffReasons =
node.getPeerNodeRoutingBackoffReasons();
+ if(routingBackoffReasons.length == 0) {
+ buf.append("Good, your node is not backed off from any
peers!<br/>\n");
+ } else {
+ for(int i=0;i<routingBackoffReasons.length;i++) {
+ int reasonCount =
node.getPeerNodeRoutingBackoffReasonSize(routingBackoffReasons[i]);
+ if(reasonCount > 0) {
+
buf.append(routingBackoffReasons[i]+": "+reasonCount+"<br/>\n");
+ }
+ }
+ }
+ buf.append("</div>");
+ buf.append("</div>\n");
+
buf.append("</td></tr></table>\n");
buf.append("<div class=\"infobox infobox-normal\">\n");
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-06-09 21:10:34 UTC (rev
9109)
+++ trunk/freenet/src/freenet/node/Node.java 2006-06-09 21:29:39 UTC (rev
9110)
@@ -478,6 +478,8 @@
private final long peerNodeStatusLogInterval = 1000;
/** PeerNode statuses, by status */
private final HashMap peerNodeStatuses;
+ /** PeerNode routing backoff reasons, by reason */
+ private final HashMap peerNodeRoutingBackoffReasons;
/** Next time to update oldestNeverConnectedPeerAge */
private long nextOldestNeverConnectedPeerAgeUpdateTime = -1;
/** oldestNeverConnectedPeerAge update interval (milliseconds) */
@@ -909,6 +911,7 @@
insertSenders = new HashMap();
arkFetchers = new HashMap();
peerNodeStatuses = new HashMap();
+ peerNodeRoutingBackoffReasons = new HashMap();
runningUIDs = new HashSet();
dnsr = new DNSRequester(this);
ps = new PacketSender(this);
@@ -2903,7 +2906,7 @@
}
/**
- * Remove a disconnected node from the map
+ * Remove a PeerNode status from the map
*/
public synchronized void removePeerNodeStatus(int pnStatus, PeerNode
peerNode) {
Integer peerNodeStatus = new Integer(pnStatus);
@@ -2999,4 +3002,70 @@
public int getNetworkSizeEstimate(int numberOfMinutes) {
return lm.getNetworkSizeEstimate( numberOfMinutes );
}
+
+ /**
+ * Add a PeerNode routing backoff reason to the map
+ */
+ public synchronized void addPeerNodeRoutingBackoffReason(String
peerNodeRoutingBackoffReason, PeerNode peerNode) {
+ HashSet reasonSet = null;
+
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
+ reasonSet = (HashSet)
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
+ if(reasonSet.contains(peerNode)) {
+ Logger.error(this, "addPeerNodeRoutingBackoffReason():
identity '"+peerNode.getIdentityString()+"' already in
peerNodeRoutingBackoffReasons as "+peerNode+" with status code
"+peerNodeRoutingBackoffReason);
+ return;
+ }
+
peerNodeRoutingBackoffReasons.remove(peerNodeRoutingBackoffReason);
+ } else {
+ reasonSet = new HashSet();
+ }
+ Logger.minor(this, "addPeerNodeRoutingBackoffReason(): adding PeerNode
for '"+peerNode.getIdentityString()+"' with status code
"+peerNodeRoutingBackoffReason);
+ reasonSet.add(peerNode);
+ peerNodeRoutingBackoffReasons.put(peerNodeRoutingBackoffReason,
reasonSet);
+ }
+
+ /**
+ * What are the currently tracked PeerNode routing backoff reasons?
+ */
+ public String [] getPeerNodeRoutingBackoffReasons() {
+ String [] reasonStrings = (String [])
peerNodeRoutingBackoffReasons.keySet().toArray(new
String[peerNodeRoutingBackoffReasons.size()]);
+ Arrays.sort(reasonStrings);
+ return reasonStrings;
+ }
+
+ /**
+ * How many PeerNodes have a particular routing backoff reason?
+ */
+ public int getPeerNodeRoutingBackoffReasonSize(String
peerNodeRoutingBackoffReason) {
+ HashSet reasonSet = null;
+
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
+ reasonSet = (HashSet)
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
+ } else {
+ reasonSet = new HashSet();
+ }
+ return reasonSet.size();
+ }
+
+ /**
+ * Remove a PeerNode routing backoff reason from the map
+ */
+ public synchronized void removePeerNodeRoutingBackoffReason(String
peerNodeRoutingBackoffReason, PeerNode peerNode) {
+ HashSet reasonSet = null;
+
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
+ reasonSet = (HashSet)
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
+ if(!reasonSet.contains(peerNode)) {
+ Logger.error(this,
"removePeerNodeRoutingBackoffReason(): identity
'"+peerNode.getIdentityString()+"' not in peerNodeRoutingBackoffReasons with
status code "+peerNodeRoutingBackoffReason);
+ return;
+ }
+
peerNodeRoutingBackoffReasons.remove(peerNodeRoutingBackoffReason);
+ } else {
+ reasonSet = new HashSet();
+ }
+ Logger.minor(this, "removePeerNodeRoutingBackoffReason(): removing
PeerNode for '"+peerNode.getIdentityString()+"' with status code
"+peerNodeRoutingBackoffReason);
+ if(reasonSet.contains(peerNode)) {
+ reasonSet.remove(peerNode);
+ }
+ if(reasonSet.size() > 0) {
+ peerNodeRoutingBackoffReasons.put(peerNodeRoutingBackoffReason,
reasonSet);
+ }
+ }
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-06-09 21:10:34 UTC
(rev 9109)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-06-09 21:29:39 UTC
(rev 9110)
@@ -1556,7 +1556,9 @@
/** Current nominal routing backoff length */
int routingBackoffLength = INITIAL_ROUTING_BACKOFF_LENGTH;
/** Last backoff reason */
- String lastBackoffReason = null;
+ String lastRoutingBackoffReason = null;
+ /** Previous backoff reason (used by setPeerNodeStatus)*/
+ String previousRoutingBackoffReason = null;
/**
* Got a local RejectedOverload.
@@ -1696,11 +1698,11 @@
}
public String getLastBackoffReason() {
- return lastBackoffReason;
+ return lastRoutingBackoffReason;
}
public void setLastBackoffReason(String s) {
- this.lastBackoffReason = s;
+ this.lastRoutingBackoffReason = s;
}
public boolean hasCompletedHandshake() {
@@ -1830,6 +1832,16 @@
peerNodeStatus = Node.PEER_NODE_STATUS_CONNECTED;
if(now < routingBackedOffUntil) {
peerNodeStatus =
Node.PEER_NODE_STATUS_ROUTING_BACKED_OFF;
+
if(!lastRoutingBackoffReason.equals(previousRoutingBackoffReason)) {
+
node.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReason, this);
+
node.addPeerNodeRoutingBackoffReason(lastRoutingBackoffReason, this);
+ previousRoutingBackoffReason =
lastRoutingBackoffReason;
+ }
+ } else {
+ if(previousRoutingBackoffReason != null) {
+
node.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReason, this);
+ previousRoutingBackoffReason = null;
+ }
}
} else if(completedHandshake &&
verifiedIncompatibleNewerVersion) {
peerNodeStatus = Node.PEER_NODE_STATUS_TOO_NEW;
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-06-09 21:10:34 UTC (rev
9109)
+++ trunk/freenet/src/freenet/node/Version.java 2006-06-09 21:29:39 UTC (rev
9110)
@@ -18,7 +18,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 793;
+ private static final int buildNumber = 794;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 765;