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;