I know we had a brief discussion on -tech where this was decided to be
unnecessary, but I coded it for myself and thought I would throw it
out here so you guys can see what I was trying to accomplish.
This allows me to only use 5% of my 18 gig datastore for cache instead
of 9 gigs like the default. This is an expert config option and it
defaults to 50% so users would have the same ratio unless they enabled
expert and changed the value. Even then they couldn't reduce their
specialized store, only the cache.
--- Node.java (revision 13327)
+++ Node.java (working copy)
@@ -268,6 +268,8 @@
static final int sizePerKey = CHKBlock.DATA_LENGTH +
CHKBlock.TOTAL_HEADERS_LENGTH +
DSAPublicKey.PADDED_SIZE + SSKBlock.DATA_LENGTH +
SSKBlock.TOTAL_HEADERS_LENGTH;
+ //Percent of the datastore to use for cache of popular data.
+ private int cachePercent;
/** The maximum number of keys stored in each of the datastores,
cache and store combined. */
private long maxTotalKeys;
private long maxCacheKeys;
@@ -1069,6 +1071,29 @@
});
+ nodeConfig.register("cachePercent", "50", sortOrder++, true,
false,
"Node.cachePercentStore", "Node.cachePercenStoretLong",
+ new IntCallback() {
+
+ public int get() {
+ return cachePercent;
+ }
+
+ public void set(int val) throws
InvalidConfigValueException {
+ if((val < 5) || (val > 50))
+ throw new
InvalidConfigValueException("Percent must be between
5 and 50");
+ cachePercent = val;
+ }
+
+ });
+
+ cachePercent = nodeConfig.getInt("cachePercent");
+
+ if((cachePercent < 5) || (cachePercent > 50)){ //Make sure the
user didn't bork the config file.
+ System.out.println("Found cachePercent lower then 5 or
greater
than 50: " + cachePercent);
+ cachePercent = 50; // 50 is a good safe number, it is
the default.
+ System.out.println("Reset cachePercent to " +
cachePercent);
+ }
+
nodeConfig.register("storeSize", "1G", sortOrder++, false, true,
"Node.storeSize", "Node.storeSizeLong",
new LongCallback() {
@@ -1077,7 +1102,7 @@
}
public void set(long storeSize) throws
InvalidConfigValueException {
- if((storeSize < 0) ||
(storeSize < (32 * 1024 * 1024)))
+ if((storeSize < 0) ||
(storeSize < (32 * 1024 * 1024))) //
totally arbitrary minimum!
throw new
InvalidConfigValueException(l10n("invalidStoreSize"));
long newMaxStoreKeys =
storeSize / sizePerKey;
if(newMaxStoreKeys ==
maxTotalKeys) return;
@@ -1085,8 +1110,8 @@
synchronized(Node.this) {
maxTotalDatastoreSize =
storeSize;
maxTotalKeys =
newMaxStoreKeys;
- maxStoreKeys =
maxTotalKeys / 2;
- maxCacheKeys =
maxTotalKeys - maxStoreKeys;
+ maxCacheKeys =
((maxTotalKeys * cachePercent) / 100);
+ maxStoreKeys =
maxTotalKeys - maxCacheKeys;
}
try {
chkDatastore.setMaxKeys(maxStoreKeys, storeForceBigShrinks);
@@ -1133,10 +1158,10 @@
String msg = "Could not find or create datastore
directory";
throw new NodeInitException(EXIT_STORE_OTHER, msg);
}
-
- maxStoreKeys = maxTotalKeys / 2;
- maxCacheKeys = maxTotalKeys - maxStoreKeys;
+ maxCacheKeys = ((maxTotalKeys * cachePercent) / 100);
+ maxStoreKeys = maxTotalKeys - maxCacheKeys;
+
// Setup datastores
// First, global settings
--
I may disagree with what you have to say, but I shall defend, to the
death, your right to say it. - Voltaire
Those who would give up Liberty, to purchase temporary Safety, deserve
neither Liberty nor Safety. - Ben Franklin