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() {


Reply via email to