Author: toad
Date: 2005-11-18 01:04:54 +0000 (Fri, 18 Nov 2005)
New Revision: 7552
Modified:
trunk/freenet/src/freenet/client/FailureCodeTracker.java
trunk/freenet/src/freenet/client/InserterException.java
trunk/freenet/src/freenet/node/InsertSender.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerManager.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
trunk/freenet/src/freenet/node/Version.java
Log:
188:
Various fixes etc.
Plus, Big New Experimental Feature:
Compress a node's specialization according to its probability of returning a
RejectedOverload.
Modified: trunk/freenet/src/freenet/client/FailureCodeTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/FailureCodeTracker.java 2005-11-17
23:56:37 UTC (rev 7551)
+++ trunk/freenet/src/freenet/client/FailureCodeTracker.java 2005-11-18
01:04:54 UTC (rev 7552)
@@ -1,6 +1,8 @@
package freenet.client;
+import java.util.Collection;
import java.util.HashMap;
+import java.util.Iterator;
/**
* Essentially a map of integer to incrementible integer.
@@ -22,4 +24,19 @@
i.x++;
}
+ public synchronized String toVerboseString() {
+ StringBuffer sb = new StringBuffer();
+ Collection values = map.values();
+ Iterator i = values.iterator();
+ while(i.hasNext()) {
+ Integer x = (Integer) i.next();
+ Item val = (Item) map.get(x);
+ sb.append(x);
+ sb.append('=');
+ sb.append(val.x);
+ sb.append('\n');
+ }
+ return sb.toString();
+ }
+
}
Modified: trunk/freenet/src/freenet/client/InserterException.java
===================================================================
--- trunk/freenet/src/freenet/client/InserterException.java 2005-11-17
23:56:37 UTC (rev 7551)
+++ trunk/freenet/src/freenet/client/InserterException.java 2005-11-18
01:04:54 UTC (rev 7552)
@@ -9,9 +9,9 @@
public class InserterException extends Exception {
private static final long serialVersionUID = -1106716067841151962L;
- final int mode;
+ public final int mode;
/** For collection errors */
- final FailureCodeTracker errorCodes;
+ public final FailureCodeTracker errorCodes;
/** If a non-serious error, the URI */
public final FreenetURI uri;
Modified: trunk/freenet/src/freenet/node/InsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/InsertSender.java 2005-11-17 23:56:37 UTC
(rev 7551)
+++ trunk/freenet/src/freenet/node/InsertSender.java 2005-11-18 01:04:54 UTC
(rev 7552)
@@ -82,7 +82,7 @@
if(htl == 0) {
// Send an InsertReply back
- finish(SUCCESS);
+ finish(SUCCESS, null);
return;
}
@@ -100,7 +100,7 @@
if(next == null) {
// Backtrack
- finish(ROUTE_NOT_FOUND);
+ finish(ROUTE_NOT_FOUND, null);
return;
}
Logger.minor(this, "Routing insert to "+next);
@@ -142,7 +142,7 @@
if(msg == null || msg.getSpec() == DMT.FNPRejectedOverload) {
// Overload... hmmmm - propagate error back to source
Logger.error(this, "Propagating "+msg+" back to source on
"+this);
- finish(REJECTED_OVERLOAD);
+ finish(REJECTED_OVERLOAD, next);
return;
}
@@ -206,13 +206,13 @@
// Fairly serious problem
Logger.error(this, "Timeout after Accepted in insert");
// Treat as rejected-overload
- finish(REJECTED_OVERLOAD);
+ finish(REJECTED_OVERLOAD, next);
return;
}
if(msg.getSpec() == DMT.FNPRejectedOverload || msg.getSpec() ==
DMT.FNPRejectedTimeout) {
Logger.minor(this, "Rejected due to overload");
- finish(REJECTED_OVERLOAD);
+ finish(REJECTED_OVERLOAD, next);
return;
}
@@ -267,17 +267,17 @@
if(msg.getSpec() != DMT.FNPInsertReply) {
Logger.error(this, "Unknown reply: "+msg);
- finish(INTERNAL_ERROR);
+ finish(INTERNAL_ERROR, next);
}
// Our task is complete
- finish(SUCCESS);
+ finish(SUCCESS, next);
return;
}
} catch (Throwable t) {
Logger.error(this, "Caught "+t, t);
if(status == NOT_FINISHED)
- finish(INTERNAL_ERROR);
+ finish(INTERNAL_ERROR, null);
} finally {
node.completed(uid);
node.removeInsertSender(myKey, origHTL, this);
@@ -298,7 +298,7 @@
}
}
- private void finish(int code) {
+ private void finish(int code, PeerNode next) {
Logger.minor(this, "Finished: "+code+" on "+this, new
Exception("debug"));
if(status != NOT_FINISHED)
throw new IllegalStateException("finish() called with "+code+"
when was already "+status);
@@ -314,10 +314,13 @@
}
}
- if(status == REJECTED_OVERLOAD)
+ if(status == REJECTED_OVERLOAD) {
node.getInsertThrottle().requestRejectedOverload();
- else if(status == SUCCESS || status == ROUTE_NOT_FOUND)
+ next.rejectedOverload();
+ } else if(status == SUCCESS || status == ROUTE_NOT_FOUND) {
node.getInsertThrottle().requestCompleted(System.currentTimeMillis() -
startTime);
+ next.didNotRejectOverload();
+ }
synchronized(this) {
notifyAll();
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2005-11-17 23:56:37 UTC (rev
7551)
+++ trunk/freenet/src/freenet/node/Node.java 2005-11-18 01:04:54 UTC (rev
7552)
@@ -285,7 +285,7 @@
filenamesPrefix = prefix;
this.overrideIPAddress = overrideIP;
try {
- datastore = new
BaseFreenetStore(prefix+"freenet-"+portNumber,1024);
+ datastore = new
BaseFreenetStore(prefix+"freenet-"+portNumber,16384); // 512MB
} catch (FileNotFoundException e1) {
Logger.error(this, "Could not open datastore: "+e1, e1);
System.exit(EXIT_STORE_FILE_NOT_FOUND);
Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java 2005-11-17 23:56:37 UTC
(rev 7551)
+++ trunk/freenet/src/freenet/node/PeerManager.java 2005-11-18 01:04:54 UTC
(rev 7552)
@@ -254,7 +254,7 @@
for(int i=0;i<peers.length;i++) {
PeerNode p = peers[i];
if(!p.isConnected()) continue;
- double diff = distance(p.getLocation().getValue(), loc);
+ double diff = distance(p, loc);
if(diff < bestDiff) {
best = p;
bestDiff = diff;
@@ -262,7 +262,15 @@
}
return best;
}
-
+
+ static double distance(PeerNode p, double loc) {
+ double d = distance(p.getLocation().getValue(), loc);
+ double pSummaryFailure = p.getPRejectedOverload();
+ double denom = 1.0 - pSummaryFailure;
+ if(denom == 0.0) denom = 0.000001;
+ return d / denom;
+ }
+
/**
* Distance between two locations.
*/
@@ -295,7 +303,7 @@
if(!p.isConnected()) continue;
count++;
any = p;
- double diff = distance(p.getLocation().getValue(), loc);
+ double diff = distance(p, loc);
if((!ignoreSelf) && diff > maxDiff) continue;
if(diff < bestDiff) {
best = p;
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2005-11-17 23:56:37 UTC
(rev 7551)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2005-11-18 01:04:54 UTC
(rev 7552)
@@ -29,6 +29,7 @@
import freenet.support.HexUtil;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
+import freenet.support.math.BootstrappingDecayingRunningAverage;
import freenet.support.math.RunningAverage;
import freenet.support.math.SimpleRunningAverage;
@@ -149,6 +150,11 @@
/** The time at which we last completed a connection setup. */
private long connectedTime;
+
+ /** The probability of the node rejecting a request because of
+ * overload, or of it timing out etc.
+ */
+ private final RunningAverage pRejectOverload;
/**
* Create a PeerNode from a SimpleFieldSet containing a
@@ -240,6 +246,9 @@
decrementHTLAtMaximum = node.random.nextFloat() <
Node.DECREMENT_AT_MAX_PROB;
decrementHTLAtMinimum = node.random.nextFloat() <
Node.DECREMENT_AT_MIN_PROB;
+
+ // FIXME maybe a simple binary RA would be better?
+ pRejectOverload = new SimpleRunningAverage(100, 0.05);
}
private void randomizeMaxTimeBetweenPacketSends() {
@@ -917,4 +926,24 @@
public int hashCode() {
return hashCode;
}
+
+ /**
+ * Record the fact that the node rejected a request due to
+ * overload (or timed out etc).
+ */
+ public void rejectedOverload() {
+ pRejectOverload.report(1.0);
+ }
+
+ /**
+ * Record the fact that the node did not reject a request
+ * due to overload.
+ */
+ public void didNotRejectOverload() {
+ pRejectOverload.report(0.0);
+ }
+
+ public double getPRejectedOverload() {
+ return pRejectOverload.currentValue();
+ }
}
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-17
23:56:37 UTC (rev 7551)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-18
01:04:54 UTC (rev 7552)
@@ -229,6 +229,9 @@
System.out.println("Error: "+e.getMessage());
if(e.uri != null)
System.out.println("URI would have been: "+e.uri);
+ if(e.mode == e.FATAL_ERRORS_IN_BLOCKS || e.mode ==
e.TOO_MANY_RETRIES_IN_BLOCKS) {
+ System.out.println("Splitfile-specific
error:\n"+e.errorCodes.toVerboseString());
+ }
return;
}
@@ -314,7 +317,8 @@
System.out.println("New name: "+key);
n.setName(key);
} else {
- printHeader();
+ if(uline.length() > 0)
+ printHeader();
}
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-17 23:56:37 UTC (rev
7551)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-18 01:04:54 UTC (rev
7552)
@@ -20,10 +20,10 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- public static final int buildNumber = 187;
+ public static final int buildNumber = 188;
/** Oldest build of Fred we will talk to */
- public static final int lastGoodBuild = 187;
+ public static final int lastGoodBuild = 188;
/** The highest reported build of fred */
public static int highestSeenBuild = buildNumber;