Author: zothar
Date: 2006-06-03 00:16:25 +0000 (Sat, 03 Jun 2006)
New Revision: 9014
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
trunk/freenet/src/freenet/clients/http/staticfiles/themes/sky/theme.css
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/Version.java
Log:
Added initial support for PEER_NODE_STATUS_NEVER_CONNECTED and generalized
PeerNodeStatus set storage in Node in the process (will migrate the other
statuses later). Also, don't try to parse a metadata.detected.udp if we don't
have one.
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-06-03 00:04:42 UTC (rev 9013)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-06-03 00:16:25 UTC (rev 9014)
@@ -84,6 +84,7 @@
int numberOfBackedOff = 0;
int numberOfTooNew = 0;
int numberOfTooOld = 0;
+ int numberOfNeverConnected = 0;
int numberOfDisconnected = 0;
for (int peerIndex = 0, peerCount = peerNodes.length; peerIndex
< peerCount; peerIndex++) {
int peerStatus =
peerNodes[peerIndex].getPeerNodeStatus();
@@ -97,6 +98,8 @@
numberOfTooOld++;
} else if (peerStatus ==
Node.PEER_NODE_STATUS_DISCONNECTED) {
numberOfDisconnected++;
+ } else if (peerStatus ==
Node.PEER_NODE_STATUS_NEVER_CONNECTED) {
+ numberOfNeverConnected++;
}
}
@@ -131,6 +134,9 @@
if (numberOfDisconnected > 0) {
buf.append("<span
class=\"peer_disconnected\">Disconnected: " + numberOfDisconnected +
"</span><br/>");
}
+ if (numberOfNeverConnected > 0) {
+ buf.append("<span class=\"peer_never_connected\">Never
Connected: " + numberOfNeverConnected + "</span><br/>");
+ }
buf.append("</div>");
buf.append("</div>\n");
@@ -168,13 +174,15 @@
// Don't list the backoff as zero before it's
actually zero
if(backoff > 0 && backoff < 1000 )
backoff = 1000;
- long idle = pn.lastReceivedPacketTime();
// Elements must be HTML encoded.
Object[] row = new Object[10]; // where [0] is
the pn object and 9 is the node name only for sorting!
rows[i] = row;
Object status = new
Integer(pn.getPeerNodeStatus());
+ long idle = pn.lastReceivedPacketTime();
+ if(((Integer) status).intValue() ==
Node.PEER_NODE_STATUS_NEVER_CONNECTED)
+ idle = pn.getPeerAddedTime();
String lastBackoffReasonOutputString = "/";
String backoffReason =
pn.getLastBackoffReason();
if( backoffReason != null ) {
@@ -204,7 +212,7 @@
row[5] =
VersionPrefixString+HTMLEncoder.encode(pn.getVersion())+VersionSuffixString;
row[6] = new
Double(pn.getLocation().getValue());
row[7] = backoff/1000 + "/" +
pn.getRoutingBackoffLength()/1000+lastBackoffReasonOutputString;
- row[8] = idleToString(now, idle,
pn.getPeerNodeStatus());
+ row[8] = idleToString(now, idle, ((Integer)
status).intValue());
row[9] = HTMLEncoder.encode(pn.getName());
}
@@ -230,6 +238,9 @@
else if(x ==
Node.PEER_NODE_STATUS_DISCONNECTED) {
row[2] = "<span
class=\"peer_disconnected\">DISCONNECTED</span>";
}
+ else if(x ==
Node.PEER_NODE_STATUS_NEVER_CONNECTED) {
+ row[2] = "<span
class=\"peer_never_connected\">NEVER CONNECTED</span>";
+ }
}
// Turn array into HTML
Modified:
trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
===================================================================
--- trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
2006-06-03 00:04:42 UTC (rev 9013)
+++ trunk/freenet/src/freenet/clients/http/staticfiles/themes/clean/theme.css
2006-06-03 00:16:25 UTC (rev 9014)
@@ -302,6 +302,10 @@
color: #d0d0d0;
}
+span.peer_never_connected {
+ color: #a0a0a0;
+}
+
span.peer_version_problem {
color: #d07070;
}
Modified:
trunk/freenet/src/freenet/clients/http/staticfiles/themes/sky/theme.css
===================================================================
--- trunk/freenet/src/freenet/clients/http/staticfiles/themes/sky/theme.css
2006-06-03 00:04:42 UTC (rev 9013)
+++ trunk/freenet/src/freenet/clients/http/staticfiles/themes/sky/theme.css
2006-06-03 00:16:25 UTC (rev 9014)
@@ -309,6 +309,10 @@
color: #d0d0d0;
}
+table.darknet_connections span.peer_never_connected {
+ color: #a0a0a0;
+}
+
table.darknet_connections span.peer_version_problem {
color: #d07070;
}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-06-03 00:04:42 UTC (rev
9013)
+++ trunk/freenet/src/freenet/node/Node.java 2006-06-03 00:16:25 UTC (rev
9014)
@@ -486,6 +486,8 @@
private final HashMap statusTooOldPeerNodes;
/** PeerNodes in DISCONNECTED status, by identity */
private final HashMap statusDisconnectedPeerNodes;
+ /** PeerNode statuses, by status */
+ private final HashMap peerNodeStatuses;
private final HashSet runningUIDs;
@@ -540,6 +542,7 @@
public static final int PEER_NODE_STATUS_TOO_NEW = 3;
public static final int PEER_NODE_STATUS_TOO_OLD = 4;
public static final int PEER_NODE_STATUS_DISCONNECTED = 5;
+ public static final int PEER_NODE_STATUS_NEVER_CONNECTED = 6;
public static final int N2N_TEXT_MESSAGE_TYPE_USERALERT = 1;
public final long bootID;
@@ -911,6 +914,7 @@
statusTooNewPeerNodes = new HashMap();
statusTooOldPeerNodes = new HashMap();
statusDisconnectedPeerNodes = new HashMap();
+ peerNodeStatuses = new HashMap();
runningUIDs = new HashSet();
dnsr = new DNSRequester(this);
ps = new PacketSender(this);
@@ -3013,6 +3017,64 @@
}
/**
+ * Add a PeerNode status to the map
+ */
+ public synchronized void addPeerNodeStatus(int pnStatus, PeerNode
peerNode) {
+ Integer peerNodeStatus = new Integer(pnStatus);
+ HashSet statusSet = null;
+ if(peerNodeStatuses.containsKey(peerNodeStatus)) {
+ statusSet = (HashSet) peerNodeStatuses.get(peerNodeStatus);
+ if(statusSet.contains(peerNode)) {
+ Logger.error(this, "addPeerNodeStatus(): identity
'"+peerNode.getIdentityString()+"' already in peerNodeStatuses as "+peerNode+"
with status code "+peerNodeStatus);
+ return;
+ }
+ peerNodeStatuses.remove(peerNodeStatus);
+ } else {
+ statusSet = new HashSet();
+ }
+ Logger.minor(this, "addPeerNodeStatus(): adding PeerNode for
'"+peerNode.getIdentityString()+"' with status code "+peerNodeStatus);
+ statusSet.add(peerNode);
+ peerNodeStatuses.put(peerNodeStatus, statusSet);
+ }
+
+ /**
+ * How many PeerNodes have a particular status?
+ */
+ public int getPeerNodeStatusSize(int pnStatus) {
+ Integer peerNodeStatus = new Integer(pnStatus);
+ HashSet statusSet = null;
+ if(peerNodeStatuses.containsKey(peerNodeStatus)) {
+ statusSet = (HashSet) peerNodeStatuses.get(peerNodeStatus);
+ } else {
+ statusSet = new HashSet();
+ }
+ return statusSet.size();
+ }
+
+ /**
+ * Remove a disconnected node from the map
+ */
+ public synchronized void removePeerNodeStatus(int pnStatus, PeerNode
peerNode) {
+ Integer peerNodeStatus = new Integer(pnStatus);
+ HashSet statusSet = null;
+ if(peerNodeStatuses.containsKey(peerNodeStatus)) {
+ statusSet = (HashSet) peerNodeStatuses.get(peerNodeStatus);
+ if(!statusSet.contains(peerNode)) {
+ Logger.error(this, "removePeerNodeStatus(): identity
'"+peerNode.getIdentityString()+"' not in peerNodeStatuses with status code
"+peerNodeStatus);
+ return;
+ }
+ peerNodeStatuses.remove(peerNodeStatus);
+ } else {
+ statusSet = new HashSet();
+ }
+ Logger.minor(this, "removePeerNodeStatus(): removing PeerNode for
'"+peerNode.getIdentityString()+"' with status code "+peerNodeStatus);
+ if(statusSet.contains(peerNode)) {
+ statusSet.remove(peerNode);
+ }
+ peerNodeStatuses.put(peerNodeStatus, statusSet);
+ }
+
+ /**
* Log the current PeerNode status summary if the timer has expired
*/
public void maybeLogPeerNodeStatusSummary(long now) {
@@ -3024,7 +3086,8 @@
int numberOfTooNew = getNumStatusTooNewPeerNodes();
int numberOfTooOld = getNumStatusTooOldPeerNodes();
int numberOfDisconnected = getNumStatusDisconnectedPeerNodes();
- Logger.minor(this, "Connected: "+numberOfConnected+" Routing Backed
Off: "+numberOfRoutingBackedOff+" Too New: "+numberOfTooNew+" Too Old:
"+numberOfTooOld+" Disconnected: "+numberOfDisconnected);
+ int numberOfNeverConnected =
getPeerNodeStatusSize(PEER_NODE_STATUS_NEVER_CONNECTED);
+ Logger.normal(this, "Connected: "+numberOfConnected+" Routing Backed
Off: "+numberOfRoutingBackedOff+" Too New: "+numberOfTooNew+" Too Old:
"+numberOfTooOld+" Disconnected: "+numberOfDisconnected+" Never Connected:
"+numberOfNeverConnected);
nextPeerNodeStatusLogTime = now + peerNodeStatusLogInterval;
}
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-06-03 00:04:42 UTC
(rev 9013)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-06-03 00:16:25 UTC
(rev 9014)
@@ -224,6 +224,12 @@
/** The last time we attempted to update handshakeIPs */
private long lastAttemptedHandshakeIPUpdateTime = 0;
+
+ /** True if we have never connected to this peer since it was added to
this node */
+ private boolean neverConnected = false;
+
+ /** When this peer was added to this node */
+ private long peerAddedTime = 1;
/**
* Create a PeerNode from a SimpleFieldSet containing a
@@ -276,6 +282,7 @@
// PeerNode starts life as disconnected
node.addStatusDisconnectedPeerNode(getIdentityString(), this);
+ node.addPeerNodeStatus(Node.PEER_NODE_STATUS_DISCONNECTED, this);
nominalPeer=new Vector();
nominalPeer.removeAllElements();
@@ -382,6 +389,7 @@
// It belongs to this node, not to the node being described.
// Therefore, if we are parsing a remotely supplied ref, ignore it.
+ long now = System.currentTimeMillis();
if(fromLocal) {
SimpleFieldSet metadata = fs.subset("metadata");
@@ -391,7 +399,10 @@
// Don't be tolerant of nonexistant domains; this
should be an IP address.
Peer p;
try {
- p = new Peer(metadata.get("detected.udp"),
false);
+ String detectedUDPString =
metadata.get("detected.udp");
+ p = null;
+ if(detectedUDPString != null)
+ p = new Peer(detectedUDPString, false);
} catch (UnknownHostException e) {
p = null;
Logger.error(this, "detected.udp =
"+metadata.get("detected.udp")+" - "+e, e);
@@ -406,11 +417,29 @@
long tempTimeLastReceivedPacket =
Long.parseLong(tempTimeLastReceivedPacketString);
timeLastReceivedPacket = tempTimeLastReceivedPacket;
}
+ String tempPeerAddedTimeString = metadata.get("peerAddedTime");
+ if(tempPeerAddedTimeString != null) {
+ long tempPeerAddedTime = Long.parseLong(tempPeerAddedTimeString);
+ peerAddedTime = tempPeerAddedTime;
+ } else {
+ peerAddedTime = 1;
+ }
+ String tempNeverConnectedString = metadata.get("neverConnected");
+ if(tempNeverConnectedString != null &&
tempNeverConnectedString.equals("true")) {
+ neverConnected = true;
+ } else {
+ neverConnected = false;
+ }
}
-
+ } else {
+ neverConnected = true;
+ peerAddedTime = now;
}
- // populate handshakeIPs so handshakes can start ASAP
- maybeUpdateHandshakeIPs(true);
+ // populate handshakeIPs so handshakes can start ASAP
+ maybeUpdateHandshakeIPs(true);
+
+ // status may have changed from PEER_NODE_STATUS_DISCONNECTED to
PEER_NODE_STATUS_NEVER_CONNECTED
+ setPeerNodeStatus(now);
}
private boolean parseARK(SimpleFieldSet fs) {
@@ -652,6 +681,13 @@
}
/**
+ * @return The time this PeerNode was added to the node
+ */
+ public long getPeerAddedTime() {
+ return peerAddedTime;
+ }
+
+ /**
* Disconnected e.g. due to not receiving a packet for ages.
*/
public void disconnected() {
@@ -1092,6 +1128,7 @@
if(previousTracker != null)
previousTracker.deprecated();
isConnected = true;
+ neverConnected = false;
setPeerNodeStatus(now);
ctx = null;
}
@@ -1156,6 +1193,7 @@
currentTracker = unverifiedTracker;
unverifiedTracker = null;
isConnected = true;
+ neverConnected = false;
setPeerNodeStatus(now);
ctx = null;
maybeSendInitialMessages();
@@ -1399,6 +1437,10 @@
fs.put("detected.udp", detectedPeer.toString());
if(timeLastReceivedPacket > 0)
fs.put("timeLastReceivedPacket",
Long.toString(timeLastReceivedPacket));
+ if(peerAddedTime > 0)
+ fs.put("peerAddedTime", Long.toString(peerAddedTime));
+ if(neverConnected)
+ fs.put("neverConnected", "true");
return fs;
}
@@ -1750,6 +1792,8 @@
peerNodeStatus = Node.PEER_NODE_STATUS_TOO_NEW;
} else if(completedHandshake &&
verifiedIncompatibleOlderVersion) {
peerNodeStatus = Node.PEER_NODE_STATUS_TOO_OLD;
+ } else if(neverConnected) {
+ peerNodeStatus = Node.PEER_NODE_STATUS_NEVER_CONNECTED;
} else {
peerNodeStatus = Node.PEER_NODE_STATUS_DISCONNECTED;
}
@@ -1774,6 +1818,8 @@
node.addStatusTooOldPeerNode(getIdentityString(), this);
else if(peerNodeStatus == Node.PEER_NODE_STATUS_DISCONNECTED)
node.addStatusDisconnectedPeerNode(getIdentityString(),
this);
+ node.removePeerNodeStatus( oldPeerNodeStatus, this );
+ node.addPeerNodeStatus( peerNodeStatus, this );
}
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-06-03 00:04:42 UTC (rev
9013)
+++ trunk/freenet/src/freenet/node/Version.java 2006-06-03 00:16:25 UTC (rev
9014)
@@ -44,7 +44,7 @@
public static final int lastGoodStableBuild = 1;
/** Revision number of Version.java as read from CVS */
- public static final String cvsRevision = "@custom@";
+ public static final String cvsRevision = "9013M";
private static boolean logDEBUG =
Logger.shouldLog(Logger.DEBUG,Version.class);