r26858 - trunk/freenet/src/freenet/client/async

[email protected] Wed, 15 Apr 2009 22:21:36 +0000
Newsgroups gmane.network.freenet.cvs
Message-ID <[email protected]>
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);