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



Reply via email to