Author: toad
Date: 2008-02-19 01:06:30 +0000 (Tue, 19 Feb 2008)
New Revision: 18062
Modified:
trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
Fix our use of backdoor coalescing: rewrite onGotKey() so that it can deal with
keys which have already been taken off the fetch list.
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-02-18 23:52:35 UTC (rev 18061)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-02-19 01:06:30 UTC (rev 18062)
@@ -563,4 +563,12 @@
}
return -1;
}
+
+ public synchronized int getBlockNumber(Key key) {
+ for(int i=0;i<dataKeys.length;i++)
+ if(dataKeys[i] != null &&
dataKeys[i].getNodeKey().equals(key)) return i;
+ for(int i=0;i<checkKeys.length;i++)
+ if(checkKeys[i] != null &&
checkKeys[i].getNodeKey().equals(key)) return dataKeys.length+i;
+ return -1;
+ }
}
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2008-02-18 23:52:35 UTC (rev 18061)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2008-02-19 01:06:30 UTC (rev 18062)
@@ -5,6 +5,10 @@
import freenet.client.FetchContext;
import freenet.client.FetchException;
+import freenet.keys.CHKBlock;
+import freenet.keys.CHKVerifyException;
+import freenet.keys.ClientCHK;
+import freenet.keys.ClientCHKBlock;
import freenet.keys.ClientKey;
import freenet.keys.ClientKeyBlock;
import freenet.keys.Key;
@@ -304,29 +308,41 @@
public void onGotKey(Key key, KeyBlock block, RequestScheduler sched) {
if(logMINOR) Logger.minor(this, "onGotKey("+key+")");
- int blockNum = -1;
- Object token = null;
- ClientKey ckey = null;
+ // Find and remove block if it is on this subsegment. However
it may have been
+ // removed already.
synchronized(this) {
for(int i=0;i<blockNums.size();i++) {
- token = blockNums.get(i);
+ Integer token = (Integer) blockNums.get(i);
int num = ((Integer)token).intValue();
Key k = segment.getBlockNodeKey(num);
if(k != null && k.equals(key)) {
- blockNum = num;
- ckey = segment.getBlockKey(num);
blockNums.remove(i);
break;
}
}
}
- if(blockNum == -1) return;
+ int blockNo = segment.getBlockNumber(key);
+ if(blockNo == -1) {
+ Logger.minor(this, "No block found for key "+key+" on
"+this);
+ return;
+ }
+ Integer token = new Integer(blockNo);
+ ClientCHK ckey = (ClientCHK) segment.getBlockKey(blockNo);
+ ClientCHKBlock cb;
try {
- onSuccess(Key.createKeyBlock(ckey, block), false,
token, sched);
- } catch (KeyVerifyException e) {
- // FIXME if we ever abolish the direct route, this must
be turned into an onFailure().
- Logger.error(this, "Failed to parse in
onGotKey("+key+","+block+") - believed to be "+ckey+" (block #"+blockNum+")");
+ cb = new ClientCHKBlock((CHKBlock)block, ckey);
+ } catch (CHKVerifyException e) {
+ onFailure(new
FetchException(FetchException.BLOCK_DECODE_ERROR, e), token, sched);
+ return;
}
+ Bucket data = extract(cb, token, sched);
+
+ if(!cb.isMetadata()) {
+ onSuccess(data, false, (Integer)token,
((Integer)token).intValue(), cb, sched);
+ } else {
+ onFailure(new
FetchException(FetchException.INVALID_METADATA, "Metadata where expected
data"), token, sched);
+ }
+
}
public void kill() {