Author: toad
Date: 2006-04-11 14:51:48 +0000 (Tue, 11 Apr 2006)
New Revision: 8510

Modified:
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodePinger.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/Version.java
Log:
631:
"Stage 2" of implementing congestion management changes: Two separate limits:
- 1000ms-2000ms for bwlimited block sends
- 500ms-1000ms for round trip time (ack of a message; this is not likely to be 
consistently under 200ms because we don't send an ack for 200ms if there is no 
other traffic)


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-04-11 14:34:24 UTC (rev 
8509)
+++ trunk/freenet/src/freenet/node/Node.java    2006-04-11 14:51:48 UTC (rev 
8510)
@@ -92,6 +92,8 @@
 import freenet.support.io.FilenameGenerator;
 import freenet.support.io.PersistentTempBucketFactory;
 import freenet.support.io.TempBucketFactory;
+import freenet.support.math.RunningAverage;
+import freenet.support.math.TimeDecayingRunningAverage;
 import freenet.transport.IPAddressDetector;
 import freenet.transport.IPUtil;

@@ -143,11 +145,17 @@
     // If we don't receive any packets at all in this period, from any node, 
tell the user
     public static final long ALARM_TIME = 60*1000;
     /** Sub-max ping time. If ping is greater than this, we reject some 
requests. */
-    public static final long SUB_MAX_PING_TIME = 1000;
+    public static final long SUB_MAX_PING_TIME = 500;
     /** Maximum overall average ping time. If ping is greater than this,
-     * we reject all requests.
-     */
-    public static final long MAX_PING_TIME = 2000;
+     * we reject all requests. */
+    public static final long MAX_PING_TIME = 1000;
+    /** Maximum throttled packet delay. If the throttled packet delay is 
greater
+     * than this, reject all packets. */
+    public static final long MAX_THROTTLE_DELAY = 1000;
+    /** If the throttled packet delay is less than this, reject no packets; if 
it's
+     * between the two, reject some packets. */
+    public static final long SUB_MAX_THROTTLE_DELAY = 2000;
+    
     /** Accept one request every 10 seconds regardless, to ensure we update the
      * block send time.
      */
@@ -259,6 +267,7 @@
     final RequestThrottle sskInsertThrottle;
     final RequestStarter sskInsertStarter;
        public final UserAlertManager alerts;
+       final RunningAverage throttledPacketSendAverage;

     File downloadDir;
     public final ClientRequestScheduler chkFetchScheduler;
@@ -516,6 +525,8 @@
         decrementAtMax = random.nextDouble() <= DECREMENT_AT_MAX_PROB;
         decrementAtMin = random.nextDouble() <= DECREMENT_AT_MIN_PROB;
         bootID = random.nextLong();
+        throttledPacketSendAverage =
+               new TimeDecayingRunningAverage(1, 60000 /* should be 
significantly longer than a typical transfer */, 0, Long.MAX_VALUE);

        // Setup node-specific configuration

@@ -1422,6 +1433,8 @@

     public synchronized boolean shouldRejectRequest() {
        long now = System.currentTimeMillis();
+       
+       // Round trip time
        double pingTime = nodePinger.averagePingTime();
        if(pingTime > MAX_PING_TIME) {
                if(now - lastAcceptedRequest > MAX_INTERREQUEST_TIME) {
@@ -1435,6 +1448,23 @@
                if(random.nextDouble() < x)
                        return true;
        }
+       
+       // Bandwidth limited packets
+       
+       double bwlimitDelayTime = 
this.throttledPacketSendAverage.currentValue();
+       if(pingTime > MAX_THROTTLE_DELAY) {
+               if(now - lastAcceptedRequest > MAX_INTERREQUEST_TIME) {
+                       lastAcceptedRequest = now;
+                       return false;
+               }
+               return true;
+       }
+       if(bwlimitDelayTime > SUB_MAX_THROTTLE_DELAY) {
+               double x = (pingTime - SUB_MAX_THROTTLE_DELAY) / 
(MAX_THROTTLE_DELAY - SUB_MAX_THROTTLE_DELAY);
+               if(random.nextDouble() < x)
+                       return true;
+       }
+       
        lastAcceptedRequest = now;
        return false;
     }

Modified: trunk/freenet/src/freenet/node/NodePinger.java
===================================================================
--- trunk/freenet/src/freenet/node/NodePinger.java      2006-04-11 14:34:24 UTC 
(rev 8509)
+++ trunk/freenet/src/freenet/node/NodePinger.java      2006-04-11 14:51:48 UTC 
(rev 8510)
@@ -2,6 +2,9 @@

 import freenet.support.Logger;

+/**
+ * Track average round-trip time for each peer node, get a geometric mean.
+ */
 public class NodePinger implements Runnable {

        private double meanPing = 0;
@@ -35,10 +38,8 @@
                        if(!peer.isConnected()) continue;
                        peerCount++;
                        double avgPingTime = peer.averagePingTime();
-                       double avgThrottledPacketSendTime = 
peer.throttledPacketSendAverage.currentValue();
-                       double value = Math.max(avgPingTime, 
avgThrottledPacketSendTime);
-                       Logger.minor(this, "Peer: "+peer.getPeer()+", 
avgPingTime: "+avgPingTime+", avg throttled send time: 
"+avgThrottledPacketSendTime);
-                       total *= value;
+                       Logger.minor(this, "Peer: "+peer.getPeer()+", 
avgPingTime: "+avgPingTime);
+                       total *= avgPingTime;
                }
                if(peerCount > 0) {
                        total = Math.pow(total, 1.0 / peerCount);

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-04-11 14:34:24 UTC 
(rev 8509)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-04-11 14:51:48 UTC 
(rev 8510)
@@ -310,8 +310,6 @@
         // So go for a filter.
         pingAverage = 
                new TimeDecayingRunningAverage(1, 60000 /* should be 
significantly longer than a typical transfer */, 0, Long.MAX_VALUE);
-        throttledPacketSendAverage =
-               new TimeDecayingRunningAverage(1, 60000 /* should be 
significantly longer than a typical transfer */, 0, Long.MAX_VALUE);
     }

     private void randomizeMaxTimeBetweenPacketSends() {
@@ -1152,7 +1150,6 @@
        final LRUHashtable pingsSentTimes = new LRUHashtable();
        long pingNumber;
        final RunningAverage pingAverage;
-       final RunningAverage throttledPacketSendAverage;

        public void sendPing() {
                long pingNo;
@@ -1204,7 +1201,7 @@
        }

        public void reportThrottledPacketSendTime(long timeDiff) {
-               throttledPacketSendAverage.report(timeDiff);
+               node.throttledPacketSendAverage.report(timeDiff);
                Logger.minor(this, "Reporting throttled packet send time: 
"+timeDiff+" to "+getPeer());
        }


Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-04-11 14:34:24 UTC (rev 
8509)
+++ trunk/freenet/src/freenet/node/Version.java 2006-04-11 14:51:48 UTC (rev 
8510)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 630;
+       private static final int buildNumber = 631;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 591;


Reply via email to