Author: toad
Date: 2008-02-05 00:18:17 +0000 (Tue, 05 Feb 2008)
New Revision: 17533
Modified:
trunk/freenet/src/freenet/node/FailureTable.java
trunk/freenet/src/freenet/node/FailureTableEntry.java
trunk/freenet/src/freenet/node/RequestSender.java
Log:
Include ALL nodes which we routed to in the failure table entry's requestedFrom
tables.
Modified: trunk/freenet/src/freenet/node/FailureTable.java
===================================================================
--- trunk/freenet/src/freenet/node/FailureTable.java 2008-02-05 00:09:22 UTC
(rev 17532)
+++ trunk/freenet/src/freenet/node/FailureTable.java 2008-02-05 00:18:17 UTC
(rev 17533)
@@ -75,17 +75,17 @@
* @param key The key that was fetched.
* @param htl The HTL it was fetched at.
* @param requestors The nodes requesting it (if any).
- * @param requested The single node it was forwarded to, which DNFed.
+ * @param requestedFrom The single node it was forwarded to, which
DNFed.
* @param now The time at which the request was sent.
* @param timeout The number of millis from when the request was sent
to when the failure block times out.
* I.e. between 0 and REJECT_TIME. -1 indicates a RejectedOverload or
actual timeout.
*/
- public void onFailure(Key key, short htl, PeerNode[] requestors,
PeerNode requested, int timeout, long now) {
+ public void onFailure(Key key, short htl, PeerNode[] requestors,
PeerNode[] requestedFrom, int timeout, long now) {
FailureTableEntry entry;
synchronized(this) {
entry = (FailureTableEntry) entriesByKey.get(key);
if(entry == null) {
- entry = new FailureTableEntry(key, htl,
requestors, requested);
+ entry = new FailureTableEntry(key, htl,
requestors, requestedFrom);
entriesByKey.push(key, entry);
return;
} else {
@@ -93,7 +93,7 @@
}
trimEntries(now);
}
- entry.onFailure(htl, requestors, requested, timeout, now);
+ entry.onFailure(htl, requestors, requestedFrom, timeout, now);
}
private void trimEntries(long now) {
Modified: trunk/freenet/src/freenet/node/FailureTableEntry.java
===================================================================
--- trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-05
00:09:22 UTC (rev 17532)
+++ trunk/freenet/src/freenet/node/FailureTableEntry.java 2008-02-05
00:18:17 UTC (rev 17533)
@@ -30,6 +30,10 @@
/** Boot ID when they requested it. We don't send it to restarted
nodes, as a
* (weak, but useful if combined with other measures) protection
against seizure. */
long[] requestorBootIDs;
+ // FIXME Note that just because a node is in this list doesn't mean it
DNFed or RFed.
+ // We include *ALL* nodes we routed to here!
+ // FIXME also we don't have accurate times for when we routed to them -
we only
+ // have the terminal time for the request.
/** WeakReference's to PeerNode's we have requested it from */
WeakReference[] requestedNodes;
/** Their locations when we requested it */
@@ -43,7 +47,7 @@
* if we receive an offer from that node, we will reject it */
static final int MAX_TIME_BETWEEN_REQUEST_AND_OFFER = 60 * 60 * 1000;
- FailureTableEntry(Key key2, short htl2, PeerNode[] requestors, PeerNode
requested) {
+ FailureTableEntry(Key key2, short htl2, PeerNode[] requestors,
PeerNode[] requested) {
logMINOR = Logger.shouldLog(Logger.MINOR, this);
long now = System.currentTimeMillis();
this.key = key2;
@@ -66,10 +70,16 @@
requestorBootIDs = new long[0];
}
if(requested != null) {
- requestedNodes = new WeakReference[] { requested.myRef
};
- requestedLocs = new double[] { requested.getLocation()
};
- requestedBootIDs = new long[] { requested.getBootID() };
- requestedTimes = new long[] {
System.currentTimeMillis() };
+ requestedNodes = new WeakReference[requested.length];
+ requestedLocs = new double[requested.length];
+ requestedBootIDs = new long[requested.length];
+ requestedTimes = new long[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;
+ }
} else {
requestedNodes = new WeakReference[0];
requestedLocs = new double[0];
@@ -83,9 +93,9 @@
* RecentlyFailed.
* @param htl2
* @param requestors
- * @param requested
+ * @param requestedFrom
*/
- public void onFailure(short htl2, PeerNode[] requestors, PeerNode
requested, int timeout, long now) {
+ public void onFailure(short htl2, PeerNode[] requestors, PeerNode[]
requestedFrom, int timeout, long now) {
synchronized(this) {
long newTimeoutTime = now + timeout;
if(now > timeoutTime /* has expired */ &&
newTimeoutTime > timeoutTime) {
@@ -94,8 +104,8 @@
}
if(requestors != null)
addRequestors(requestors, now);
- if(requested != null)
- addRequestedFrom(new PeerNode[] { requested },
now);
+ if(requestedFrom != null)
+ addRequestedFrom(requestedFrom, now);
}
}
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2008-02-05 00:09:22 UTC
(rev 17532)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2008-02-05 00:18:17 UTC
(rev 17533)
@@ -378,7 +378,7 @@
// This used to be RNF, I dunno why
//???: finish(GENERATED_REJECTED_OVERLOAD,
null);
finish(DATA_NOT_FOUND, null, false);
- node.failureTable.onFailure(key, htl, sourceAsArray(),
null, FailureTable.REJECT_TIME, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl, sourceAsArray(),
pnArray(nodesRoutedTo), FailureTable.REJECT_TIME, System.currentTimeMillis());
return;
}
@@ -393,7 +393,7 @@
Logger.minor(this, "no more peers, but
overloads ("+rejectOverloads+"/"+routeAttempts+" overloaded)");
// Backtrack
finish(ROUTE_NOT_FOUND, null, false);
- node.failureTable.onFailure(key, htl, sourceAsArray(),
null, -1, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl, sourceAsArray(),
pnArray(nodesRoutedTo), -1, System.currentTimeMillis());
return;
}
@@ -545,7 +545,7 @@
next.localRejectedOverload("FatalTimeout");
forwardRejectedOverload();
finish(TIMED_OUT, next, false);
- node.failureTable.onFailure(key, htl, sourceAsArray(),
next, -1, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl, sourceAsArray(),
pnArray(nodesRoutedTo), -1, System.currentTimeMillis());
return;
}
@@ -556,7 +556,7 @@
if(msg.getSpec() == DMT.FNPDataNotFound) {
next.successNotOverload();
finish(DATA_NOT_FOUND, next, false);
- node.failureTable.onFailure(key, htl, sourceAsArray(),
next, FailureTable.REJECT_TIME, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl, sourceAsArray(),
pnArray(nodesRoutedTo), FailureTable.REJECT_TIME, System.currentTimeMillis());
return;
}
@@ -621,7 +621,7 @@
// If there is, we will avoid sending requests for the
specified period.
// FIXME we need to create the FT entry.
finish(RECENTLY_FAILED, next, false);
- node.failureTable.onFailure(key, htl, sourceAsArray(),
next, timeLeft, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl, sourceAsArray(),
pnArray(nodesRoutedTo), timeLeft, System.currentTimeMillis());
return;
}
@@ -687,7 +687,7 @@
} catch (KeyVerifyException e1) {
Logger.normal(this, "Got data
but verify failed: "+e1, e1);
finish(VERIFY_FAILURE, next,
false);
- node.failureTable.onFailure(key, htl,
sourceAsArray(), next, -1, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl,
sourceAsArray(), pnArray(nodesRoutedTo), -1, System.currentTimeMillis());
return;
}
finish(SUCCESS, next, false);
@@ -698,7 +698,7 @@
else
Logger.error(this, "Transfer failed
("+e.getReason()+"/"+RetrievalException.getErrString(e.getReason())+"): "+e, e);
finish(TRANSFER_FAILED, next, false);
- node.failureTable.onFailure(key, htl,
sourceAsArray(), next, -1, System.currentTimeMillis());
+ node.failureTable.onFailure(key, htl,
sourceAsArray(), pnArray(nodesRoutedTo), -1, System.currentTimeMillis());
return;
}
} finally {
@@ -760,7 +760,11 @@
}
}
- private PeerNode[] sourceAsArray() {
+ private PeerNode[] pnArray(HashSet nodesRoutedTo) {
+ return (PeerNode[]) nodesRoutedTo.toArray(new
PeerNode[nodesRoutedTo.size()]);
+ }
+
+ private PeerNode[] sourceAsArray() {
if(source == null) return null;
else return new PeerNode[] { source };
}