Author: toad
Date: 2007-06-26 16:03:00 +0000 (Tue, 26 Jun 2007)
New Revision: 13765

Modified:
   trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
   trunk/freenet/src/freenet/client/async/USKChecker.java
   trunk/freenet/src/freenet/node/SendableGet.java
   trunk/freenet/src/freenet/node/SendableRequest.java
   trunk/freenet/src/freenet/node/SimpleSendableInsert.java
Log:
Fix some leaks in back-door coalescing and possibly in scheduling in general

Modified: trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java   
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/BaseSingleFileFetcher.java   
2007-06-26 16:03:00 UTC (rev 13765)
@@ -11,7 +11,6 @@
 import freenet.keys.KeyVerifyException;
 import freenet.node.SendableGet;
 import freenet.support.Logger;
-import freenet.support.RandomGrabArray;

 public abstract class BaseSingleFileFetcher extends SendableGet {

@@ -83,8 +82,7 @@
                synchronized(this) {
                        cancelled = true;
                }
-               RandomGrabArray arr = getParentGrabArray();
-               if(arr != null) arr.remove(this);
+               super.unregister();
        }

        public synchronized boolean isCancelled() {

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2007-06-26 16:03:00 UTC (rev 13765)
@@ -496,8 +496,7 @@

                for(int i=0;i<reqs.length;i++) {
                        SendableRequest req = reqs[i];
-                       RandomGrabArray array = req.getParentGrabArray();
-                       if(array != null) array.remove(req);
+                       req.unregister();
                        innerRegister(req);
                }
                synchronized(starter) {
@@ -535,4 +534,10 @@
                };
                node.getTicker().queueTimedJob(r, 0); // FIXME ideally these 
would be completed on a single thread; when we have 1.5, use a dedicated 
non-parallel Executor
        }
+
+       public boolean anyWantKey(Key key) {
+               synchronized(pendingKeys) {
+                       return pendingKeys.get(key) != null;
+               }
+       }
 }

Modified: trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java 
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java 
2007-06-26 16:03:00 UTC (rev 13765)
@@ -98,7 +98,7 @@
                        }
                }
                // :(
-               getScheduler().removePendingKeys(this, false);
+               unregister();
                if(e.isFatal() || forceFatal)
                        parent.fatallyFailedBlock();
                else
@@ -108,6 +108,7 @@

        /** Will be overridden by SingleFileFetcher */
        protected void onSuccess(FetchResult data) {
+               unregister();
                if(parent.isCancelled()) {
                        data.asBucket().free();
                        onFailure(new FetchException(FetchException.CANCELLED));

Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2007-06-26 16:03:00 UTC (rev 13765)
@@ -276,8 +276,7 @@
                        if(finished) return;
                        finished = true;
                }
-               RandomGrabArray arr = getParentGrabArray();
-               if(arr != null) arr.remove(this);
+               super.unregister();
                cb.onFailure(new InsertException(InsertException.CANCELLED), 
this);
        }


Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2007-06-26 16:03:00 UTC (rev 13765)
@@ -177,7 +177,7 @@
        }

        protected void onSuccess(FetchResult result) {
-               getScheduler().removePendingKeys(this, false);
+               unregister();
                if(parent.isCancelled()) {
                        if(logMINOR)
                                Logger.minor(this, "Parent is cancelled");

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2007-06-26 16:03:00 UTC (rev 13765)
@@ -203,7 +203,12 @@
                        if(isCollectingBinaryBlob()) {
                                for(int i=0;i<dataBuckets.length;i++) {
                                        Bucket data = dataBuckets[i].getData();
-                                       maybeAddToBinaryBlob(data, i, false);
+                                       try {
+                                               maybeAddToBinaryBlob(data, i, 
false);
+                                       } catch (FetchException e) {
+                                               fail(e);
+                                               return;
+                                       }
                                }
                        }
                        decodedData = fetchContext.bucketFactory.makeBucket(-1);
@@ -261,7 +266,12 @@
                for(int i=0;i<checkBuckets.length;i++) {
                        boolean heal = false;
                        Bucket data = checkBuckets[i].getData();
-                       maybeAddToBinaryBlob(data, i, true);
+                       try {
+                               maybeAddToBinaryBlob(data, i, true);
+                       } catch (FetchException e) {
+                               fail(e);
+                               return;
+                       }
                        if(checkRetries[i] > 0)
                                heal = true;
                        if(heal) {
@@ -284,7 +294,7 @@
                } else return false;
        }

-       private void maybeAddToBinaryBlob(Bucket data, int i, boolean check) {
+       private void maybeAddToBinaryBlob(Bucket data, int i, boolean check) 
throws FetchException {
                if(parentFetcher.parent instanceof ClientGetter) {
                        ClientGetter getter = (ClientGetter) 
(parentFetcher.parent);
                        if(getter.collectingBinaryBlob()) {
@@ -294,11 +304,9 @@
                                        getter.addKeyToBinaryBlob(block);
                                } catch (CHKEncodeException e) {
                                        Logger.error(this, "Failed to encode 
(collecting binary blob) "+(check?"check":"data")+" block "+i+": "+e, e);
-                                       fail(new 
FetchException(FetchException.INTERNAL_ERROR, "Failed to encode for binary 
blob: "+e));
-                                       return;
+                                       throw new 
FetchException(FetchException.INTERNAL_ERROR, "Failed to encode for binary 
blob: "+e);
                                } catch (IOException e) {
-                                       fail(new 
FetchException(FetchException.BUCKET_ERROR, "Failed to encode for binary blob: 
"+e));
-                                       return;
+                                       throw new 
FetchException(FetchException.BUCKET_ERROR, "Failed to encode for binary blob: 
"+e);
                                }
                        }
                }
@@ -343,7 +351,8 @@
                }
                if(allFailed)
                        fail(new FetchException(FetchException.SPLITFILE_ERROR, 
errors));
-               seg.possiblyRemoveFromParent();
+               else
+                       seg.possiblyRemoveFromParent();
        }

        /** A request has failed non-fatally, so the block may be retried */
@@ -412,6 +421,7 @@
                                checkBuckets[i] = null;
                        }
                }
+               removeSubSegments();
                parentFetcher.segmentFinished(this);
        }

@@ -458,4 +468,11 @@
                }
        }

+       private void removeSubSegments() {
+               for(int i=0;i<subSegments.size();i++) {
+                       SplitFileFetcherSubSegment seg = 
(SplitFileFetcherSubSegment) subSegments.get(i);
+                       seg.kill();
+               }
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2007-06-26 15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2007-06-26 16:03:00 UTC (rev 13765)
@@ -264,7 +264,7 @@
                        if(!blockNums.isEmpty()) return;
                }
                segment.removeSeg(this);
-               getScheduler().removePendingKeys(this, false);
+               unregister();
        }

        public void onGotKey(Key key, KeyBlock block) {
@@ -292,4 +292,12 @@
                }
        }

+       public void kill() {
+               synchronized(this) {
+                       blockNums.clear();
+               }
+               segment.removeSeg(this);
+               unregister();
+       }
+       
 }

