Author: j16sdiz
Date: 2008-05-02 10:10:12 +0000 (Fri, 02 May 2008)
New Revision: 19675
Modified:
trunk/freenet/src/freenet/crypt/SHA256.java
trunk/freenet/src/freenet/node/MemoryChecker.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
trunk/freenet/src/freenet/support/OOMHandler.java
trunk/freenet/src/freenet/support/OOMHook.java
Log:
alternative low memory / out of memory handling
Modified: trunk/freenet/src/freenet/crypt/SHA256.java
===================================================================
--- trunk/freenet/src/freenet/crypt/SHA256.java 2008-05-02 10:09:13 UTC (rev
19674)
+++ trunk/freenet/src/freenet/crypt/SHA256.java 2008-05-02 10:10:12 UTC (rev
19675)
@@ -44,6 +44,8 @@
import freenet.node.Node;
import freenet.node.NodeInitException;
import freenet.support.Logger;
+import freenet.support.OOMHandler;
+import freenet.support.OOMHook;
import freenet.support.io.Closer;
/**
@@ -105,7 +107,7 @@
String algo = md256.getAlgorithm();
if(!(algo.equals("SHA-256") || algo.equals("SHA256")))
throw new IllegalArgumentException("Should be SHA-256
but is " + algo);
- if (digests.size() > 16) // don't cache too many of them
+ if (digests.size() > 16 || noCache) // don't cache too many of
them
return;
md256.reset();
digests.add(md256);
@@ -121,4 +123,20 @@
public static int getDigestLength() {
return HASH_SIZE;
}
+
+ private static boolean noCache = false;
+
+ static {
+ OOMHandler.addOOMHook(new OOMHook() {
+ public void handleLowMemory() throws Exception {
+ digests.clear();
+ noCache = true;
+ }
+
+ public void handleOutOfMemory() throws Exception {
+ digests.clear();
+ noCache = true;
+ }
+ });
+ }
}
Modified: trunk/freenet/src/freenet/node/MemoryChecker.java
===================================================================
--- trunk/freenet/src/freenet/node/MemoryChecker.java 2008-05-02 10:09:13 UTC
(rev 19674)
+++ trunk/freenet/src/freenet/node/MemoryChecker.java 2008-05-02 10:10:12 UTC
(rev 19675)
@@ -4,6 +4,7 @@
package freenet.node;
import freenet.support.Logger;
+import freenet.support.OOMHandler;
import freenet.support.SizeUtil;
public class MemoryChecker implements Runnable {
@@ -42,6 +43,11 @@
Logger.normal(this, "Memory in use:
"+SizeUtil.formatSize((r.totalMemory()-r.freeMemory())));
+ if (r.freeMemory() < 4096 * 1024 * 1024) { // free memory < 8 MB
+ Logger.error(this, "memory too low, trying to free
some");
+ OOMHandler.lowMemory();
+ }
+
int sleeptime = aggressiveGCModificator;
if(sleeptime <= 0) { // We are done
ps.queueTimedJob(this, 120 * 250); // 30 sec
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2008-05-02 10:09:13 UTC (rev
19674)
+++ trunk/freenet/src/freenet/node/Node.java 2008-05-02 10:10:12 UTC (rev
19675)
@@ -124,7 +124,7 @@
/**
* @author amphibian
*/
-public class Node implements TimeSkewDetectorCallback, GetPubkey, OOMHook {
+public class Node implements TimeSkewDetectorCallback, GetPubkey {
private static boolean logMINOR;
@@ -1604,8 +1604,6 @@
e.printStackTrace();
throw new
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not
create Updater: "+e);
}
-
- OOMHandler.addOOMHook(this);
Logger.normal(this, "Node constructor completed");
System.out.println("Node constructor completed");
@@ -3306,23 +3304,4 @@
public void setDispatcherHook(NodeDispatcherCallback cb) {
this.dispatcher.setHook(cb);
}
-
- /**
- * Free some memory
- */
- public void handleOOM() throws Exception {
- if (cachedPubKeys != null) {
- Object value;
- do {
- value = cachedPubKeys.popKey();
- } while (value != null);
- }
- if (recentlyCompletedIDs != null) {
- synchronized (recentlyCompletedIDs) {
- // half it size
- while (recentlyCompletedIDs.size() >
MAX_RECENTLY_COMPLETED_IDS / 2)
- recentlyCompletedIDs.pop();
- }
- }
- }
}
Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-05-02
10:09:13 UTC (rev 19674)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-05-02
10:10:12 UTC (rev 19675)
@@ -2239,15 +2239,30 @@
bf.get(data);
}
- public void handleOOM() throws Exception {
- if (storeRAF != null)
- storeRAF.getFD().sync();
- if (keysRAF != null)
- keysRAF.getFD().sync();
- if (lruRAF != null)
- lruRAF.getFD().sync();
+ public void handleLowMemory() throws Exception {
+ // Flush all
+ if (storeFC != null)
+ storeFC.force(true);
+ if (keysFC != null)
+ keysFC.force(true);
+ if (lruFC != null)
+ lruFC.force(true);
}
+ public void handleOutOfMemory() throws Exception {
+ // database likely to be corrupted,
+ // reconstruct it just in case
+ reconstructFile.createNewFile();
+
+ // Flush all
+ if (storeFC != null)
+ storeFC.force(true);
+ if (keysFC != null)
+ keysFC.force(true);
+ if (lruFC != null)
+ lruFC.force(true);
+ }
+
/**
* @return
*/
Modified: trunk/freenet/src/freenet/support/OOMHandler.java
===================================================================
--- trunk/freenet/src/freenet/support/OOMHandler.java 2008-05-02 10:09:13 UTC
(rev 19674)
+++ trunk/freenet/src/freenet/support/OOMHandler.java 2008-05-02 10:10:12 UTC
(rev 19675)
@@ -33,6 +33,30 @@
}
}
+ /**
+ * Call this when running low of memory
+ */
+ public static void lowMemory() {
+ System.gc();
+ System.runFinalization();
+
+ // iterate all oom hooks
+ Iterator it = oomHooks.iterator();
+ while (it.hasNext()) {
+ OOMHook hook = ((OOMHook) it.next());
+ if (hook != null) {
+ try {
+ hook.handleLowMemory();
+ } catch (Throwable t) {
+ //ignore
+ }
+ }
+ }
+
+ System.gc();
+ System.runFinalization();
+ }
+
public static void handleOOM(OutOfMemoryError e) {
if (isOOM) {
Logger.error(null, "Double OOM", e);
@@ -51,20 +75,18 @@
System.gc();
System.runFinalization();
-
+
// iterate all oom hooks
Iterator it = oomHooks.iterator();
while (it.hasNext()) {
OOMHook hook = ((OOMHook) it.next());
if (hook != null) {
try {
- hook.handleOOM();
+ hook.handleOutOfMemory();
} catch (Throwable t) {
//ignore
}
}
-
- System.gc();
}
System.gc();
Modified: trunk/freenet/src/freenet/support/OOMHook.java
===================================================================
--- trunk/freenet/src/freenet/support/OOMHook.java 2008-05-02 10:09:13 UTC
(rev 19674)
+++ trunk/freenet/src/freenet/support/OOMHook.java 2008-05-02 10:10:12 UTC
(rev 19675)
@@ -5,9 +5,14 @@
*/
public interface OOMHook {
/**
- * Handle OutOfMemoryError
+ * Handle running low of memory
*
* (try to free some cache, save the files, etc).
*/
- void handleOOM() throws Exception;
+ void handleLowMemory() throws Exception;
+
+ /**
+ * Handle running out of memory
+ */
+ void handleOutOfMemory() throws Exception;
}