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;