Author: toad
Date: 2008-06-26 18:11:32 +0000 (Thu, 26 Jun 2008)
New Revision: 20770

Modified:
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
More activation

Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java        
2008-06-26 18:07:37 UTC (rev 20769)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java        
2008-06-26 18:11:32 UTC (rev 20770)
@@ -184,7 +184,9 @@
                        SplitFileFetcherSegment s = segments[i];
                        if(persistent)
                                container.activate(s, 1);
-                       if(!s.isFinished()) throw new 
IllegalStateException("Not all finished");
+                       if(!s.succeeded()) {
+                               throw new IllegalStateException("Not all 
finished");
+                       }
                        s.throwError();
                        // If still here, it succeeded
                        finalLength += s.decodedLength();
@@ -236,7 +238,7 @@
                        for(int i=0;i<segments.length;i++) {
                                if(persistent)
                                        container.activate(segments[i], 1);
-                               if(!segments[i].isFinished()) {
+                               if(!segments[i].isFinished(container)) {
                                        if(logMINOR) Logger.minor(this, 
"Segment "+segments[i]+" is not finished");
                                        allDone = false;
                                }

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-26 18:07:37 UTC (rev 20769)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-26 18:11:32 UTC (rev 20770)
@@ -115,12 +115,21 @@
                        if(checkKeys[i] == null) throw new 
NullPointerException("Null: check block "+i);
        }

-       public synchronized boolean isFinished() {
-               return finished || parentFetcher.parent.isCancelled();
+       public synchronized boolean isFinished(ObjectContainer container) {
+               if(finished) return true;
+               if(persistent) {
+                       container.activate(parentFetcher, 1);
+                       container.activate(parentFetcher.parent, 1);
+               }
+               return parentFetcher.parent.isCancelled();
        }
+       
+       public synchronized boolean succeeded() {
+               return finished;
+       }

-       public synchronized boolean isFinishing() {
-               return isFinished() || finishing;
+       public synchronized boolean isFinishing(ObjectContainer container) {
+               return isFinished(container) || finishing;
        }

        /** Throw a FetchException, if we have one. Else do nothing. */
@@ -393,7 +402,7 @@
                NodeCHK key = getBlockNodeKey(blockNo, container);
                if(key != null) seg.unregisterKey(key, context);
                synchronized(this) {
-                       if(isFinishing()) return; // this failure is now 
irrelevant, and cleanup will occur on the decoder thread
+                       if(isFinishing(container)) return; // this failure is 
now irrelevant, and cleanup will occur on the decoder thread
                        if(blockNo < dataKeys.length) {
                                if(dataKeys[blockNo] == null) {
                                        Logger.error(this, "Block already 
finished: "+blockNo);
@@ -440,7 +449,7 @@
                ClientCHK key;
                SplitFileFetcherSubSegment sub = null;
                synchronized(this) {
-                       if(isFinished()) return;
+                       if(isFinished(container)) return;
                        if(blockNo < dataKeys.length) {
                                key = dataKeys[blockNo];
                                if(persistent)
@@ -612,7 +621,7 @@
         * case we get duplicated structures in memory.
         * @return True if we removed the subsegment.
         */
-       public synchronized boolean maybeRemoveSeg(SplitFileFetcherSubSegment 
segment) {
+       public synchronized boolean maybeRemoveSeg(SplitFileFetcherSubSegment 
segment, ObjectContainer container) {
                int retryCount = segment.retryCount;
                boolean dontRemove = true;
                for(int i=0;i<dataRetries.length;i++)
@@ -625,7 +634,7 @@
                                dontRemove = false;
                                break;
                        }
-               if(isFinishing()) dontRemove = false;
+               if(isFinishing(container)) dontRemove = false;
                if(dontRemove) return false;
                if(logMINOR)
                        Logger.minor(this, "Removing sub segment: "+segment+" 
for retry count "+retryCount);
@@ -664,7 +673,7 @@
                Vector v = null;
                boolean notFound = true;
                synchronized(this) {
-               if(isFinishing()) return;
+               if(isFinishing(container)) return;
                int maxTries = blockFetchContext.maxNonSplitfileRetries;
                for(int i=0;i<dataKeys.length;i++) {
                        if(dataKeys[i] == null) continue;

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java  
    2008-06-26 18:07:37 UTC (rev 20769)
+++ 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java  
    2008-06-26 18:11:32 UTC (rev 20770)
@@ -86,9 +86,9 @@
                        }
                        ClientKey key = 
segment.getBlockKey(((Integer)token).intValue(), container);
                        if(key == null) {
-                               if(segment.isFinished()) {
+                               if(segment.isFinished(container)) {
                                        Logger.error(this, "Segment finished 
but didn't tell us! "+this);
-                               } else if(segment.isFinishing()) {
+                               } else if(segment.isFinishing(container)) {
                                        Logger.error(this, "Segment finishing 
but didn't tell us! "+this);
                                } else {
                                        Logger.error(this, "Segment not 
finishing yet still returns null for getKey()!: "+token+" for "+this, new 
Exception("debug"));
@@ -141,7 +141,7 @@
                                ret = (Integer) blockNums.remove(x);
                                Key key = 
segment.getBlockNodeKey(((Integer)ret).intValue(), container);
                                if(key == null) {
-                                       if(segment.isFinishing() || 
segment.isFinished()) return null;
+                                       if(segment.isFinishing(container) || 
segment.isFinished(container)) return null;
                                        Logger.error(this, "Key is null for 
block "+ret+" for "+this);
                                        continue;
                                }
@@ -443,7 +443,7 @@
                        if(!blockNums.isEmpty()) return;
                        if(logMINOR)
                                Logger.minor(this, "Definitely removing from 
parent: "+this);
-                       if(!segment.maybeRemoveSeg(this)) return;
+                       if(!segment.maybeRemoveSeg(this, container)) return;
                }
                unregister(false, container);
        }


Reply via email to