Author: toad
Date: 2008-03-24 15:58:49 +0000 (Mon, 24 Mar 2008)
New Revision: 18733

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/KeyTracker.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
If we continue to send ack requests and resend requests to the previousTracker 
and for more than 60 seconds there is no response, assume it is dead and 
completelyDeprecated() to the new one.
This should fix the main cause of PacketThrottle hanging for a connection on my 
node.
Most likely the original loss of the previousTracker is caused by a 
forceDisconnect() on late rekeying, itself probably caused by temporary CPU 
overload.

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-03-24 
02:17:08 UTC (rev 18732)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-03-24 
15:58:49 UTC (rev 18733)
@@ -1952,10 +1952,6 @@

                tracker.pn.receivedPacket(false); // Must keep the connection 
open, even if it's an ack packet only and on an incompatible connection - we 
may want to do a UOM transfer e.g.

-               if(seqNumber == -1) {
-                       if(logMINOR) Logger.minor(this, "Returning because 
seqno = "+seqNumber);
-                       return;
-               }
                // No sequence number == no messages

                if((seqNumber != -1) && tracker.alreadyReceived(seqNumber)) {
@@ -1966,6 +1962,11 @@

                tracker.receivedPacket(seqNumber);

+               if(seqNumber == -1) {
+                       if(logMINOR) Logger.minor(this, "Returning because 
seqno = "+seqNumber);
+                       return;
+               }
+               
                int messages = decrypted[ptr++] & 0xff;

                overhead += ptr;

Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java      2008-03-24 02:17:08 UTC 
(rev 18732)
+++ trunk/freenet/src/freenet/node/KeyTracker.java      2008-03-24 15:58:49 UTC 
(rev 18733)
@@ -98,6 +98,9 @@

     final long createdTime;

+       /** The time at which we last successfully decoded a packet. */
+       private long timeLastDecodedPacket;
+       
     /** Everything is clear to start with */
     KeyTracker(PeerNode pn, BlockCipher cipher, byte[] sessionKey) {
         this.pn = pn;
@@ -444,6 +447,7 @@
      * the reason for the locking.
      */
     public synchronized void receivedPacket(int seqNumber) {
+       timeLastDecodedPacket = System.currentTimeMillis();
         logMINOR = Logger.shouldLog(Logger.MINOR, this);
        if(logMINOR) Logger.minor(this, "Received packet "+seqNumber+" from 
"+pn.shortToString());
         if(seqNumber == -1) return;
@@ -1104,4 +1108,8 @@
                }
        }

+       public synchronized long timeLastDecodedPacket() {
+               return timeLastDecodedPacket;
+       }
+       
 }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-03-24 02:17:08 UTC 
(rev 18732)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-03-24 15:58:49 UTC 
(rev 18733)
@@ -2409,6 +2409,15 @@
                                } catch(WouldBlockException e) {
                                        Logger.error(this, "Impossible: " + e, 
e);
                                }
+                       if(t > -1 && now - tracker.timeLastDecodedPacket() > 
60*1000 && cur != null && 
+                                       (tracker.countAckRequests() > 0 || 
tracker.countResendRequests() > 0)) {
+                               Logger.error(this, "No packets decoded on 
"+tracker+" for 60 seconds, deprecating in favour of cur: "+cur);
+                               prev.completelyDeprecated(cur);
+                               synchronized(this) {
+                                       if(previousTracker == prev)
+                                               previousTracker = null;
+                               }
+                       }
                }
        }



Reply via email to