Author: toad
Date: 2007-06-26 16:03:00 +0000 (Tue, 26 Jun 2007)
New Revision: 13765
Modified:
trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
trunk/freenet/src/freenet/client/async/USKChecker.java
trunk/freenet/src/freenet/node/SendableGet.java
trunk/freenet/src/freenet/node/SendableRequest.java
trunk/freenet/src/freenet/node/SimpleSendableInsert.java
Log:
Fix some leaks in back-door coalescing and possibly in scheduling in general
Modified: trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -11,7 +11,6 @@
import freenet.keys.KeyVerifyException;
import freenet.node.SendableGet;
import freenet.support.Logger;
-import freenet.support.RandomGrabArray;
public abstract class BaseSingleFileFetcher extends SendableGet {
@@ -83,8 +82,7 @@
synchronized(this) {
cancelled = true;
}
- RandomGrabArray arr = getParentGrabArray();
- if(arr != null) arr.remove(this);
+ super.unregister();
}
public synchronized boolean isCancelled() {
Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -496,8 +496,7 @@
for(int i=0;i<reqs.length;i++) {
SendableRequest req = reqs[i];
- RandomGrabArray array = req.getParentGrabArray();
- if(array != null) array.remove(req);
+ req.unregister();
innerRegister(req);
}
synchronized(starter) {
@@ -535,4 +534,10 @@
};
node.getTicker().queueTimedJob(r, 0); // FIXME ideally these
would be completed on a single thread; when we have 1.5, use a dedicated
non-parallel Executor
}
+
+ public boolean anyWantKey(Key key) {
+ synchronized(pendingKeys) {
+ return pendingKeys.get(key) != null;
+ }
+ }
}
Modified: trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -98,7 +98,7 @@
}
}
// :(
- getScheduler().removePendingKeys(this, false);
+ unregister();
if(e.isFatal() || forceFatal)
parent.fatallyFailedBlock();
else
@@ -108,6 +108,7 @@
/** Will be overridden by SingleFileFetcher */
protected void onSuccess(FetchResult data) {
+ unregister();
if(parent.isCancelled()) {
data.asBucket().free();
onFailure(new FetchException(FetchException.CANCELLED));
Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -276,8 +276,7 @@
if(finished) return;
finished = true;
}
- RandomGrabArray arr = getParentGrabArray();
- if(arr != null) arr.remove(this);
+ super.unregister();
cb.onFailure(new InsertException(InsertException.CANCELLED),
this);
}
Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -177,7 +177,7 @@
}
protected void onSuccess(FetchResult result) {
- getScheduler().removePendingKeys(this, false);
+ unregister();
if(parent.isCancelled()) {
if(logMINOR)
Logger.minor(this, "Parent is cancelled");
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -203,7 +203,12 @@
if(isCollectingBinaryBlob()) {
for(int i=0;i<dataBuckets.length;i++) {
Bucket data = dataBuckets[i].getData();
- maybeAddToBinaryBlob(data, i, false);
+ try {
+ maybeAddToBinaryBlob(data, i,
false);
+ } catch (FetchException e) {
+ fail(e);
+ return;
+ }
}
}
decodedData = fetchContext.bucketFactory.makeBucket(-1);
@@ -261,7 +266,12 @@
for(int i=0;i<checkBuckets.length;i++) {
boolean heal = false;
Bucket data = checkBuckets[i].getData();
- maybeAddToBinaryBlob(data, i, true);
+ try {
+ maybeAddToBinaryBlob(data, i, true);
+ } catch (FetchException e) {
+ fail(e);
+ return;
+ }
if(checkRetries[i] > 0)
heal = true;
if(heal) {
@@ -284,7 +294,7 @@
} else return false;
}
- private void maybeAddToBinaryBlob(Bucket data, int i, boolean check) {
+ private void maybeAddToBinaryBlob(Bucket data, int i, boolean check)
throws FetchException {
if(parentFetcher.parent instanceof ClientGetter) {
ClientGetter getter = (ClientGetter)
(parentFetcher.parent);
if(getter.collectingBinaryBlob()) {
@@ -294,11 +304,9 @@
getter.addKeyToBinaryBlob(block);
} catch (CHKEncodeException e) {
Logger.error(this, "Failed to encode
(collecting binary blob) "+(check?"check":"data")+" block "+i+": "+e, e);
- fail(new
FetchException(FetchException.INTERNAL_ERROR, "Failed to encode for binary
blob: "+e));
- return;
+ throw new
FetchException(FetchException.INTERNAL_ERROR, "Failed to encode for binary
blob: "+e);
} catch (IOException e) {
- fail(new
FetchException(FetchException.BUCKET_ERROR, "Failed to encode for binary blob:
"+e));
- return;
+ throw new
FetchException(FetchException.BUCKET_ERROR, "Failed to encode for binary blob:
"+e);
}
}
}
@@ -343,7 +351,8 @@
}
if(allFailed)
fail(new FetchException(FetchException.SPLITFILE_ERROR,
errors));
- seg.possiblyRemoveFromParent();
+ else
+ seg.possiblyRemoveFromParent();
}
/** A request has failed non-fatally, so the block may be retried */
@@ -412,6 +421,7 @@
checkBuckets[i] = null;
}
}
+ removeSubSegments();
parentFetcher.segmentFinished(this);
}
@@ -458,4 +468,11 @@
}
}
+ private void removeSubSegments() {
+ for(int i=0;i<subSegments.size();i++) {
+ SplitFileFetcherSubSegment seg =
(SplitFileFetcherSubSegment) subSegments.get(i);
+ seg.kill();
+ }
+ }
+
}
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2007-06-26 16:03:00 UTC (rev 13765)
@@ -264,7 +264,7 @@
if(!blockNums.isEmpty()) return;
}
segment.removeSeg(this);
- getScheduler().removePendingKeys(this, false);
+ unregister();
}
public void onGotKey(Key key, KeyBlock block) {
@@ -292,4 +292,12 @@
}
}
+ public void kill() {
+ synchronized(this) {
+ blockNums.clear();
+ }
+ segment.removeSeg(this);
+ unregister();
+ }
+
}
Modified: trunk/freenet/src/freenet/client/async/USKChecker.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKChecker.java 2007-06-26
15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/USKChecker.java 2007-06-26
16:03:00 UTC (rev 13765)
@@ -26,7 +26,7 @@
}
public void onSuccess(ClientKeyBlock block, boolean fromStore, int
token) {
- getScheduler().removePendingKeys(this, false);
+ unregister();
cb.onSuccess((ClientSSKBlock)block);
}
@@ -63,7 +63,7 @@
if(canRetry && retry()) return;
// Ran out of retries.
- getScheduler().removePendingKeys(this, false);
+ unregister();
if(e.code == LowLevelGetException.CANCELLED){
cb.onCancelled();
return;
Modified: trunk/freenet/src/freenet/node/SendableGet.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableGet.java 2007-06-26 15:41:28 UTC
(rev 13764)
+++ trunk/freenet/src/freenet/node/SendableGet.java 2007-06-26 16:03:00 UTC
(rev 13765)
@@ -116,5 +116,10 @@
}
public abstract void onGotKey(Key key, KeyBlock block);
-
+
+ public final void unregister() {
+ getScheduler().removePendingKeys(this, false);
+ super.unregister();
+ }
+
}
Modified: trunk/freenet/src/freenet/node/SendableRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableRequest.java 2007-06-26 15:41:28 UTC
(rev 13764)
+++ trunk/freenet/src/freenet/node/SendableRequest.java 2007-06-26 16:03:00 UTC
(rev 13765)
@@ -42,4 +42,9 @@
parentGrabArray = parent;
}
+ public void unregister() {
+ RandomGrabArray arr = getParentGrabArray();
+ if(arr != null) arr.remove(this);
+ }
+
}
Modified: trunk/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- trunk/freenet/src/freenet/node/SimpleSendableInsert.java 2007-06-26
15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/node/SimpleSendableInsert.java 2007-06-26
16:03:00 UTC (rev 13765)
@@ -106,8 +106,7 @@
if(finished) return;
finished = true;
}
- RandomGrabArray arr = getParentGrabArray();
- if(arr != null) arr.remove(this);
+ super.unregister();
}
public boolean shouldCache() {