On Sat, Aug 2, 2008 at 9:10 AM, Matthew Toseland <toad at amphibian.dyndns.org> wrote: > On Thursday 17 July 2008 14:38, j16sdiz at freenetproject.org wrote: >> 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 > > Please use a callback. The below is a rather messy layering violation. >
What kind of callback? Any example? >> >> 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(); >> } >> } >> >> _______________________________________________ >> 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 >