Author: toad
Date: 2006-09-06 21:36:40 +0000 (Wed, 06 Sep 2006)
New Revision: 10416

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/KeyTracker.java
   trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java
   trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMapElement.java
Log:
Some work on output flooding:
- Tweak some timeouts; it doesn't make sense to ask for an ack until at least 4 
RTTs have elapsed
- Don't resend the same packet twice within 4 RTTs
- Logging

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-09-06 
20:52:46 UTC (rev 10415)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-09-06 
21:36:40 UTC (rev 10416)
@@ -796,7 +796,7 @@
                 Logger.error(this, "Packet not long enough at byte "+ptr+" on 
"+tracker);
             }
             int realSeqNo = referenceSeqNumber - offset;
-            if(logMINOR) Logger.minor(this, "RetransmitRequest: "+realSeqNo);
+            if(logMINOR) Logger.minor(this, "RetransmitRequest: "+realSeqNo+" 
for "+tracker.pn.getPeer());
             tracker.resendPacket(realSeqNo);
         }


Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java      2006-09-06 20:52:46 UTC 
(rev 10415)
+++ trunk/freenet/src/freenet/node/KeyTracker.java      2006-09-06 21:36:40 UTC 
(rev 10416)
@@ -309,13 +309,15 @@
     private class QueuedAckRequest extends BaseQueuedResend {

        final long createdTime;
+       long activeDelay;

        long initialActiveTime(long now) {
             // 500ms after sending packet, send ackrequest
-            return now + 500;
+               activeDelay = fourRTTs();
+            return now + activeDelay;
         }

-        QueuedAckRequest(int packetNumber, boolean sendSoon) {
+               QueuedAckRequest(int packetNumber, boolean sendSoon) {
             super(packetNumber);
             this.createdTime = System.currentTimeMillis();
             if(sendSoon) {
@@ -369,7 +371,11 @@
         queueAck(seqNumber);
     }

-    protected void receivedPacketNumber(int seqNumber) {
+    public long fourRTTs() {
+       return (long) Math.max(500, pn.averagePingTime()*4);
+       }
+
+       protected void receivedPacketNumber(int seqNumber) {
        if(logMINOR) Logger.minor(this, "Handling received packet number 
"+seqNumber);
         queueResendRequests(seqNumber);
         packetNumbersReceived.got(seqNumber);
@@ -899,18 +905,25 @@
      */
     public ResendPacketItem[] grabResendPackets() {
         int[] numbers;
+        long now = System.currentTimeMillis();
+        long fourRTTs = fourRTTs();
+        int count = 0;
         synchronized(packetsToResend) {
             int len = packetsToResend.size();
             numbers = new int[len];
             int i=0;
             for(Iterator it=packetsToResend.iterator();it.hasNext();) {
                 int packetNo = ((Integer)it.next()).intValue();
-                numbers[i++] = packetNo;
+                long resentTime = sentPacketsContents.getReaddedTime(packetNo);
+                if(resentTime > 0 && now - resentTime > fourRTTs) {
+                       numbers[i++] = packetNo;
+                       it.remove();
+                       count++;
+                }
             }
-            packetsToResend.clear();
         }
         ResendPacketItem[] items = new ResendPacketItem[numbers.length];
-        for(int i=0;i<numbers.length;i++) {
+        for(int i=0;i<count;i++) {
             int packetNo = numbers[i];
             byte[] buf = sentPacketsContents.get(packetNo);
             if(buf == null) {

Modified: trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java
===================================================================
--- trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java  
2006-09-06 20:52:46 UTC (rev 10415)
+++ trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMap.java  
2006-09-06 21:36:40 UTC (rev 10416)
@@ -67,6 +67,17 @@
     }

     /**
+     * Get the time at which an index was re-added last.
+     */
+    public synchronized long getReaddedTime(int index) {
+        Integer i = new Integer(index);
+        LimitedRangeIntByteArrayMapElement wrapper = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        if(wrapper != null)
+               return wrapper.reputTime;
+        else return -1;
+    }
+    
+    /**
      * Try to add an index/data mapping.
      * @return True if we succeeded, false if the index was out
      * of range.
@@ -89,7 +100,12 @@
             minValue = index;
         }
         if(data == null) throw new NullPointerException();
-        contents.put(new Integer(index), new 
LimitedRangeIntByteArrayMapElement(index, data, callbacks));
+        Integer i = new Integer(index);
+        LimitedRangeIntByteArrayMapElement le = 
(LimitedRangeIntByteArrayMapElement) contents.get(i);
+        if(le == null)
+               contents.put(new Integer(index), new 
LimitedRangeIntByteArrayMapElement(index, data, callbacks));
+        else
+               le.reput();
         notifyAll();
         return true;
     }

Modified: 
trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMapElement.java
===================================================================
--- trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMapElement.java   
2006-09-06 20:52:46 UTC (rev 10415)
+++ trunk/freenet/src/freenet/support/LimitedRangeIntByteArrayMapElement.java   
2006-09-06 21:36:40 UTC (rev 10416)
@@ -16,4 +16,9 @@
     public final byte[] data;
     public final AsyncMessageCallback[] callbacks;
     public final long createdTime;
+    long reputTime;
+    
+       public void reput() {
+               this.reputTime = System.currentTimeMillis();
+       }
 }


Reply via email to