[freenet-cvs] r18944 - in trunk/freenet/src/freenet: client/async node

toad at freenetproject.org toad at freenetproject.org
Thu Apr 3 11:46:23 UTC 2008


Author: toad
Date: 2008-04-03 11:46:23 +0000 (Thu, 03 Apr 2008)
New Revision: 18944

Modified:
   trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/RequestCooldownQueue.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
   trunk/freenet/src/freenet/node/SendableGet.java
Log:
Fix losing blocks when changing priority when there were blocks on the cooldown queue:
We weren't resetting the cooldown deadlines, so after one failure a block wouldn't be rescheduled.

Modified: trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java	2008-04-03 08:28:04 UTC (rev 18943)
+++ trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java	2008-04-03 11:46:23 UTC (rev 18944)
@@ -157,6 +157,10 @@
 		return cooldownWakeupTime;
 	}
 	
+	public synchronized void resetCooldownTimes() {
+		cooldownWakeupTime = -1;
+	}
+	
 	public void requeueAfterCooldown(Key key, long time) {
 		if(cooldownWakeupTime > time) {
 			if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this, "Not requeueing as deadline has not passed yet");

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-04-03 08:28:04 UTC (rev 18943)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java	2008-04-03 11:46:23 UTC (rev 18944)
@@ -599,6 +599,9 @@
 		for(int i=0;i<reqs.length;i++) {
 			SendableRequest req = reqs[i];
 			req.unregister();
+			// If we don't reset the cooldown times, the block will be lost after 1 failed retry.
+			if(req instanceof SendableGet)
+				((SendableGet)req).resetCooldownTimes();
 			innerRegister(req);
 		}
 		starter.wakeUp();

Modified: trunk/freenet/src/freenet/client/async/RequestCooldownQueue.java
===================================================================
--- trunk/freenet/src/freenet/client/async/RequestCooldownQueue.java	2008-04-03 08:28:04 UTC (rev 18943)
+++ trunk/freenet/src/freenet/client/async/RequestCooldownQueue.java	2008-04-03 11:46:23 UTC (rev 18944)
@@ -116,9 +116,65 @@
 	 */
 	synchronized Key removeKeyBefore(long now) {
 		logMINOR = Logger.shouldLog(Logger.MINOR, this);
+		boolean foundIT = false;
+		if(logMINOR) {
+			if(clients[startPtr] != null) {
+				ClientRequester cr = clients[startPtr].parent;
+				if(cr instanceof ClientGetter) {
+					String s = ((ClientGetter)cr).getURI().toShortString();
+					if(logMINOR) Logger.minor(this, "client = "+s);
+					if(s.equals("CHK at .../chaosradio_131.mp3")) {
+						foundIT = true;
+					}
+				}
+			}
+			
+			java.util.HashMap countsByShortURI = new java.util.HashMap();
+			int nulls = 0;
+			int nullClients = 0;
+			int notGetter = 0;
+			int valid = 0;
+			for(int i=0;i<keys.length;i++) {
+				if(keys[i] == null) {
+					nulls++;
+					continue;
+				}
+				if(clients[i] == null) {
+					nullClients++; // Odd...
+					continue;
+				}
+				valid++;
+				ClientRequester cr = clients[i].parent;
+				if(cr instanceof ClientGetter) {
+					String shortURI = ((ClientGetter)cr).getURI().toShortString();
+					Integer ctr = (Integer) countsByShortURI.get(shortURI);
+					if(ctr == null) ctr = new Integer(1);
+					else ctr = new Integer(ctr.intValue()+1);
+					countsByShortURI.put(shortURI, ctr);
+				} else {
+					notGetter++;
+				}
+			}
+			System.err.println("COOLDOWN QUEUE DUMP:");
+			System.err.println();
+			System.err.println("BY CLIENTS:");
+			for(java.util.Iterator it = countsByShortURI.keySet().iterator();it.hasNext();) {
+				String shortKey = (String) it.next();
+				System.err.println(shortKey+" : "+countsByShortURI.get(shortKey));
+			}
+			System.err.println();
+			System.err.println("Nulls:"+nulls);
+			System.err.println("Null clients: "+nullClients);
+			System.err.println("Not a getter: "+notGetter);
+			System.err.println("Valid: "+valid);
+			System.err.println();
+		}
 		if(logMINOR)
 			Logger.minor(this, "Remove key before "+now+" : startPtr="+startPtr+" endPtr="+endPtr+" holes="+holes+" keys.length="+keys.length);
 		if(holes < 0) Logger.error(this, "holes = "+holes+" !!");
+		if(foundIT) {
+			if(logMINOR) Logger.minor(this, "FOUND IT!"); // FIXME remove
+		}
 		while(true) {
 			if(startPtr == endPtr) {
 				if(logMINOR) Logger.minor(this, "No keys queued");

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java	2008-04-03 08:28:04 UTC (rev 18943)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java	2008-04-03 11:46:23 UTC (rev 18944)
@@ -659,4 +659,14 @@
 		}
 		return (Integer[]) v.toArray(new Integer[v.size()]);
 	}
+
+	public synchronized void resetCooldownTimes(Integer[] blockNums) {
+		for(int i=0;i<blockNums.length;i++) {
+			int blockNo = blockNums[i].intValue();
+			if(blockNo < dataCooldownTimes.length)
+				dataCooldownTimes[blockNo] = -1;
+			else
+				checkCooldownTimes[blockNo - dataCooldownTimes.length] = -1;
+		}
+	}
 }

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java	2008-04-03 08:28:04 UTC (rev 18943)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java	2008-04-03 11:46:23 UTC (rev 18944)
@@ -363,7 +363,7 @@
 	}
 
 	public String toString() {
-		return super.toString()+":"+retryCount+"/"+segment+'('+blockNums.size()+')';
+		return super.toString()+":"+retryCount+"/"+segment+'('+blockNums.size()+')'; 
 	}
 
 	public void possiblyRemoveFromParent() {
@@ -448,4 +448,10 @@
 		return segment.getCooldownWakeupByKey(key);
 	}
 
+	public void resetCooldownTimes() {
+		synchronized(segment) {
+			segment.resetCooldownTimes((Integer[])blockNums.toArray(new Integer[blockNums.size()]));
+		}
+	}
+
 }

Modified: trunk/freenet/src/freenet/node/SendableGet.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableGet.java	2008-04-03 08:28:04 UTC (rev 18943)
+++ trunk/freenet/src/freenet/node/SendableGet.java	2008-04-03 11:46:23 UTC (rev 18944)
@@ -128,6 +128,9 @@
 	
 	public abstract long getCooldownWakeupByKey(Key key);
 	
+	/** Reset the cooldown times when the request is reregistered. */
+	public abstract void resetCooldownTimes();
+
 	public final void unregister() {
 		getScheduler().removePendingKeys(this, false);
 		super.unregister();




More information about the cvs mailing list