Author: toad
Date: 2008-02-22 20:08:05 +0000 (Fri, 22 Feb 2008)
New Revision: 18106

Modified:
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
Don't remove a subsegment until there are no keys at that retry level.

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-02-22 20:07:10 UTC (rev 18105)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-02-22 20:08:05 UTC (rev 18106)
@@ -491,15 +491,37 @@
                else return null;
        }

-       public synchronized void removeSeg(SplitFileFetcherSubSegment segment) {
+       /**
+        * Double-check whether we need to remove a subsegment, and if so, 
remove it.
+        * We need to do the check because there is no point removing the 
subsegment until all
+        * its running requests have been removed (since request data 
structures will refer to it
+        * anyway), and all the requests on the cooldown queue for it have been 
removed. In either
+        * case we get duplicated structures in memory.
+        * @return True if we removed the subsegment.
+        */
+       public synchronized boolean maybeRemoveSeg(SplitFileFetcherSubSegment 
segment) {
+               int retryCount = segment.retryCount;
+               boolean dontRemove = true;
+               for(int i=0;i<dataRetries.length;i++)
+                       if(dataRetries[i] == retryCount) {
+                               dontRemove = false;
+                               break;
+                       }
+               for(int i=0;i<checkRetries.length;i++)
+                       if(checkRetries[i] == retryCount) {
+                               dontRemove = false;
+                               break;
+                       }
+               if(dontRemove) return false;
                if(logMINOR)
-                       Logger.minor(this, "Removing sub segment: "+segment);
+                       Logger.minor(this, "Removing sub segment: "+segment+" 
for retry count "+retryCount);
                for(int i=0;i<subSegments.size();i++) {
                        if(segment.equals(subSegments.get(i))) {
                                subSegments.remove(i);
                                i--;
                        }
                }
+               return true;
        }

        private void removeSubSegments() {

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2008-02-22 20:07:10 UTC (rev 18105)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2008-02-22 20:08:05 UTC (rev 18106)
@@ -308,7 +308,7 @@
                                Logger.minor(this, "Definitely removing from 
parent: "+this);
                        cancelled = true;
                }
-               segment.removeSeg(this);
+               if(!segment.maybeRemoveSeg(this)) return;
                unregister();
        }

@@ -360,7 +360,8 @@
                        blockNums.clear();
                        cancelled = true;
                }
-               segment.removeSeg(this);
+               if(!segment.maybeRemoveSeg(this))
+                       Logger.error(this, "Could not remove subsegment: 
"+this+" from "+segment+" for some reason in kill()!");
        }

        public long getCooldownWakeup(Object token) {


Reply via email to