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() {