On Friday 23 May 2008 15:20, j16sdiz at freenetproject.org wrote:
> Author: j16sdiz
> Date: 2008-05-23 14:20:31 +0000 (Fri, 23 May 2008)
> New Revision: 20061
> 
> Modified:
>    
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
> Log:
> use bloom filter

Can we be 100% sure of not adding the same key twice? The write code takes a 
lock, then checks every place it could be, then writes it, and updates the 
bloom filter, so we should never add the same key twice, right?

Is it possible to calculate how often we will need to regenerate the filter? 
We will need to do that in the background, and obviously turn off lookups 
during that period...
> 
> 
> Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
> ===================================================================
> --- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
2008-05-23 14:20:21 UTC (rev 20060)
> +++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
2008-05-23 14:20:31 UTC (rev 20061)
> @@ -23,6 +23,7 @@
>  import freenet.crypt.ciphers.Rijndael;
>  import freenet.keys.KeyVerifyException;
>  import freenet.node.SemiOrderedShutdownHook;
> +import freenet.support.BloomFilter;
>  import freenet.support.Fields;
>  import freenet.support.HexUtil;
>  import freenet.support.Logger;
> @@ -39,6 +40,10 @@
>       private static final boolean OPTION_SAVE_PLAINKEY = true;
>       private static final int OPTION_MAX_PROBE = 4;
>       
> +     private static final boolean updateBloom = true;
> +     private static final boolean checkBloom = true;
> +     private BloomFilter bloomFilter;
> +             
>       private static final boolean logLOCK = false;
>       private static boolean logMINOR;
>       private static boolean logDEBUG;
> @@ -88,6 +93,9 @@
>               loadConfigFile();
>  
>               openStoreFiles(baseDir, name);
> +             
> +             if (updateBloom || checkBloom)
> +                     bloomFilter = new BloomFilter(new File(this.baseDir, 
> name + ".bloom"), 
0x100000, 5);
>  
>               callback.setStore(this);
>               shutdownHook.addEarlyJob(new Thread(new ShutdownDB()));
> @@ -99,7 +107,7 @@
>       public StorableBlock fetch(byte[] routingKey, byte[] fullKey, boolean 
dontPromote) throws IOException {
>               if (logMINOR)
>                       Logger.minor(this, "Fetch " + 
> HexUtil.bytesToHex(routingKey) + " for " + 
callback);
> -
> +             
>               Entry entry = probeEntry(routingKey);
>  
>               if (entry == null) {
> @@ -112,6 +120,8 @@
>               try {
>                       StorableBlock block = 
> entry.getStorableBlock(routingKey, fullKey);
>                       incHits();
> +                     if (updateBloom && !checkBloom)
> +                             bloomFilter.updateFilter(routingKey);
>                       return block;
>               } catch (KeyVerifyException e) {
>                       Logger.minor(this, "key verification exception", e);
> @@ -129,6 +139,10 @@
>        * @throws IOException
>        */
>       private Entry probeEntry(byte[] routingKey) throws IOException {
> +             if (checkBloom)
> +                     if (!bloomFilter.checkFilter(routingKey))
> +                             return null;
> +
>               Entry entry = probeEntry0(routingKey, storeSize);
>  
>               if (entry == null && prevStoreSize != 0)
> @@ -190,8 +204,11 @@
>                       }
>                       
>                       // Overwrite old offset
> +                     if (updateBloom)
> +                             bloomFilter.updateFilter(routingKey);
>                       Entry entry = new Entry(routingKey, header, data);
>                       writeEntry(entry, oldOffset);
> +                     incWrites();
>                       return;
>                       } finally {
>                               unlockEntry(oldOffset);
> @@ -210,6 +227,8 @@
>                               if (isFree(offset[i])) {
>                                       if (logDEBUG)
>                                               Logger.debug(this, "probing, 
> write to i=" + i + ", offset=" + 
offset[i]);
> +                                     if (updateBloom)
> +                                             
> bloomFilter.updateFilter(routingKey);
>                                       writeEntry(entry, offset[i]);
>                                       incWrites();
>                                       return;
> @@ -227,7 +246,9 @@
>               try {
>                       if (logDEBUG)
>                               Logger.debug(this, "collision, write to i=0, 
> offset=" + offset[0]);
> -                             writeEntry(entry, offset[0]);
> +                     if (updateBloom)
> +                             bloomFilter.updateFilter(routingKey);
> +                     writeEntry(entry, offset[0]);
>                       incWrites();
>               } finally {
>                       unlockEntry(offset[0]);
> 
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20080524/e09e245f/attachment.pgp>

Reply via email to