Author: j16sdiz
Date: 2008-07-17 13:38:25 +0000 (Thu, 17 Jul 2008)
New Revision: 21168

Modified:
   branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties
   branches/saltedhashstore/freenet/src/freenet/node/Node.java
   
branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
Log:
show user alert when rebuilding filter / resizing

Modified: 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties    
    2008-07-17 13:38:00 UTC (rev 21167)
+++ 
branches/saltedhashstore/freenet/src/freenet/l10n/freenet.l10n.en.properties    
    2008-07-17 13:38:25 UTC (rev 21168)
@@ -895,6 +895,11 @@
 PproxyToadlet.unloadPluginWithName=Are you sure you wish to unload ${name}?
 PproxyToadlet.unloadPurge=Remove plugin from cache
 PproxyToadlet.versionTitle=Version
+SaltedHashFreenetStore.shortResizeProgress=Datastore(${name}) resize in 
progress: ${processed}/${total}
+SaltedHashFreenetStore.shortRebuildProgress=Datastore(${name}) maintenance in 
progress: ${processed}/${total}
+SaltedHashFreenetStore.longResizeProgress=Datastore(${name}) resize in 
progress: ${processed}/${total}. The node may be a little bit slower then usual 
during the process. Avoid restarting the node during this.
+SaltedHashFreenetStore.longRebuildProgress=Datastore(${name}) maintenance in 
progress: ${processed}/${total}. The node may be a little bit slower then usual 
during the process. Avoid restarting the node during this.
+SaltedHashFreenetStore.cleanerAlertTitle=Datastore maintenance task running 
 QueueToadlet.DUinProgress=Directory uploads in progress (${size})
 QueueToadlet.DinProgress=Downloads in progress (${size})
 QueueToadlet.UinProgress=Uploads in progress (${size})

Modified: branches/saltedhashstore/freenet/src/freenet/node/Node.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/node/Node.java 2008-07-17 
13:38:00 UTC (rev 21167)
+++ branches/saltedhashstore/freenet/src/freenet/node/Node.java 2008-07-17 
13:38:25 UTC (rev 21168)
@@ -1354,34 +1354,32 @@
                                System.out.println("Initializing CHK Datastore 
(" + maxStoreKeys + " keys)");
                                chkDatastore = new CHKStore();
                                SaltedHashFreenetStore chkDataFS = 
SaltedHashFreenetStore.construct(storeDir, "CHK-store",
-                                       chkDatastore, random, maxStoreKeys, 
0x10000000, shutdownHook);
+                                       chkDatastore, this, maxStoreKeys, 
0x10000000, shutdownHook);
                                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, 
0x10000000, shutdownHook);
-
+                                       chkDatacache, this, maxCacheKeys, 
0x10000000, shutdownHook);
                                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, 
0x10000000, shutdownHook);
+                                       pubKeyDatastore, this, maxStoreKeys, 
0x10000000, shutdownHook);
                                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, 
0x10000000, shutdownHook);
-
+                                       pubKeyDatacache, this, maxCacheKeys, 
0x10000000, shutdownHook);
                                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, 
0x10000000, shutdownHook);
+                                       sskDatastore, this, maxStoreKeys, 
0x10000000, shutdownHook);
                                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, 
