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 };
        }


Reply via email to