Author: toad
Date: 2007-09-14 20:06:24 +0000 (Fri, 14 Sep 2007)
New Revision: 15182

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/OpennetManager.java
   trunk/freenet/src/freenet/node/PeerManager.java
Log:
Send an explicit disconnect message whenever we decide to disconnect a peer

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-09-14 19:47:37 UTC (rev 
15181)
+++ trunk/freenet/src/freenet/node/Node.java    2007-09-14 20:06:24 UTC (rev 
15182)
@@ -2303,7 +2303,7 @@
        }

        public void removePeerConnection(PeerNode pn) {
-               peers.disconnect(pn);
+               peers.disconnect(pn, true, false);
        }

        public void onConnectedPeer() {
@@ -2329,16 +2329,22 @@
        /**
         * Handle a received node to node message
         */
-       public void receivedNodeToNodeMessage(Message m, boolean parting) {
+       public void receivedNodeToNodeMessage(Message m) {
          PeerNode src = (PeerNode) m.getSource();
+         int type = ((Integer) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_TYPE)).intValue();
+         ShortBuffer messageData = (ShortBuffer) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_DATA);
+         receivedNodeToNodeMessage(src, type, messageData, false);
+       }
+       
+       public void receivedNodeToNodeMessage(PeerNode src, int type, 
ShortBuffer messageData, boolean partingMessage) {
          if(!(src instanceof DarknetPeerNode)) {
-               Logger.error(this, "Got N2NTM from opennet node ?!?!?!: "+m+" 
from "+src);
+               Logger.error(this, "Got N2NTM from opennet node ?!?!?!: from 
"+src);
                return;
          }
-         DarknetPeerNode source = (DarknetPeerNode)m.getSource();
-         int type = ((Integer) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_TYPE)).intValue();
+         DarknetPeerNode source = (DarknetPeerNode)src;
+         
          if(type == Node.N2N_MESSAGE_TYPE_FPROXY) {
-               ShortBuffer messageData = (ShortBuffer) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_DATA);
+               
                Logger.normal(this, "Received N2NM from 
'"+source.getPeer()+"'");
                SimpleFieldSet fs = null;
                try {

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2007-09-14 19:47:37 UTC 
(rev 15181)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2007-09-14 20:06:24 UTC 
(rev 15182)
@@ -91,7 +91,7 @@
                        handleDisconnect(m, source);
                        return true;
                } else if(spec == DMT.nodeToNodeMessage) {
-                       node.receivedNodeToNodeMessage(m, false);
+                       node.receivedNodeToNodeMessage(m);
                        return true;
                } else if(spec == DMT.UOMAnnounce) {
                        return node.nodeUpdater.uom.handleAnnounce(m, source);
@@ -153,14 +153,17 @@
                // Otherwise just dump all current connection state and keep 
trying to connect.
                boolean remove = m.getBoolean(DMT.REMOVE);
                if(remove)
-                       node.peers.disconnect(source);
+                       node.peers.disconnect(source, false, false);
                // If true, purge all references to this node. Otherwise, we 
can keep the node
                // around in secondary tables etc in order to more easily 
reconnect later. 
                // (Mostly used on opennet)
                // Not used at the moment - FIXME
                boolean purge = m.getBoolean(DMT.PURGE);
                // Process parting message
-               node.receivedNodeToNodeMessage(m, true);
+               int type = ((Integer) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_TYPE)).intValue();
+               ShortBuffer messageData = (ShortBuffer) 
m.getObject(DMT.NODE_TO_NODE_MESSAGE_DATA);
+               if(messageData.getLength() == 0) return;
+               node.receivedNodeToNodeMessage(source, type, messageData, true);
        }

        private boolean handleTime(Message m, PeerNode source) {

Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-14 19:47:37 UTC 
(rev 15181)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-09-14 20:06:24 UTC 
(rev 15182)
@@ -295,7 +295,7 @@
                for(int i=0;i<dropList.size();i++) {
                        OpennetPeerNode pn = (OpennetPeerNode) dropList.get(i);
                        if(logMINOR) Logger.minor(this, "Dropping LRU opennet 
peer: "+pn);
-                       node.peers.disconnect(pn);
+                       node.peers.disconnect(pn, true, true);
                }
                return ret;
        }
@@ -306,7 +306,7 @@
                        toDrop = peerToDrop(false);
                        if(toDrop == null) return;
                        peersLRU.remove(toDrop);
-                       node.peers.disconnect(toDrop);
+                       node.peers.disconnect(toDrop, true, true);
                }
        }

@@ -357,7 +357,7 @@
                        }
                }
                if(!wantPeer(pn, false)) // Start at top as it just succeeded
-                       node.peers.disconnect(pn);
+                       node.peers.disconnect(pn, true, false);
        }

        public synchronized void onRemove(OpennetPeerNode pn) {

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2007-09-14 19:47:37 UTC 
(rev 15181)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2007-09-14 20:06:24 UTC 
(rev 15182)
@@ -22,6 +22,8 @@
 import java.util.Vector;
 import java.util.ArrayList;

+import freenet.io.comm.AsyncMessageCallback;
+import freenet.io.comm.DMT;
 import freenet.io.comm.FreenetInetAddress;
 import freenet.io.comm.Message;
 import freenet.io.comm.NotConnectedException;
@@ -30,6 +32,7 @@
 import freenet.io.comm.ReferenceSignatureVerificationException;
 import freenet.node.useralerts.PeerManagerUserAlert;
 import freenet.support.Logger;
+import freenet.support.ShortBuffer;
 import freenet.support.SimpleFieldSet;

 /**
@@ -222,6 +225,13 @@
         return true;
     }

+       synchronized boolean havePeer(PeerNode pn) {
+               for(int i=0;i<myPeers.length;i++) {
+                       if(myPeers[i] == pn) return true;
+               }
+               return false;
+       }
+       
     private boolean removePeer(PeerNode pn) {
        synchronized(this) {
        boolean isInPeers = false;
@@ -367,9 +377,51 @@
     /**
      * Disconnect from a specified node
      */
-    public void disconnect(PeerNode pn){
-       if(removePeer(pn))
-               writePeers();
+    public void disconnect(final PeerNode pn, boolean sendDisconnectMessage, 
final boolean waitForAck) {
+       synchronized(this) {
+               if(!havePeer(pn)) return;
+       }
+       if(sendDisconnectMessage) {
+               Message msg = DMT.createFNPDisconnect(true, false, -1, new 
ShortBuffer(new byte[0]));
+                       try {
+                               pn.sendAsync(msg, new AsyncMessageCallback() {
+                                       boolean done = false;
+                                       public void acknowledged() {
+                                               done();
+                                       }
+                                       public void disconnected() {
+                                               done();
+                                       }
+                                       public void fatalError() {
+                                               done();
+                                       }
+                                       public void sent() {
+                                               if(!waitForAck) done();
+                                       }
+                                       void done() {
+                                               synchronized(this) {
+                                                       if(done) return;
+                                                       done = true;
+                                               }
+                                       if(removePeer(pn))
+                                               writePeers();
+                                       }
+                               }, 0, null);
+                       } catch (NotConnectedException e) {
+                       if(removePeer(pn))
+                               writePeers();
+                       return;
+                       }
+                       node.getTicker().queueTimedJob(new Runnable() {
+                               public void run() {
+                               if(removePeer(pn))
+                                       writePeers();
+                               }
+                       }, 60*1000);
+       } else {
+               if(removePeer(pn))
+                       writePeers();
+       }
     }

     class LocationUIDPair implements Comparable {


Reply via email to