0x10000000, shutdownHook);
+                                       sskDatacache, this, maxCacheKeys, 
0x10000000, shutdownHook);

                                File migrationFile = new File(storeDir, 
"migrated");
                                if (!migrationFile.exists()) {

Modified: 
branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
   2008-07-17 13:38:00 UTC (rev 21167)
+++ 
branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java
   2008-07-17 13:38:25 UTC (rev 21168)
@@ -14,7 +14,6 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
-import java.util.Random;
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
@@ -29,13 +28,17 @@
 import org.tanukisoftware.wrapper.WrapperManager;

 import freenet.keys.KeyVerifyException;
+import freenet.l10n.L10n;
+import freenet.node.Node;
 import freenet.node.SemiOrderedShutdownHook;
+import freenet.node.useralerts.UserAlert;
 import freenet.store.FreenetStore;
 import freenet.store.KeyCollisionException;
 import freenet.store.StorableBlock;
 import freenet.store.StoreCallback;
 import freenet.support.BloomFilter;
 import freenet.support.Fields;
+import freenet.support.HTMLNode;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.io.FileUtil;
@@ -70,18 +73,21 @@
        private final int routeKeyLength;
        private final int fullKeyLength;
        private final int dataBlockLength;
-       private final Random random;
+       private final Node node;
+       
        private long storeSize;
        private int generation;
        private int flags;

-       public static SaltedHashFreenetStore construct(File baseDir, String 
name, StoreCallback callback, Random random,
-               long maxKeys, int bloomFilterSize, SemiOrderedShutdownHook 
shutdownHook) throws IOException {
-               return new SaltedHashFreenetStore(baseDir, name, callback, 
random, maxKeys, bloomFilterSize, shutdownHook);
+       public static SaltedHashFreenetStore construct(File baseDir, String 
name, StoreCallback callback, Node node,
+               long maxKeys, int bloomFilterSize, SemiOrderedShutdownHook 
shutdownHook)
+               throws IOException {
+               return new SaltedHashFreenetStore(baseDir, name, callback, 
node, maxKeys, bloomFilterSize, shutdownHook);
        }

-       private SaltedHashFreenetStore(File baseDir, String name, StoreCallback 
callback, Random random, long maxKeys,
-               int bloomFilterSize, SemiOrderedShutdownHook shutdownHook) 
throws IOException {
+       private SaltedHashFreenetStore(File baseDir, String name, StoreCallback 
callback, Node node, long maxKeys,
+               int bloomFilterSize, SemiOrderedShutdownHook shutdownHook)
+               throws IOException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                logDEBUG = Logger.shouldLog(Logger.DEBUG, this);

@@ -95,7 +101,7 @@
                fullKeyLength = callback.fullKeyLength();
                dataBlockLength = callback.dataLength();

-               this.random = random;
+               this.node = node;
                storeSize = maxKeys;
                this.bloomFilterSize = bloomFilterSize;

@@ -454,7 +460,7 @@

                private ByteBuffer toMetaDataBuffer() {
                        ByteBuffer out = ByteBuffer.allocate(METADATA_LENGTH);
-                       cipherManager.encrypt(this, random);
+                       cipherManager.encrypt(this, node.random);

                        out.put(getDigestedRoutingKey());
                        out.put(dataEncryptIV);
@@ -661,7 +667,7 @@
         * </ul>
         */
        private void writeEntry(Entry entry, long offset) throws IOException {
-               cipherManager.encrypt(entry, random);
+               cipherManager.encrypt(entry, node.random);

                ByteBuffer bf = entry.toMetaDataBuffer();
                do {
@@ -759,7 +765,7 @@
                if (!configFile.exists()) {
                        // create new
                        byte[] newsalt = new byte[0x10];
-                       random.nextBytes(newsalt);
+                       node.random.nextBytes(newsalt);
                        cipherManager = new CipherManager(newsalt);

                        writeConfigFile();
@@ -852,6 +858,9 @@
                 * How often the clean should run
                 */
                private static final int CLEANER_PERIOD = 5 * 60 * 1000; // 5 
minutes
+               
+               private volatile boolean isRebuilding;
+               private volatile boolean isResizing;

                public Cleaner() {
                        super("Store-" + name + "-Cleaner", 
NativeThread.LOW_PRIORITY, false);
@@ -862,10 +871,88 @@
                @Override
                public void run() {
                        super.run();
+                       
                        try {
+                               while (node.clientCore == null) {
+                                       Thread.sleep(1000);
+                               }       
                                Thread.sleep((int)(CLEANER_PERIOD / 2 + 
CLEANER_PERIOD * Math.random()));
                        } catch (InterruptedException e){}
+                       
+                       node.clientCore.alerts.register(new UserAlert() {
+                               public String anchor() {
+                                       return "store-cleaner-" + name;
+                               }

+                               public String dismissButtonText() {
+                                       return L10n.getString("UserAlert.hide");
+                               }
+
+                               public HTMLNode getHTMLText() {
+                                       return new HTMLNode("#", getText());
+                               }
+
+                               public short getPriorityClass() {
+                                       return UserAlert.ERROR;
+                               }
+
+                               public String getShortText() {
+                                       if (isResizing)
+                                               return 
L10n.getString("SaltedHashFreenetStore.shortResizeProgress", //
+                                               new String[] { "name", 
"processed", "total" },// 
+                                                       new String[] { name, 
(entriesTotal - entriesLeft) + "", entriesTotal + "" });
+                                       else
+                                               return 
L10n.getString("SaltedHashFreenetStore.shortRebuildProgress", //
+                                                       new String[] { "name", 
"processed", "total" },// 
+                                                       new String[] { name, 
(entriesTotal - entriesLeft) + "", entriesTotal + "" });
+                               }
+
+                               public String getText() {
+                                       if (isResizing)
+                                               return 
L10n.getString("SaltedHashFreenetStore.longResizeProgress", //
+                                                       new String[] { "name", 
"processed", "total" },// 
+                                                       new String[] { name, 
(entriesTotal - entriesLeft) + "", entriesTotal + "" });
+                                       else
+                                               return 
L10n.getString("SaltedHashFreenetStore.longRebuildProgress", //
+                                                       new String[] { "name", 
"processed", "total" },// 
+                                                       new String[] { name, 
(entriesTotal - entriesLeft) + "", entriesTotal + "" });
+                               }
+
+                               public String getTitle() {
+                                       return 
L10n.getString("SaltedHashFreenetStore.cleanerAlertTitle", //
+                                               new String[] { "name" }, //
+                                               new String[] { name });
+                               }
+
+                               public Object getUserIdentifier() {
+                                       return null;
+                               }
+
+                               public boolean isValid() {
+                                       return isRebuilding || isResizing;
+                               }
+                               
+                               public void isValid(boolean validity) {
+                                       // Ignore
+                               }
+
+                               public void onDismiss() {
+                                       // Ignore
+                               }
+
+                               public boolean shouldUnregisterOnDismiss() {
+                                       return true;
+                               }
+
+                               public boolean userCanDismiss() {
+                                       return true;
+                               }
+
+                               public boolean isEventNotification() {
+                                       return false;
+                               }
+                       });
+                       
                        int loop = 0;
                        while (!shutdown) {
                                loop++;
@@ -882,8 +969,10 @@

                                        if (_prevStoreSize != 0 && 
cleanerGlobalLock.tryLock()) {
                                                try {
+                                                       isResizing = true;
                                                        
resizeStore(_prevStoreSize, true);
                                                } finally {
+                                                       isResizing = false;
                                                        
cleanerGlobalLock.unlock();
                                                }
                                        }
@@ -897,8 +986,10 @@
                                        }
                                        if (_rebuildBloom && prevStoreSize == 0 
&& cleanerGlobalLock.tryLock()) {
                                                try {
+                                                       isRebuilding = true;
                                                        rebuildBloom(true);
                                                } finally {
+                                                       isRebuilding = false;
                                                        
cleanerGlobalLock.unlock();
                                                }
                                        }


Reply via email to