Author: toad
Date: 2008-02-13 01:19:40 +0000 (Wed, 13 Feb 2008)
New Revision: 17857
Modified:
trunk/freenet/src/freenet/node/LocationManager.java
trunk/freenet/src/freenet/node/PacketSender.java
trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
Log:
30 second timeout for items on the queue. After that, reject them.
Modified: trunk/freenet/src/freenet/node/LocationManager.java
===================================================================
--- trunk/freenet/src/freenet/node/LocationManager.java 2008-02-13 00:49:44 UTC
(rev 17856)
+++ trunk/freenet/src/freenet/node/LocationManager.java 2008-02-13 01:19:40 UTC
(rev 17857)
@@ -6,6 +6,7 @@
import java.security.MessageDigest;
import java.util.Enumeration;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;
@@ -758,6 +759,33 @@
static final int MAX_INCOMING_QUEUE_LENGTH = 10;
+ /** Prevent timeouts and deadlocks due to A waiting for B waiting for A */
+ static final long MAX_TIME_ON_INCOMING_QUEUE = 30*1000;
+
+ void removeTooOldQueuedItems() {
+ while(true) {
+ Message first;
+ synchronized(this) {
+ if(incomingMessageQueue.isEmpty()) return;
+ first = (Message) incomingMessageQueue.getFirst();
+ if(first.age() < MAX_TIME_ON_INCOMING_QUEUE) return;
+ incomingMessageQueue.removeFirst();
+ if(logMINOR) Logger.minor(this, "Cancelling queued
item: "+first+" - too long on queue, maybe circular waiting?");
+ swapsRejectedAlreadyLocked++;
+ }
+ long oldID = first.getLong(DMT.UID);
+ PeerNode pn = (PeerNode) first.getSource();
+
+ // Reject
+ Message reject = DMT.createFNPSwapRejected(oldID);
+ try {
+ pn.sendAsync(reject, null, 0, null);
+ } catch (NotConnectedException e1) {
+ if(logMINOR) Logger.minor(this, "Lost connection rejecting
SwapRequest (locked) from "+pn);
+ }
+ }
+ }
+
/**
* Handle an incoming SwapRequest
* @return True if we have handled the message, false if it needs
Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java 2008-02-13 00:49:44 UTC
(rev 17856)
+++ trunk/freenet/src/freenet/node/PacketSender.java 2008-02-13 01:19:40 UTC
(rev 17857)
@@ -189,6 +189,9 @@
pm.maybeUpdatePeerNodeRoutableConnectionStats(now);
long nextActionTime = Long.MAX_VALUE;
long oldTempNow = now;
+ // Needs to be run very frequently. Maybe change to a regular
once per second schedule job?
+ // Maybe not worth it as it is fairly lightweight.
+ node.lm.removeTooOldQueuedItems();
for(int i = 0; i < nodes.length; i++) {
PeerNode pn = nodes[i];
lastReceivedPacketFromAnyNode =
Modified:
trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
2008-02-13 00:49:44 UTC (rev 17856)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
2008-02-13 01:19:40 UTC (rev 17857)
@@ -34,7 +34,7 @@
*/
public class RealNodeRequestInsertTest extends RealNodeRoutingTest {
- static final int NUMBER_OF_NODES = 200;
+ static final int NUMBER_OF_NODES = 100;
static final int DEGREE = 10;
static final short MAX_HTL = (short)10;
static final boolean START_WITH_IDEAL_LOCATIONS = false;
@@ -55,8 +55,8 @@
wd.mkdir();
//NOTE: globalTestInit returns in ignored random source
//NodeStarter.globalTestInit(name, false, Logger.ERROR,
"freenet.node.Location:normal,freenet.node.simulator.RealNode:minor,freenet.node.Insert:MINOR,freenet.node.Request:MINOR,freenet.node.Node:MINOR");
- //NodeStarter.globalTestInit(name, false, Logger.ERROR,
"freenet.node.Location:MINOR,freenet.io.comm:MINOR,freenet.node.Node:MINOR");
- NodeStarter.globalTestInit(name, false, Logger.ERROR, "");
+ NodeStarter.globalTestInit(name, false, Logger.ERROR,
"freenet.node.Location:MINOR,freenet.io.comm:MINOR,freenet.node.Node:MINOR,freenet.node.FNP:MINOR,freenet.node.PacketSender:MINOR");
+ //NodeStarter.globalTestInit(name, false, Logger.ERROR, "");
System.out.println("Insert/retrieve test");
System.out.println();
DummyRandomSource random = new DummyRandomSource();