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


Reply via email to