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();