[freenet-cvs] r16239 - in trunk/freenet/src/freenet: io/comm node

toad at freenetproject.org toad at freenetproject.org
Mon Dec 3 21:11:06 UTC 2007


Author: toad
Date: 2007-12-03 21:11:05 +0000 (Mon, 03 Dec 2007)
New Revision: 16239

Modified:
   trunk/freenet/src/freenet/io/comm/PeerContext.java
   trunk/freenet/src/freenet/node/DarknetPeerNode.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/OpennetPeerNode.java
   trunk/freenet/src/freenet/node/PacketSender.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Dump the message queue on disconnect in various cases

Modified: trunk/freenet/src/freenet/io/comm/PeerContext.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/PeerContext.java	2007-12-03 20:49:57 UTC (rev 16238)
+++ trunk/freenet/src/freenet/io/comm/PeerContext.java	2007-12-03 21:11:05 UTC (rev 16239)
@@ -16,8 +16,9 @@
     // Largely opaque interface for now
     Peer getPeer();
 
-    /** Force the peer to disconnect */
-	void forceDisconnect();
+    /** Force the peer to disconnect.
+     * @param purge If true, the message queue and trackers will be dumped. */
+	void forceDisconnect(boolean dump);
 
 	/** Is the peer connected? Have we established the session link? */
 	boolean isConnected();

Modified: trunk/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/DarknetPeerNode.java	2007-12-03 20:49:57 UTC (rev 16238)
+++ trunk/freenet/src/freenet/node/DarknetPeerNode.java	2007-12-03 21:11:05 UTC (rev 16239)
@@ -247,7 +247,7 @@
 			isDisabled = true;
 		}
 		if(isConnected()) {
-			forceDisconnect();
+			forceDisconnect(true);
 		}
 		stopARKFetcher();
 		setPeerNodeStatus(System.currentTimeMillis());

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java	2007-12-03 20:49:57 UTC (rev 16238)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java	2007-12-03 21:11:05 UTC (rev 16239)
@@ -148,7 +148,7 @@
 	}
 
 	private void handleDisconnect(Message m, PeerNode source) {
-		source.disconnected();
+		source.disconnected(true, true);
 		// If true, remove from active routing table, likely to be down for a while.
 		// Otherwise just dump all current connection state and keep trying to connect.
 		boolean remove = m.getBoolean(DMT.REMOVE);

Modified: trunk/freenet/src/freenet/node/OpennetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetPeerNode.java	2007-12-03 20:49:57 UTC (rev 16238)
+++ trunk/freenet/src/freenet/node/OpennetPeerNode.java	2007-12-03 21:11:05 UTC (rev 16239)
@@ -70,8 +70,8 @@
     	return timeLastSuccess;
     }
     
-    public boolean disconnected() {
-    	if(super.disconnected()) {
+    public boolean disconnected(boolean dumpMessageQueue, boolean dumpTrackers) {
+    	if(super.disconnected(dumpMessageQueue, dumpTrackers)) {
     		synchronized(this) {
     			timePrevDisconnect = timeLastDisconnect;
     			timeLastDisconnect = System.currentTimeMillis();

Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java	2007-12-03 20:49:57 UTC (rev 16238)
+++ trunk/freenet/src/freenet/node/PacketSender.java	2007-12-03 21:11:05 UTC (rev 16239)
@@ -198,7 +198,7 @@
 				// Is the node dead?
 				if(now - pn.lastReceivedPacketTime() > pn.maxTimeBetweenReceivedPackets()) {
 					Logger.normal(this, "Disconnecting from " + pn + " - haven't received packets recently");
-					pn.disconnected();
+					pn.disconnected(false, false /* hopefully will recover, transient network glitch */);
 					continue;
 				} else if(pn.isRoutable() && pn.noLongerRoutable()) {
 					// we don't disconnect but we mark it incompatible
@@ -254,7 +254,8 @@
 							break;
 						} catch(PacketSequenceException e) {
 							Logger.error(this, "Caught " + e + " - disconnecting", e);
-							pn.forceDisconnect();
+							// PSE is fairly drastic, something is broken between us, but maybe we can resync
+							pn.forceDisconnect(false); 
 						} catch(WouldBlockException e) {
 							Logger.error(this, "Impossible: " + e, e);
 						}
@@ -296,7 +297,7 @@
 						pn.sendAnyUrgentNotifications();
 					} catch(PacketSequenceException e) {
 						Logger.error(this, "Caught " + e + " - while sending urgent notifications : disconnecting", e);
-						pn.forceDisconnect();
+						pn.forceDisconnect(false);
 					}
 
 				// Need to send a keepalive packet?

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java	2007-12-03 20:49:57 UTC (rev 16238)
+++ trunk/freenet/src/freenet/node/PeerNode.java	2007-12-03 21:11:05 UTC (rev 16239)
@@ -928,7 +928,7 @@
 			String time = TimeUtil.formatTime(FNPPacketMangler.MAX_SESSION_KEY_REKEYING_DELAY);
 			System.err.println("The peer (" + this + ") has been asked to rekey " + time + " ago... force disconnect.");
 			Logger.error(this, "The peer (" + this + ") has been asked to rekey " + time + " ago... force disconnect.");
-			forceDisconnect();
+			forceDisconnect(false);
 		} else if (shouldReturn || hasLiveHandshake(now)) {
 			return;
 		} else if(shouldRekey) {
@@ -957,9 +957,11 @@
 
 	/**
 	* Disconnected e.g. due to not receiving a packet for ages.
+	* @param longTime If true, we expect the node to be down for some time,
+	* so we need to purge queued messages etc.
 	* @return True if the node was connected, false if it was not.
 	*/
-	public boolean disconnected() {
+	public boolean disconnected(boolean dumpMessageQueue, boolean dumpTrackers) {
 		long now = System.currentTimeMillis();
 		Logger.normal(this, "Disconnected " + this);
 		node.usm.onDisconnect(this);
@@ -978,7 +980,15 @@
 				previousTracker.disconnected();
 			if(unverifiedTracker != null)
 				unverifiedTracker.disconnected();
-			// DO NOT clear trackers, so can still receive.
+			if(dumpTrackers) {
+				currentTracker = null;
+				previousTracker = null;
+				unverifiedTracker = null;
+			}
+			if(dumpMessageQueue) {
+				messagesToSendNow.clear();
+			}
+			// Else DO NOT clear trackers, because hopefully it's a temporary connectivity glitch.
 			sendHandshakeTime = now;
 		}
 		node.lm.lostOrRestartedNode(this);
@@ -987,12 +997,12 @@
 	}
 	private boolean forceDisconnectCalled = false;
 
-	public void forceDisconnect() {
+	public void forceDisconnect(boolean purge) {
 		Logger.error(this, "Forcing disconnect on " + this, new Exception("debug"));
 		synchronized(this) {
 			forceDisconnectCalled = true;
 		}
-		disconnected();
+		disconnected(purge, true); // always dump trackers, maybe dump messages
 	}
 
 	boolean forceDisconnectCalled() {
@@ -2871,7 +2881,7 @@
 
 	/** Called when the peer is removed from the PeerManager */
 	public void onRemove() {
-		disconnected();
+		disconnected(true, true);
 	}
 
 	public synchronized boolean isDisconnecting() {




More information about the cvs mailing list