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

Reply via email to