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