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;
 }


Reply via email to