Author: toad
Date: 2008-02-06 19:27:50 +0000 (Wed, 06 Feb 2008)
New Revision: 17605
Modified:
trunk/freenet/src/freenet/node/FailureTable.java
trunk/freenet/src/freenet/node/FailureTableEntry.java
Log:
Track per-node timeouts and timeout HTLs.
New method FailureTable.onFailed() which will be used to report failures.
Modified: trunk/freenet/src/freenet/node/FailureTable.java
===================================================================
--- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-06 19:13:39 UTC
(rev 17604)
+++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-06 19:27:50 UTC
(rev 17605)
@@ -68,6 +68,23 @@
logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
}
+ public void onFailed(Key key, PeerNode routedTo, short htl, int
timeout) {
+ long now = System.currentTimeMillis();
+ FailureTableEntry entry;
+ synchronized(this) {
+ entry = (FailureTableEntry) entriesByKey.get(key);
+ if(entry == null) {
+ entry = new FailureTableEntry(key);
+ entriesByKey.push(key, entry);
+ return;
+ } else {
+ entriesByKey.push(key, entry);
+ }
+ trimEntries(now);
+ }
+ entry.failedTo(routedTo, timeout, now, htl);
+ }
+
/**
* Called when a node kills a request: the request DNFs, is killed by a
RecentlyFailed message,
* or times out. In any case this will create a FailureTableEntry.
Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java
===================================================================
--- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-06
19:13:39 UTC (rev 17604)
+++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-06
19:27:50 UTC (rev 17605)
@@ -41,6 +41,9 @@
double[] requestedLocs;
long[] requestedBootIDs;
long[] requestedTimes;
+ /** Timeouts for each node */
+ long[] requestedTimeouts;
+ short[] requestedTimeoutHTLs;
static boolean logMINOR;
@@ -61,6 +64,8 @@
requestedLocs = new double[0];
requestedBootIDs = new long[0];
requestedTimes = new long[0];
+ requestedTimeouts = new long[0];
+ requestedTimeoutHTLs = new short[0];
}
FailureTableEntry(Key key2, short htl2, PeerNode[] requestors,
PeerNode[] requested) {
@@ -90,17 +95,23 @@
requestedLocs = new double[requested.length];
requestedBootIDs = new long[requested.length];
requestedTimes = new long[requested.length];
+ requestedTimeouts = new long[requested.length];
+ requestedTimeoutHTLs = new short[requested.length];
for(int i=0;i<requestedNodes.length;i++) {
requestedNodes[i] = requested[i].myRef;
requestedLocs[i] = requested[i].getLocation();
requestedBootIDs[i] = requested[i].getBootID();
requestedTimes[i] = now;
+ requestedTimeouts[i] = -1;
+ requestedTimeoutHTLs[i] = (short) -1;
}
} else {
requestedNodes = new WeakReference[0];
requestedLocs = new double[0];
requestedBootIDs = new long[0];
requestedTimes = new long[0];
+ requestedTimeouts = new long[0];
+ requestedTimeoutHTLs = new short[0];
}
}
@@ -130,6 +141,20 @@
}
}
}
+
+ public void failedTo(PeerNode routedTo, int timeout, long now, short
htl) {
+ if(logMINOR) {
+ Logger.minor(this, "Failed sending request to
"+routedTo.shortToString()+" : timeout "+timeout);
+ int idx = addRequestedFrom(routedTo, now);
+ long curTimeoutTime = requestedTimeouts[idx];
+ long newTimeoutTime = now + timeout;
+ // FIXME htl???
+ if(now > curTimeoutTime /* has expired */ &&
newTimeoutTime > curTimeoutTime) {
+ requestedTimeouts[idx] = newTimeoutTime;
+ requestedTimeoutHTLs[idx] = htl;
+ }
+ }
+ }
// These are rather low level, in an attempt to absolutely minimize
memory usage...
// The two methods have almost identical code/logic.
@@ -247,6 +272,8 @@
requestedNodes[i] = requestedFrom.myRef;
requestedLocs[i] =
requestedFrom.getLocation();
requestedTimes[i] = now;
+ requestedTimeouts[i] = -1;
+ requestedTimeoutHTLs[i] = (short) -1;
return ret;
}
}
@@ -255,6 +282,8 @@
double[] newRequestedLocs = new
double[requestedNodes.length+notIncluded-nulls];
long[] newRequestedBootIDs = new
long[requestedNodes.length+notIncluded-nulls];
long[] newRequestedTimes = new
long[requestedNodes.length+notIncluded-nulls];
+ long[] newRequestedTimeouts = new
long[requestedNodes.length+notIncluded-nulls];
+ short[] newRequestedTimeoutHTLs = new
short[requestedNodes.length+notIncluded-nulls];
int toIndex = 0;
for(int i=0;i<requestedNodes.length;i++) {
@@ -266,6 +295,8 @@
newRequestedTimes[toIndex] = requestedTimes[i];
newRequestedBootIDs[toIndex] = requestedBootIDs[i];
newRequestedLocs[toIndex] = requestedLocs[i];
+ newRequestedTimeouts[toIndex] = requestedTimeouts[i];
+ newRequestedTimeoutHTLs[toIndex] =
requestedTimeoutHTLs[i];
toIndex++;
}
@@ -274,6 +305,8 @@
newRequestedTimes[toIndex] = now;
newRequestedBootIDs[toIndex] =
requestedFrom.getBootID();
newRequestedLocs[toIndex] = requestedFrom.getLocation();
+ newRequestedTimeouts[toIndex] = -1;
+ newRequestedTimeoutHTLs[toIndex] = (short) -1;
toIndex++;
}
@@ -283,19 +316,27 @@
double[] newNewRequestedLocs = new double[toIndex];
long[] newNewRequestedBootIDs = new long[toIndex];
long[] newNewRequestedTimes = new long[toIndex];
+ long[] newNewRequestedTimeouts = new long[toIndex];
+ short[] newNewRequestedTimeoutHTLs = new short[toIndex];
System.arraycopy(newRequestedNodes, 0,
newNewRequestedNodes, 0, toIndex);
System.arraycopy(newRequestedLocs, 0,
newNewRequestedLocs, 0, toIndex);
System.arraycopy(newRequestedBootIDs, 0,
newNewRequestedBootIDs, 0, toIndex);
System.arraycopy(newRequestedTimes, 0,
newNewRequestedTimes, 0, toIndex);
+ System.arraycopy(newRequestedTimeouts, 0,
newNewRequestedTimeouts, 0, toIndex);
+ System.arraycopy(newRequestedTimeoutHTLs, 0,
newNewRequestedTimeoutHTLs, 0, toIndex);
newRequestedNodes = newNewRequestedNodes;
newRequestedLocs = newNewRequestedLocs;
newRequestedBootIDs = newNewRequestedBootIDs;
newRequestedTimes = newNewRequestedTimes;
+ newRequestedTimeouts = newNewRequestedTimeouts;
+ newRequestedTimeoutHTLs = newNewRequestedTimeoutHTLs;
}
requestedNodes = newRequestedNodes;
requestedLocs = newRequestedLocs;
requestedBootIDs = newRequestedBootIDs;
requestedTimes = newRequestedTimes;
+ requestedTimeouts = newRequestedTimeouts;
+ requestedTimeoutHTLs = newRequestedTimeoutHTLs;
return ret;
}
@@ -421,7 +462,8 @@
}
if(!anyValid) {
requestedNodes = new WeakReference[0];
- requestedTimes = requestedBootIDs = new long[0];
+ requestedTimes = requestedBootIDs = requestedTimeouts =
new long[0];
+ requestedTimeoutHTLs = new short[0];
}
return false;
}