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


Reply via email to