Modified: trunk/freenet/src/freenet/client/async/USKChecker.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKChecker.java      2007-06-26 
15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/client/async/USKChecker.java      2007-06-26 
16:03:00 UTC (rev 13765)
@@ -26,7 +26,7 @@
        }

        public void onSuccess(ClientKeyBlock block, boolean fromStore, int 
token) {
-               getScheduler().removePendingKeys(this, false);
+               unregister();
                cb.onSuccess((ClientSSKBlock)block);
        }

@@ -63,7 +63,7 @@
                if(canRetry && retry()) return;

                // Ran out of retries.
-               getScheduler().removePendingKeys(this, false);          
+               unregister();
                if(e.code == LowLevelGetException.CANCELLED){
                        cb.onCancelled();
                        return;

Modified: trunk/freenet/src/freenet/node/SendableGet.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableGet.java     2007-06-26 15:41:28 UTC 
(rev 13764)
+++ trunk/freenet/src/freenet/node/SendableGet.java     2007-06-26 16:03:00 UTC 
(rev 13765)
@@ -116,5 +116,10 @@
        }

        public abstract void onGotKey(Key key, KeyBlock block);
-
+       
+       public final void unregister() {
+               getScheduler().removePendingKeys(this, false);
+               super.unregister();
+       }
+       
 }

Modified: trunk/freenet/src/freenet/node/SendableRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableRequest.java 2007-06-26 15:41:28 UTC 
(rev 13764)
+++ trunk/freenet/src/freenet/node/SendableRequest.java 2007-06-26 16:03:00 UTC 
(rev 13765)
@@ -42,4 +42,9 @@
                parentGrabArray = parent;
        }

+       public void unregister() {
+               RandomGrabArray arr = getParentGrabArray();
+               if(arr != null) arr.remove(this);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- trunk/freenet/src/freenet/node/SimpleSendableInsert.java    2007-06-26 
15:41:28 UTC (rev 13764)
+++ trunk/freenet/src/freenet/node/SimpleSendableInsert.java    2007-06-26 
16:03:00 UTC (rev 13765)
@@ -106,8 +106,7 @@
                        if(finished) return;
                        finished = true;
                }
-               RandomGrabArray arr = getParentGrabArray();
-               if(arr != null) arr.remove(this);
+               super.unregister();
        }

        public boolean shouldCache() {


Reply via email to