Author: toad
Date: 2007-07-24 17:25:59 +0000 (Tue, 24 Jul 2007)
New Revision: 14313
Modified:
trunk/freenet/src/freenet/node/fcp/ClientGet.java
Log:
Hopefully fix Internal error: Data != returnBucket
Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java 2007-07-24 17:21:11 UTC
(rev 14312)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java 2007-07-24 17:25:59 UTC
(rev 14313)
@@ -351,17 +351,26 @@
Logger.minor(this, "Succeeded: "+identifier);
Bucket data = result.asBucket();
if(returnBucket != data && !binaryBlob) {
+ boolean failed = true;
synchronized(this) {
if(finished) {
Logger.error(this, "Already finished
but onSuccess() for "+this+" data = "+data, new Exception("debug"));
- result.asBucket().free();
+ data.free();
return; // Already failed - bucket
error maybe??
}
+ if(returnType ==
ClientGetMessage.RETURN_TYPE_DIRECT && returnBucket == null) {
+ // Lost bucket for some reason e.g.
bucket error (caused by IOException) on previous try??
+ // Recover...
+ returnBucket = data;
+ failed = false;
+ }
}
- Logger.error(this, "returnBucket = "+returnBucket+" but
onSuccess() data = "+data, new Exception("debug"));
- // Caller guarantees that data == returnBucket
- onFailure(new
FetchException(FetchException.INTERNAL_ERROR, "Data != returnBucket"), null);
- return;
+ if(failed) {
+ Logger.error(this, "returnBucket =
"+returnBucket+" but onSuccess() data = "+data, new Exception("debug"));
+ // Caller guarantees that data == returnBucket
+ onFailure(new
FetchException(FetchException.INTERNAL_ERROR, "Data != returnBucket"), null);
+ return;
+ }
}
boolean dontFree = false;
// FIXME I don't think this is a problem in this case...? (Disk
write while locked..)