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 {