Author: toad
Date: 2009-01-29 17:26:02 +0000 (Thu, 29 Jan 2009)
New Revision: 25369
Modified:
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
Log:
Remove one segment at a time. Re-add to restart queue if there is more to do,
and re-run immediately on database thread until we are finished.
Modified:
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
===================================================================
---
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
2009-01-29 17:24:53 UTC (rev 25368)
+++
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
2009-01-29 17:26:02 UTC (rev 25369)
@@ -428,20 +428,29 @@
segments.clear();
}
- synchronized void removeContents(ObjectContainer container) {
+ /**
+ * @param container
+ * @return True if there is more work to do. We don't want to do
everything in one transaction because
+ * this bucket could be enormous.
+ */
+ synchronized boolean removeContents(ObjectContainer container) {
boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
- for(SegmentedChainBucketSegment seg : segments) {
+ if(segments.size() > 0) {
+ Logger.normal(this, "Freeing unfinished unstored bucket
"+this+" segments left "+segments.size());
+ SegmentedChainBucketSegment seg =
segments.remove(segments.size() - 1);
if(logMINOR) Logger.minor(this, "Removing segment
"+seg);
container.activate(seg, 1);
seg.activateBuckets(container);
seg.free();
seg.removeFrom(container);
+ if(segments.size() > 0) return true; // Do some more in
the next transaction
}
if(logMINOR) Logger.minor(this, "Removed segments for "+this);
container.delete(segments);
container.delete(this);
if(logMINOR) Logger.minor(this, "Removed "+this);
freed = true; // Just in case it wasn't already.
+ return false;
}
}
Modified:
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
===================================================================
---
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
2009-01-29 17:24:53 UTC (rev 25368)
+++
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucketKillJob.java
2009-01-29 17:26:02 UTC (rev 25369)
@@ -17,8 +17,15 @@
public void run(ObjectContainer container, ClientContext context) {
container.activate(bcb, 2);
System.err.println("Freeing unfinished unstored bucket "+this);
- Logger.error(this, "Freeing unfinished unstored bucket "+this);
- bcb.removeContents(container);
+ // Restart jobs runner will remove us from the queue.
+ // This may take more than one transaction ...
+ if(bcb.removeContents(container)) {
+ // More work needs to be done.
+ // We will have already been removed, so re-add, in
case we crash soon.
+ context.jobRunner.queueRestartJob(this,
NativeThread.HIGH_PRIORITY, container);
+ // But try to sort it out now ...
+ context.jobRunner.queue(this,
NativeThread.NORM_PRIORITY, true);
+ }
}
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs