Author: toad
Date: 2007-05-26 01:14:38 +0000 (Sat, 26 May 2007)
New Revision: 13381

Modified:
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
Log:
When fetching a splitfile to a binary blob, delay segment completion until we 
have encoded all check blocks.

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2007-05-26 01:01:41 UTC (rev 13380)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2007-05-26 01:14:38 UTC (rev 13381)
@@ -207,6 +207,12 @@

        public void onDecodedSegment() {
                try {
+                       if(isCollectingBinaryBlob()) {
+                               for(int i=0;i<dataBuckets.length;i++) {
+                                       Bucket data = dataBuckets[i].getData();
+                                       maybeAddToBinaryBlob(data, i, false);
+                               }
+                       }
                        decodedData = fetchContext.bucketFactory.makeBucket(-1);
                        if(logMINOR) Logger.minor(this, "Copying data from data 
blocks");
                        OutputStream os = decodedData.getOutputStream();
@@ -220,7 +226,8 @@
                        // Must set finished BEFORE calling parentFetcher.
                        // Otherwise a race is possible that might result in it 
not seeing our finishing.
                        finished = true;
-                       
parentFetcher.segmentFinished(SplitFileFetcherSegment.this);
+                       if(codec == null || !isCollectingBinaryBlob())
+                               
parentFetcher.segmentFinished(SplitFileFetcherSegment.this);
                } catch (IOException e) {
                        Logger.normal(this, "Caught bucket error?: "+e, e);
                        finished = true;
@@ -247,7 +254,6 @@
                for(int i=0;i<dataBuckets.length;i++) {
                        boolean heal = false;
                        Bucket data = dataBuckets[i].getData();
-                       maybeAddToBinaryBlob(data, i, false);
                        if(dataRetries[i] > 0)
                                heal = true;
                        if(heal) {
@@ -273,8 +279,18 @@
                        checkBuckets[i] = null;
                        checkKeys[i] = null;
                }
+               // Defer the completion until we have generated healing blocks 
if we are collecting binary blobs.
+               if(isCollectingBinaryBlob())
+                       
parentFetcher.segmentFinished(SplitFileFetcherSegment.this);
        }

+       boolean isCollectingBinaryBlob() {
+               if(parentFetcher.parent instanceof ClientGetter) {
+                       ClientGetter getter = (ClientGetter) 
(parentFetcher.parent);
+                       return getter.collectingBinaryBlob();
+               } else return false;
+       }
+       
        private void maybeAddToBinaryBlob(Bucket data, int i, boolean check) {
                if(parentFetcher.parent instanceof ClientGetter) {
                        ClientGetter getter = (ClientGetter) 
(parentFetcher.parent);


Reply via email to