Author: toad
Date: 2009-04-15 22:21:35 +0000 (Wed, 15 Apr 2009)
New Revision: 26858

Modified:
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
possiblyRemoveFromParent: Cancel the segment immediately to avoid losing blocks 
due to a race condition.
kill: Pass in whether we are cancelled already, and check blockNums 
accordingly: if we are cancelled blockNums should be empty.


Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2009-04-15 22:11:15 UTC (rev 26857)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2009-04-15 22:21:35 UTC (rev 26858)
@@ -1170,7 +1170,7 @@
                for(int i=0;i<deadSegs.length;i++) {
                        if(persistent)
                                container.activate(deadSegs[i], 1);
-                       deadSegs[i].kill(container, context, true);
+                       deadSegs[i].kill(container, context, true, false);
                        
context.getChkFetchScheduler().removeFromStarterQueue(deadSegs[i], container, 
true);
                        if(persistent)
                                container.deactivate(deadSegs[i], 1);

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2009-04-15 22:11:15 UTC (rev 26857)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2009-04-15 22:21:35 UTC (rev 26858)
@@ -629,8 +629,9 @@
                                if(persistent) container.deactivate(blockNums, 
1);
                                return;
                        }
+                       cancelled = true;
                }
-               kill(container, context, true);
+               kill(container, context, true, true);
        }
 
        public void onGotKey(Key key, KeyBlock block, ObjectContainer 
container, ClientContext context) {
@@ -684,7 +685,7 @@
         * Terminate a subsegment. Called by the segment, which will have 
already removed the
         * subsegment from the list. Will delete the object from the database 
if persistent.
         */
-       public void kill(ObjectContainer container, ClientContext context, 
boolean dontDeactivateSeg) {
+       public void kill(ObjectContainer container, ClientContext context, 
boolean dontDeactivateSeg, boolean cancelledAlready) {
                if(persistent) {
                        container.activate(segment, 1);
                        container.activate(blockNums, 1);
@@ -695,10 +696,20 @@
                unregister(container, context);
                Integer[] oldNums = null;
                synchronized(segment) {
+                       if(cancelledAlready) {
+                               if(!cancelled) {
+                                       Logger.error(this, "Should be cancelled 
already! "+this, new Exception("error"));
+                                       cancelled = true;
+                               }
+                               if(!blockNums.isEmpty())
+                                       Logger.error(this, "Block nums not 
empty! on "+this+" : "+blockNums, new Exception("error"));
+                       } else {
+                               if(cancelled) return;
+                               cancelled = true;
+                       }
                        if(persistent)
                                oldNums = blockNums.toArray(new 
Integer[blockNums.size()]);
                        blockNums.clear();
-                       cancelled = true;
                }
                if(persistent && oldNums != null && oldNums.length > 0) {
                        for(Integer i : oldNums) container.delete(i);

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to