Author: zothar
Date: 2007-03-18 17:26:36 +0000 (Sun, 18 Mar 2007)
New Revision: 12205

Modified:
   trunk/freenet/src/freenet/node/Node.java
Log:
Now reject inserts/requests on low free heap memory.  Thresholds may need 
tuning.

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-03-18 15:55:31 UTC (rev 
12204)
+++ trunk/freenet/src/freenet/node/Node.java    2007-03-18 17:26:36 UTC (rev 
12205)
@@ -23,6 +23,7 @@
 import java.net.MalformedURLException;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
+import java.text.DecimalFormat;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -103,6 +104,7 @@
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
 import freenet.support.ShortBuffer;
+import freenet.support.SizeUtil;
 import freenet.support.SimpleFieldSet;
 import freenet.support.TimeUtil;
 import freenet.support.TokenBucket;
@@ -186,6 +188,12 @@
        // Disabled to prevent long pauses every 30 seconds.
        static int aggressiveGCModificator = -1 /*250*/;

+       /** Minimum free heap memory bytes required to accept a request 
(perhaps fewer OOMs this way) */
+       public static final long MIN_FREE_HEAP_BYTES_FOR_ROUTING_SUCCESS = 3L * 
1024 * 1024;  // 3 MiB
+       
+       /** Minimum free heap memory percentage required to accept a request 
(perhaps fewer OOMs this way) */
+       public static final double MIN_FREE_HEAP_PERCENT_FOR_ROUTING_SUCCESS = 
0.01;  // 1%
+       
        /** If true, local requests and inserts aren't cached.
         * This opens up a glaring vulnerability; connected nodes
         * can then probe the store, and if the node doesn't have the
@@ -1897,6 +1905,20 @@
                        return "Insufficient input bandwidth";
                }

+               Runtime r = Runtime.getRuntime();
+               long maxHeapMemory = r.maxMemory();
+               long freeHeapMemory = r.freeMemory();
+               if(freeHeapMemory < MIN_FREE_HEAP_BYTES_FOR_ROUTING_SUCCESS) {
+                       pInstantRejectIncoming.report(1.0);
+                       return "<MIN_FREE_HEAP_BYTES_FOR_ROUTING_SUCCESS 
("+SizeUtil.formatSize(freeHeapMemory, false)+" of 
"+SizeUtil.formatSize(maxHeapMemory, false)+')';
+               }
+               double percentFreeHeapMemoryOfMax = ((double) freeHeapMemory) / 
((double) maxHeapMemory);
+               if(percentFreeHeapMemoryOfMax < 
MIN_FREE_HEAP_PERCENT_FOR_ROUTING_SUCCESS) {
+                       pInstantRejectIncoming.report(1.0);
+                       DecimalFormat fix3p1pct = new DecimalFormat("##0.0%");
+                       return "<MIN_FREE_HEAP_PERCENT_FOR_ROUTING_SUCCESS 
("+SizeUtil.formatSize(freeHeapMemory, false)+" of 
"+SizeUtil.formatSize(maxHeapMemory, false)+" 
("+fix3p1pct.format(percentFreeHeapMemoryOfMax)+"))";
+               }
+
                synchronized(this) {
                        if(logMINOR) Logger.minor(this, "Accepting request?");
                        lastAcceptedRequest = now;


Reply via email to