Author: toad
Date: 2007-06-12 19:50:18 +0000 (Tue, 12 Jun 2007)
New Revision: 13538

Modified:
   trunk/freenet/src/freenet/client/FetchContext.java
   trunk/freenet/src/freenet/client/async/BlockSet.java
   trunk/freenet/src/freenet/client/async/ClientGetter.java
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/SimpleBlockSet.java
Log:
BlockSet.get(ClientKey key).
Add a BlockSet to FetchContext, use it before the datastore.

Modified: trunk/freenet/src/freenet/client/FetchContext.java
===================================================================
--- trunk/freenet/src/freenet/client/FetchContext.java  2007-06-12 19:40:54 UTC 
(rev 13537)
+++ trunk/freenet/src/freenet/client/FetchContext.java  2007-06-12 19:50:18 UTC 
(rev 13538)
@@ -3,6 +3,7 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.client;

+import freenet.client.async.BlockSet;
 import freenet.client.async.HealingQueue;
 import freenet.client.async.USKManager;
 import freenet.client.events.ClientEventProducer;
@@ -45,6 +46,8 @@
        public boolean returnZIPManifests;
        public final HealingQueue healingQueue;
        public final boolean ignoreTooManyPathComponents;
+       /** If set, contains a set of blocks to be consulted before checking 
the datastore. */
+       public BlockSet blocks;

        public FetchContext(long curMaxLength, 
                        long curMaxTempLength, int maxMetadataSize, int 
maxRecursionLevel, int maxArchiveRestarts, int maxArchiveLevels,

Modified: trunk/freenet/src/freenet/client/async/BlockSet.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BlockSet.java        2007-06-12 
19:40:54 UTC (rev 13537)
+++ trunk/freenet/src/freenet/client/async/BlockSet.java        2007-06-12 
19:50:18 UTC (rev 13538)
@@ -5,6 +5,8 @@

 import java.util.Set;

+import freenet.keys.ClientKey;
+import freenet.keys.ClientKeyBlock;
 import freenet.keys.Key;
 import freenet.keys.KeyBlock;

@@ -33,5 +35,8 @@
         * kept up to date. Read only.
         */
        public Set keys();
+
+       /** Get a high level block, given a high level key */
+       public ClientKeyBlock get(ClientKey key);

 }

Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java    2007-06-12 
19:40:54 UTC (rev 13537)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java    2007-06-12 
19:50:18 UTC (rev 13538)
@@ -10,14 +10,13 @@

 import freenet.client.ArchiveContext;
 import freenet.client.ClientMetadata;
+import freenet.client.FetchContext;
 import freenet.client.FetchException;
 import freenet.client.FetchResult;
-import freenet.client.FetchContext;
 import freenet.client.events.SplitfileProgressEvent;
 import freenet.keys.ClientKeyBlock;
 import freenet.keys.FreenetURI;
 import freenet.keys.Key;
-import freenet.keys.KeyBlock;
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
 import freenet.support.io.BucketTools;

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2007-06-12 19:40:54 UTC (rev 13537)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2007-06-12 19:50:18 UTC (rev 13538)
@@ -190,15 +190,19 @@
                                int[] keyTokens = getter.allKeys();
                                for(int i=0;i<keyTokens.length;i++) {
                                        int tok = keyTokens[i];
-                                       ClientKeyBlock block;
+                                       ClientKeyBlock block = null;
                                        try {
                                                ClientKey key = 
getter.getKey(tok);
                                                if(key == null) {
                                                        if(logMINOR)
                                                                
Logger.minor(this, "No key for "+tok+" for "+getter+" - already finished?");
                                                        continue;
-                                               } else
-                                                       block = 
node.fetchKey(key, getter.dontCache());
+                                               } else {
+                                                       
if(getter.getContext().blocks != null)
+                                                               block = 
getter.getContext().blocks.get(key);
+                                                       if(block == null)
+                                                               block = 
node.fetchKey(key, getter.dontCache());
+                                               }
                                        } catch (KeyVerifyException e) {
                                                // Verify exception, probably 
bogus at source;
                                                // verifies at low-level, but 
not at decode.

Modified: trunk/freenet/src/freenet/client/async/SimpleBlockSet.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleBlockSet.java  2007-06-12 
19:40:54 UTC (rev 13537)
+++ trunk/freenet/src/freenet/client/async/SimpleBlockSet.java  2007-06-12 
19:50:18 UTC (rev 13538)
@@ -3,8 +3,12 @@
 import java.util.HashMap;
 import java.util.Set;

+import freenet.keys.ClientKey;
+import freenet.keys.ClientKeyBlock;
 import freenet.keys.Key;
 import freenet.keys.KeyBlock;
+import freenet.keys.KeyVerifyException;
+import freenet.support.Logger;

 /** 
  * Simple BlockSet implementation, keeps all keys in RAM.
@@ -19,12 +23,23 @@
                blocksByKey.put(block.getKey(), block);
        }

-       public KeyBlock get(Key key) {
+       public synchronized KeyBlock get(Key key) {
                return (KeyBlock) blocksByKey.get(key);
        }

-       public Set keys() {
+       public synchronized Set keys() {
                return blocksByKey.keySet();
        }

+       public ClientKeyBlock get(ClientKey key) {
+               KeyBlock block = get(key.getNodeKey());
+               if(block == null) return null;
+               try {
+                       return Key.createKeyBlock(key, block);
+               } catch (KeyVerifyException e) {
+                       Logger.error(this, "Caught decoding block with "+key+" 
: "+e, e);
+                       return null;
+               }
+       }
+
 }


Reply via email to