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?

Is this always during startup?
> 
> >>
> >> 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
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: not available
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20080925/1f7f7d3f/attachment.pgp>

Reply via email to