On Thu, Sep 25, 2008 at 3:03 AM, Matthew Toseland
<toad at amphibian.dyndns.org> wrote:
> On Wednesday 24 September 2008 05:51, j16sdiz at freenetproject.org wrote:
>> Author: j16sdiz
>> Date: 2008-09-24 04:51:56 +0000 (Wed, 24 Sep 2008)
>> New Revision: 22789
>>
>> Modified:
>>    trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
>>    trunk/freenet/src/freenet/node/Node.java
>>    trunk/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
>> Log:
>> preallocate space for SaltedHashFreenetStore
>
> Is this the right place to do it? When exactly will it happen? During
> migration (offline), during startup (offline), when the size is increased
> from config (online) ??

it preallocate space for all size increase cases.

>>
>> Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
>> ===================================================================
>> --- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2008-09-23
> 23:46:32 UTC (rev 22788)
>> +++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2008-09-24
> 04:51:56 UTC (rev 22789)
>> @@ -710,6 +710,8 @@
>>  Node.storeDirectory=Store directory
>>  Node.storeDirectoryLong=Name of directory to put store files in
>>  Node.storeMaxMemTooHigh=Giving more than 80% of your ram to BDB is probably
> not what you want to do!
>> +Node.storePreallocate=Preallocate space for datastore
>> +Node.storePreallocateLong=Preallocate space for datastore
>>  Node.storeSize=Store size in bytes
>>  Node.storeSizeLong=Store size in bytes
>>  Node.storeType=Store type (LEAVE THIS ALONE)
>>
>> Modified: trunk/freenet/src/freenet/node/Node.java
>> ===================================================================
>> --- trunk/freenet/src/freenet/node/Node.java  2008-09-23 23:46:32 UTC (rev
> 22788)
>> +++ trunk/freenet/src/freenet/node/Node.java  2008-09-24 04:51:56 UTC (rev
> 22789)
>> @@ -505,6 +505,8 @@
>>       private static final int MIN_UPTIME_STORE_KEY = 40;
>>
>>       private volatile boolean isPRNGReady = false;
>> +
>> +     private boolean storePreallocate;
>>
>>       /**
>>        * Read all storable settings (identity etc) from the node file.
>> @@ -1604,6 +1606,28 @@
>>               maxStoreKeys = maxTotalKeys / 2;
>>               maxCacheKeys = maxTotalKeys - maxStoreKeys;
>>
>> +             nodeConfig.register("storePreallocate", true, sortOrder++, 
>> true,
> false, "Node.storePreallocate", "Node.storePreallocateLong",
>> +                             new BooleanCallback() {
>> +                                     @Override
>> +                    public Boolean get() {
>> +                         return storePreallocate;
>> +                    }
>> +
>> +                                     @Override
>> +                    public void set(Boolean val) throws
> InvalidConfigValueException, NodeNeedRestartException {
>> +                                             storePreallocate = val;
>> +                                             if 
>> (storeType.equals("salt-hash")) {
>> +                                                     
>> ((SaltedHashFreenetStore)
> chkDatastore.getStore()).setPreallocate(val);
>> +                                                     
>> ((SaltedHashFreenetStore)
> chkDatacache.getStore()).setPreallocate(val);
>> +                                                     
>> ((SaltedHashFreenetStore)
> pubKeyDatastore.getStore()).setPreallocate(val);
>> +                                                     
>> ((SaltedHashFreenetStore)
> pubKeyDatacache.getStore()).setPreallocate(val);
>> +                                                     
>> ((SaltedHashFreenetStore)
> sskDatastore.getStore()).setPreallocate(val);
>> +                                                     
>> ((SaltedHashFreenetStore)
> sskDatacache.getStore()).setPreallocate(val);
>> +                                             }
>> +                    }}
>> +             );
>> +             storePreallocate = nodeConfig.getBoolean("storePreallocate");
>> +
>>               if (storeType.equals("salt-hash")) {
>>                       initSaltHashFS(suffix);
>>               } else if (storeType.equals("bdb-index")) {
>> @@ -1744,32 +1768,32 @@
>>                       System.out.println("Initializing CHK Datastore (" + 
>> maxStoreKeys + "
> keys)");
>>                       chkDatastore = new CHKStore();
>>                       SaltedHashFreenetStore chkDataFS =
> SaltedHashFreenetStore.construct(storeDir, "CHK-store", chkDatastore,
>> -                             random, maxStoreKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook);
>> +                             random, maxStoreKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook, storePreallocate);
>>                       Logger.normal(this, "Initializing CHK Datacache");
>>                       System.out.println("Initializing CHK Datacache (" + 
>> maxCacheKeys + ':' +
> maxCacheKeys + " keys)");
>>                       chkDatacache = new CHKStore();
>>                       SaltedHashFreenetStore chkCacheFS =
> SaltedHashFreenetStore.construct(storeDir, "CHK-cache", chkDatacache,
>> -                             random, maxCacheKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook);
>> +                             random, maxCacheKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook, storePreallocate);
>>                       Logger.normal(this, "Initializing pubKey Datastore");
>>                       System.out.println("Initializing pubKey Datastore");
>>                       pubKeyDatastore = new PubkeyStore();
>>                       SaltedHashFreenetStore pubkeyDataFS =
> SaltedHashFreenetStore.construct(storeDir, "PUBKEY-store",
>> -                             pubKeyDatastore, random, maxStoreKeys, 
>> bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook);
>> +                             pubKeyDatastore, random, maxStoreKeys, 
>> bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook, storePreallocate);
>>                       Logger.normal(this, "Initializing pubKey Datacache");
>>                       System.out.println("Initializing pubKey Datacache (" + 
>> maxCacheKeys + "
> keys)");
>>                       pubKeyDatacache = new PubkeyStore();
>>                       SaltedHashFreenetStore pubkeyCacheFS =
> SaltedHashFreenetStore.construct(storeDir, "PUBKEY-cache",
>> -                             pubKeyDatacache, random, maxCacheKeys, 
>> bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook);
>> +                             pubKeyDatacache, random, maxCacheKeys, 
>> bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook, storePreallocate);
>>                       Logger.normal(this, "Initializing SSK Datastore");
>>                       System.out.println("Initializing SSK Datastore");
>>                       sskDatastore = new SSKStore(this);
>>                       SaltedHashFreenetStore sskDataFS =
> SaltedHashFreenetStore.construct(storeDir, "SSK-store", sskDatastore,
>> -                             random, maxStoreKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook);
>> +                             random, maxStoreKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook, storePreallocate);
>>                       Logger.normal(this, "Initializing SSK Datacache");
>>                       System.out.println("Initializing SSK Datacache (" + 
>> maxCacheKeys + "
> keys)");
>>                       sskDatacache = new SSKStore(this);
>>                       SaltedHashFreenetStore sskCacheFS =
> SaltedHashFreenetStore.construct(storeDir, "SSK-cache", sskDatacache,
>> -                             random, maxCacheKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook);
>> +                             random, maxCacheKeys, bloomFilterSizeInM,
> storeBloomFilterCounting, shutdownHook, storePreallocate);
>>
>>                       File migrationFile = new File(storeDir, "migrated");
>>                       if (!migrationFile.exists()) {
>>
>> Modified:
> trunk/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
>> ===================================================================
>> --- trunk/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
> 2008-09-23 23:46:32 UTC (rev 22788)
>> +++ trunk/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
> 2008-09-24 04:51:56 UTC (rev 22789)
>> @@ -79,16 +79,18 @@
>>       private long storeSize;
>>       private int generation;
>>       private int flags;
>> +
>> +     private boolean preallocate = true;
>>
>>       public static SaltedHashFreenetStore construct(File baseDir, String 
>> name,
> StoreCallback callback, Random random,
>> -             long maxKeys, int bloomFilterSize, boolean bloomCounting,
> SemiOrderedShutdownHook shutdownHook)
>> +             long maxKeys, int bloomFilterSize, boolean bloomCounting,
> SemiOrderedShutdownHook shutdownHook, boolean preallocate)
>>               throws IOException {
>>               return new SaltedHashFreenetStore(baseDir, name, callback, 
>> random,
> maxKeys, bloomFilterSize, bloomCounting,
>> -                     shutdownHook);
>> +                     shutdownHook, preallocate);
>>       }
>>
>>       private SaltedHashFreenetStore(File baseDir, String name, StoreCallback
> callback, Random random, long maxKeys,
>> -             int bloomFilterSize, boolean bloomCounting,
> SemiOrderedShutdownHook shutdownHook) throws IOException {
>> +             int bloomFilterSize, boolean bloomCounting,
> SemiOrderedShutdownHook shutdownHook, boolean preallocate) throws IOException
> {
>>               logMINOR = Logger.shouldLog(Logger.MINOR, this);
>>               logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
>>
>> @@ -107,6 +109,7 @@
>>               this.random = random;
>>               storeSize = maxKeys;
>>               this.bloomFilterSize = bloomFilterSize;
>> +             this.preallocate = preallocate;
>>
>>               lockManager = new LockManager();
>>
>> @@ -746,14 +749,54 @@
>>       }
>>
>>       /**
>> +      * Set preallocate storage space
>> +      * @param preallocate
>> +      */
>> +     public void setPreallocate(boolean preallocate) {
>> +             this.preallocate = preallocate;
>> +     }
>> +
>> +     /**
>>        * Change on disk store file size
>>        *
>>        * @param storeFileSize
>>        */
>>       private void setStoreFileSize(long storeFileSize) {
>>               try {
>> -                     metaRAF.setLength(Entry.METADATA_LENGTH * 
>> storeFileSize);
>> -                     hdRAF.setLength((headerBlockLength + dataBlockLength + 
>> hdPadding) *
> storeFileSize);
>> +                     long oldMetaLen = metaRAF.length();
>> +                     long oldHdLen = hdRAF.length();
>> +
>> +                     final long newMetaLen = Entry.METADATA_LENGTH * 
>> storeFileSize;
>> +                     final long newHdLen = (headerBlockLength + 
>> dataBlockLength + hdPadding)
> * storeFileSize;
>> +
>> +                     if (preallocate) {
>> +                             byte[] b = new byte[4096];
>> +                             ByteBuffer bf = ByteBuffer.wrap(b);
>> +
>> +                             // start from next 4KB boundary => align to 
>> x86 page size
>> +                             if (oldMetaLen % 4096 != 0)
>> +                                     oldMetaLen += 4096 - (oldMetaLen % 
>> 4096);
>> +                             if (oldHdLen % 4096 != 0)
>> +                                     oldHdLen += 4096 - (oldHdLen % 4096);
>> +
>> +                             // this may write excess the size, the 
>> setLength() would fix it
>> +                             while (oldMetaLen < newMetaLen) {
>> +                                     // never write random byte to meta 
>> data!
>> +                                     // this would screw up the isFree() 
>> function
>> +                                     bf.rewind();
>> +                                     metaFC.write(bf, oldMetaLen);
>> +                                     oldMetaLen += 4096;
>> +                             }
>> +                             while (oldHdLen < newHdLen) {
>> +                                     random.nextBytes(b);
>> +                                     bf.rewind();
>> +                                     hdFC.write(bf, oldHdLen);
>> +                                     oldHdLen += 4096;
>> +                             }
>> +                     }
>> +
>> +                     metaRAF.setLength(newMetaLen);
>> +                     hdRAF.setLength(newHdLen);
>>               } catch (IOException e) {
>>                       Logger.error(this, "error resizing store file", e);
>>               }
>> @@ -1686,5 +1729,5 @@
>>               } finally {
>>                       configLock.readLock().unlock();
>>               }
>> -    }
>> +     }
>>  }
>>
>> _______________________________________________
>> cvs mailing list
>> cvs at freenetproject.org
>> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>>
>>
>
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>

Reply via email to