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


Reply via email to