Author: toad
Date: 2008-02-22 20:08:05 +0000 (Fri, 22 Feb 2008)
New Revision: 18106
Modified:
trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
Don't remove a subsegment until there are no keys at that retry level.
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-02-22 20:07:10 UTC (rev 18105)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-02-22 20:08:05 UTC (rev 18106)
@@ -491,15 +491,37 @@
else return null;
}
- public synchronized void removeSeg(SplitFileFetcherSubSegment segment) {
+ /**
+ * Double-check whether we need to remove a subsegment, and if so,
remove it.
+ * We need to do the check because there is no point removing the
subsegment until all
+ * its running requests have been removed (since request data
structures will refer to it
+ * anyway), and all the requests on the cooldown queue for it have been
removed. In either
+ * case we get duplicated structures in memory.
+ * @return True if we removed the subsegment.
+ */
+ public synchronized boolean maybeRemoveSeg(SplitFileFetcherSubSegment
segment) {
+ int retryCount = segment.retryCount;
+ boolean dontRemove = true;
+ for(int i=0;i<dataRetries.length;i++)
+ if(dataRetries[i] == retryCount) {
+ dontRemove = false;
+ break;
+ }
+ for(int i=0;i<checkRetries.length;i++)
+ if(checkRetries[i] == retryCount) {
+ dontRemove = false;
+ break;
+ }
+ if(dontRemove) return false;
if(logMINOR)
- Logger.minor(this, "Removing sub segment: "+segment);
+ Logger.minor(this, "Removing sub segment: "+segment+"
for retry count "+retryCount);
for(int i=0;i<subSegments.size();i++) {
if(segment.equals(subSegments.get(i))) {
subSegments.remove(i);
i--;
}
}
+ return true;
}
private void removeSubSegments() {
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2008-02-22 20:07:10 UTC (rev 18105)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2008-02-22 20:08:05 UTC (rev 18106)
@@ -308,7 +308,7 @@
Logger.minor(this, "Definitely removing from
parent: "+this);
cancelled = true;
}
- segment.removeSeg(this);
+ if(!segment.maybeRemoveSeg(this)) return;
unregister();
}
@@ -360,7 +360,8 @@
blockNums.clear();
cancelled = true;
}
- segment.removeSeg(this);
+ if(!segment.maybeRemoveSeg(this))
+ Logger.error(this, "Could not remove subsegment:
"+this+" from "+segment+" for some reason in kill()!");
}
public long getCooldownWakeup(Object token) {