Author: toad
Date: 2007-05-02 18:10:00 +0000 (Wed, 02 May 2007)
New Revision: 13106

Modified:
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
Remove the sub-segment when we are done with it, not before.

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2007-05-02 18:09:18 UTC (rev 13105)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2007-05-02 18:10:00 UTC (rev 13106)
@@ -140,7 +140,7 @@
                return fatallyFailedBlocks;
        }

-       public void onSuccess(Bucket data, int blockNo, boolean dontNotify) {
+       public void onSuccess(Bucket data, int blockNo, boolean dontNotify, 
SplitFileFetcherSubSegment seg) {
                boolean decodeNow = false;
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                synchronized(this) {
@@ -175,6 +175,7 @@
                        }
                }
                parentFetcher.parent.completedBlock(dontNotify);
+               seg.possiblyRemoveFromParent();
                if(decodeNow) {
                        decode();
                }
@@ -271,9 +272,10 @@
        }

        /** This is after any retries and therefore is either out-of-retries or 
fatal */
-       public synchronized void onFatalFailure(FetchException e, int blockNo) {
+       public synchronized void onFatalFailure(FetchException e, int blockNo, 
SplitFileFetcherSubSegment seg) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                if(logMINOR) Logger.minor(this, "Permanently failed block: 
"+blockNo+" on "+this+" : "+e, e);
+               boolean allFailed;
                synchronized(this) {
                        if(isFinishing()) return; // this failure is now 
irrelevant, and cleanup will occur on the decoder thread
                        if(blockNo < dataKeys.length) {
@@ -298,14 +300,15 @@
                                failedBlocks++;
                                parentFetcher.parent.failedBlock();
                        }
-                       if(failedBlocks + fatallyFailedBlocks <= 
(dataKeys.length + checkKeys.length - minFetched))
-                               return;
+                       allFailed = failedBlocks + fatallyFailedBlocks <= 
(dataKeys.length + checkKeys.length - minFetched);
                }
-               fail(new FetchException(FetchException.SPLITFILE_ERROR, 
errors));
+               if(allFailed)
+                       fail(new FetchException(FetchException.SPLITFILE_ERROR, 
errors));
+               seg.possiblyRemoveFromParent();
        }

        /** A request has failed non-fatally, so the block may be retried */
-       public void onNonFatalFailure(FetchException e, int blockNo) {
+       public void onNonFatalFailure(FetchException e, int blockNo, 
SplitFileFetcherSubSegment seg) {
                int tries;
                int maxTries = blockFetchContext.maxNonSplitfileRetries;
                synchronized(this) {
@@ -313,13 +316,13 @@
                        if(blockNo < dataKeys.length) {
                                tries = ++dataRetries[blockNo];
                                if(tries > maxTries && maxTries >= 0) {
-                                       onFatalFailure(e, blockNo);
+                                       onFatalFailure(e, blockNo, seg);
                                        return;
                                }
                        } else {
                                tries = ++checkRetries[blockNo-dataKeys.length];
                                if(tries > maxTries && maxTries >= 0) {
-                                       onFatalFailure(e, blockNo);
+                                       onFatalFailure(e, blockNo, seg);
                                        return;
                                }
                        }

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2007-05-02 18:09:18 UTC (rev 13105)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2007-05-02 18:10:00 UTC (rev 13106)
@@ -135,9 +135,9 @@
                }
                segment.errors.inc(e.getMode());
                if(e.isFatal() || forceFatal) {
-                       segment.onFatalFailure(e, token);
+                       segment.onFatalFailure(e, token, this);
                } else {
-                       segment.onNonFatalFailure(e, token);
+                       segment.onNonFatalFailure(e, token, this);
                }
        }

@@ -170,7 +170,7 @@
                        onFailure(new FetchException(FetchException.CANCELLED), 
blockNo);
                        return;
                }
-               segment.onSuccess(data, blockNo, fromStore);
+               segment.onSuccess(data, blockNo, fromStore, this);
        }

        /** Convert a ClientKeyBlock to a Bucket. If an error occurs, report it 
via onFailure
@@ -252,5 +252,10 @@
        public String toString() {
                return super.toString()+":"+retryCount+"/"+segment;
        }
+
+       public synchronized void possiblyRemoveFromParent() {
+               if(blockNums.isEmpty())
+                       segment.removeSeg(this);
+       }

 }


Reply via email to