On Thu, Sep 25, 2008 at 9:23 AM, Matthew Toseland
<toad at amphibian.dyndns.org> wrote:
> On Thursday 25 September 2008 01:09, Daniel Cheng wrote:
>> 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.
>
> Including migration and new store?

yes.

> Is this always during startup?

no, not always.

>>
>> >>
>> >> 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
>> >
>> _______________________________________________
>> Devl mailing list
>> Devl at freenetproject.org
>> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>>
>>
>
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>

Reply via email to