Author: toad
Date: 2009-01-29 17:39:53 +0000 (Thu, 29 Jan 2009)
New Revision: 25372

Modified:
   branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
Log:
Remove from start not end, bugfixes.


Modified: 
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java    
    2009-01-29 17:36:06 UTC (rev 25371)
+++ 
branches/db4o/freenet/src/freenet/support/io/SegmentedBucketChainBucket.java    
    2009-01-29 17:39:53 UTC (rev 25372)
@@ -435,15 +435,25 @@
         */
        synchronized boolean removeContents(ObjectContainer container) {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
-               if(segments.size() > 0) {
+               while(segments.size() > 0) {
                        Logger.normal(this, "Freeing unfinished unstored bucket 
"+this+" segments left "+segments.size());
-                       SegmentedChainBucketSegment seg = 
segments.remove(segments.size() - 1);
+                       // Remove the first so the space is reused at the 
beginning not at the end.
+                       // Removing from the end results in not shrinking.
+                       SegmentedChainBucketSegment seg = segments.remove(0);
+                       if(seg == null) {
+                               // Already removed.
+                               continue;
+                       }
                        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(segments.size() > 0) {
+                               container.store(segments);
+                               container.store(this);
+                               return true; // Do some more in the next 
transaction
+                       } else break;
                }
                if(logMINOR) Logger.minor(this, "Removed segments for "+this);
                container.delete(segments);

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

Reply via email to