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