On Monday 26 May 2008 10:34, j16sdiz at freenetproject.org wrote:
> Author: j16sdiz
> Date: 2008-05-26 09:34:39 +0000 (Mon, 26 May 2008)
> New Revision: 20097
> 
> Modified:
>    branches/saltedhashstore/freenet/src/freenet/node/Node.java
>    
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
> Log:
> Data store migration

Would it make sense to move a bunch of keys from the end, truncate the old 
files, and repeat until everything is moved, to minimize disk space usage 
during migration? Of course this relies on a filesystem supporting sparse 
files, and will likely result in the new store files being rather 
fragmented...?
> 
> Modified: branches/saltedhashstore/freenet/src/freenet/node/Node.java
> ===================================================================
> --- branches/saltedhashstore/freenet/src/freenet/node/Node.java       
> 2008-05-26 
09:34:05 UTC (rev 20096)
> +++ branches/saltedhashstore/freenet/src/freenet/node/Node.java       
> 2008-05-26 
09:34:39 UTC (rev 20097)
> @@ -1331,35 +1331,61 @@
>                               Logger.normal(this, "Initializing CHK 
> Datastore");
>                               System.out.println("Initializing CHK Datastore 
> (" + maxStoreKeys + " 
keys)");
>                               chkDatastore = new CHKStore();
> -                             SaltedHashFreenetStore.construct(storeDir, 
> "CHK-store", chkDatastore, 
random, maxStoreKeys,
> -                                     shutdownHook);
> +                             SaltedHashFreenetStore chkDataFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-store",
> +                                     chkDatastore, random, maxStoreKeys, 
> shutdownHook);
>                               Logger.normal(this, "Initializing CHK 
> Datacache");
>                               System.out.println("Initializing CHK Datacache 
> (" + maxCacheKeys + ':' 
+ maxCacheKeys + " keys)");
>                               chkDatacache = new CHKStore();
> -                             SaltedHashFreenetStore.construct(storeDir, 
> "CHK-cache", chkDatacache, 
random, maxCacheKeys,
> -                                     shutdownHook);
> +                             SaltedHashFreenetStore chkCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-cache",
> +                                     chkDatacache, random, maxCacheKeys, 
> shutdownHook);
>  
>                               Logger.normal(this, "Initializing pubKey 
> Datastore");
>                               System.out.println("Initializing pubKey 
> Datastore");
>                               pubKeyDatastore = new PubkeyStore();
> -                             SaltedHashFreenetStore.construct(storeDir, 
> "PUBKEY-store", 
pubKeyDatastore, random, maxStoreKeys,
> -                                     shutdownHook);
> +                             SaltedHashFreenetStore pubkeyDataFS = 
SaltedHashFreenetStore.construct(storeDir, "PUBKEY-store",
> +                                     pubKeyDatastore, random, maxStoreKeys, 
> shutdownHook);
>                               Logger.normal(this, "Initializing pubKey 
> Datacache");
>                               System.out.println("Initializing pubKey 
> Datacache (" + maxCacheKeys + " 
keys)");
>                               pubKeyDatacache = new PubkeyStore();
> -                             SaltedHashFreenetStore.construct(storeDir, 
> "PUBKEY-cache", 
pubKeyDatacache, random, maxCacheKeys,
> -                                     shutdownHook);
> +                             SaltedHashFreenetStore pubkeyCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "PUBKEY-cache",
> +                                     pubKeyDatacache, random, maxCacheKeys, 
> shutdownHook);
>  
>                               Logger.normal(this, "Initializing SSK 
> Datastore");
>                               System.out.println("Initializing SSK 
> Datastore");
>                               sskDatastore = new SSKStore(this);
> -                             SaltedHashFreenetStore.construct(storeDir, 
> "SSK-store", sskDatastore, 
random, maxStoreKeys,
> -                                     shutdownHook);
> +                             SaltedHashFreenetStore sskDataFS = 
SaltedHashFreenetStore.construct(storeDir, "SSK-store",
> +                                     sskDatastore, random, maxStoreKeys, 
> shutdownHook);
>                               Logger.normal(this, "Initializing SSK 
> Datacache");
>                               System.out.println("Initializing SSK Datacache 
> (" + maxCacheKeys + " 
keys)");
>                               sskDatacache = new SSKStore(this);
> -                             SaltedHashFreenetStore.construct(storeDir, 
> "SSK-cache", sskDatacache, 
random, maxCacheKeys,
> +                             SaltedHashFreenetStore sskCacheFS = 
SaltedHashFreenetStore.construct(storeDir, "SSK-cache",
> +                                     sskDatacache, random, maxCacheKeys,
>                                       shutdownHook);
> +                             
> +                             File migrationFile = new File(storeDir, 
> "migrated");
> +                             if (!migrationFile.exists()) {
> +                                     chkDataFS.migrationFrom(//
> +                                             new File(storeDir, "chk" + 
> suffix + ".store"), // 
> +                                             new File(storeDir, "chk" + 
> suffix + ".store.keys"));
> +                                     chkCacheFS.migrationFrom(//
> +                                             new File(storeDir, "chk" + 
> suffix + ".cache"), // 
> +                                             new File(storeDir, "chk" + 
> suffix + ".cache.keys"));
> +
> +                                     pubkeyDataFS.migrationFrom(//
> +                                             new File(storeDir, "pubkey" + 
> suffix + ".store"), // 
> +                                             new File(storeDir, "pubkey" + 
> suffix + ".store.keys"));
> +                                     pubkeyCacheFS.migrationFrom(//
> +                                             new File(storeDir, "pubkey" + 
> suffix + ".cache"), // 
> +                                             new File(storeDir, "pubkey" + 
> suffix + ".cache.keys"));
> +
> +                                     sskDataFS.migrationFrom(//
> +                                             new File(storeDir, "ssk" + 
> suffix + ".store"), // 
> +                                             new File(storeDir, "ssk" + 
> suffix + ".store.keys"));
> +                                     sskCacheFS.migrationFrom(//
> +                                             new File(storeDir, "ssk" + 
> suffix + ".cache"), // 
> +                                             new File(storeDir, "ssk" + 
> suffix + ".cache.keys"));
> +                                     migrationFile.createNewFile();
> +                             }
>                       } catch (IOException e) {
>                               System.err.println("Could not open store: " + 
> e);
>                               e.printStackTrace();
> 
> Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
> ===================================================================
> --- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
2008-05-26 09:34:05 UTC (rev 20096)
> +++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
2008-05-26 09:34:39 UTC (rev 20097)
> @@ -1376,4 +1376,47 @@
>               return storeSize;
>       }
>  
> +     // ------------- Migration
> +     public void migrationFrom(File storeFile, File keyFile) {
> +             try {
> +                     System.out.println("Migrating from " + storeFile);
> +
> +                     RandomAccessFile storeRAF = new 
> RandomAccessFile(storeFile, "r");
> +                     RandomAccessFile keyRAF = keyFile.exists() ? new 
RandomAccessFile(keyFile, "r") : null;
> +                     
> +                     byte[] header = new byte[headerBlockLength];
> +                     byte[] data = new byte[dataBlockLength];
> +                     byte[] key = new byte[fullKeyLength];
> +
> +                     long maxKey = storeRAF.length() / (headerBlockLength + 
> dataBlockLength);
> +                     for (int l = 0; true; l++) {
> +                             if (l % 1024 == 0)
> +                                     System.out.println(" key " + l + "/" + 
> maxKey);
> +                             
> +                             boolean keyRead = false;
> +                             storeRAF.readFully(header);
> +                             storeRAF.readFully(data);
> +                             try {
> +                                     if (keyRAF != null) {
> +                                             keyRAF.readFully(key);
> +                                             keyRead = true;
> +                                     }
> +                             } catch (IOException e) {
> +                             }
> +                             
> +                             try {
> +                                     StorableBlock b = 
> callback.construct(data, header, null, keyRead ? 
key : null);
> +                                     put(b, b.getRoutingKey(), 
> b.getFullKey(), data, header, true);
> +                             } catch (KeyVerifyException e) {
> +                                     System.out.println("kve at block " + l);
> +                             } catch (KeyCollisionException e) {
> +                                     System.out.println("kce at block " + l);
> +                             }
> +                     }
> +             } catch (EOFException eof) {
> +                     // done
> +             } catch (IOException e) {
> +                     e.printStackTrace();
> +             }
> +     }
>  }
> 
> _______________________________________________
> 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/20080528/d89ca3cd/attachment.pgp>

Reply via email to