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;
+ }
+ }
}
}