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; + } + } + }
