Author: toad
Date: 2007-09-26 12:29:52 +0000 (Wed, 26 Sep 2007)
New Revision: 15321

Modified:
   trunk/freenet/src/freenet/node/OpennetManager.java
   trunk/freenet/src/freenet/node/OpennetPeerNode.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
PeerNode.disconnected() returns a boolean to indicate whether it was already 
connected.
If it wasn't already connected, then in OpennetPeerNode DO NOT UPDATE THE TIME 
LAST DISCONNECTED.
Resulting fix: We were ignoring the don't-drop-till-disconnected-for-5-minutes 
anti-churn measure, fix it!
Always call disconnected() when a peer node is removed from the master peers 
list, even if it's a darknet peer. Quicker cleanup, clearer code.

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-26 12:11:50 UTC 
(rev 15320)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-26 12:29:52 UTC 
(rev 15321)
@@ -402,7 +402,6 @@
                        while (oldPeers.size() > MAX_OLD_PEERS)
                                oldPeers.pop();
                }
-               pn.disconnected();
        }

        synchronized PeerNode[] getOldPeers() {

Modified: trunk/freenet/src/freenet/node/OpennetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetPeerNode.java 2007-09-26 12:11:50 UTC 
(rev 15320)
+++ trunk/freenet/src/freenet/node/OpennetPeerNode.java 2007-09-26 12:29:52 UTC 
(rev 15321)
@@ -57,6 +57,7 @@

        public void onRemove() {
                opennet.onRemove(this);
+               super.onRemove();
        }

     public synchronized SimpleFieldSet exportMetadataFieldSet() {
@@ -69,12 +70,14 @@
        return timeLastSuccess;
     }

-    public void disconnected() {
-       synchronized(this) {
-               timePrevDisconnect = timeLastDisconnect;
-                       timeLastDisconnect = System.currentTimeMillis();
-       }
-       super.disconnected();
+    public boolean disconnected() {
+       if(super.disconnected()) {
+               synchronized(this) {
+                       timePrevDisconnect = timeLastDisconnect;
+                       timeLastDisconnect = System.currentTimeMillis();
+               }
+               return true;
+       } else return false;
     }

     public synchronized long timeLastDisconnect() {

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-09-26 12:11:50 UTC 
(rev 15320)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-09-26 12:29:52 UTC 
(rev 15321)
@@ -935,13 +935,16 @@

     /**
      * Disconnected e.g. due to not receiving a packet for ages.
+     * @return True if the node was connected, false if it was not.
      */
-    public void disconnected() {
+    public boolean disconnected() {
         long now = System.currentTimeMillis();
         Logger.normal(this, "Disconnected "+this);
         node.usm.onDisconnect(this);
         node.peers.disconnected(this);
+        boolean ret;
         synchronized(this) {
+               ret = isConnected;
                // Force renegotiation.
             isConnected = false;
             isRoutable = false;
@@ -957,6 +960,7 @@
         }
         node.lm.lostOrRestartedNode(this);
         setPeerNodeStatus(now);
+        return ret;
     }

     public void forceDisconnect() {
@@ -2726,9 +2730,6 @@
        /** Called when a request or insert succeeds. Used by opennet. */
        public abstract void onSuccess(boolean insert, boolean ssk);

-       /** Called when the peer is removed from the PeerManager */
-       public abstract void onRemove();
-
        /** Called when a delayed disconnect is occurring. Tell the node that 
it is being disconnected, but
         * that the process may take a while. */
        public void notifyDisconnecting() {
@@ -2746,4 +2747,9 @@
                }
                setPeerNodeStatus(System.currentTimeMillis());
        }
+       
+       /** Called when the peer is removed from the PeerManager */
+       public void onRemove() {
+               disconnected();
+       }
 }


Reply via email to