[freenet-cvs] r17533 - trunk/freenet/src/freenet/node

toad at freenetproject.org toad at freenetproject.org
Tue Feb 5 00:18:17 UTC 2008


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




More information about the cvs mailing list