Author: toad
Date: 2009-01-31 00:06:55 +0000 (Sat, 31 Jan 2009)
New Revision: 25423

Modified:
   branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
   branches/db4o/freenet/src/freenet/support/io/BucketTools.java
Log:
Refactor, avoid having to storeTo() on buckets from a SegmentedBCB


Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java       
2009-01-31 00:05:46 UTC (rev 25422)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java       
2009-01-31 00:06:55 UTC (rev 25423)
@@ -100,11 +100,7 @@
                this.dataLength = data.size();
                Bucket[] dataBuckets;
                try {
-                       dataBuckets = BucketTools.split(data, 
CHKBlock.DATA_LENGTH, ctx.persistentBucketFactory, freeData);
-                       if(freeData && persistent) {
-                               // BucketTools.split will free it but not 
removeFrom().
-                               data.removeFrom(container);
-                       }
+                       dataBuckets = BucketTools.split(data, 
CHKBlock.DATA_LENGTH, ctx.persistentBucketFactory, freeData, persistent, 
container);
                                if(dataBuckets[dataBuckets.length-1].size() < 
CHKBlock.DATA_LENGTH) {
                                        Bucket oldData = 
dataBuckets[dataBuckets.length-1];
                                        dataBuckets[dataBuckets.length-1] = 
BucketTools.pad(oldData, CHKBlock.DATA_LENGTH, context.persistentBucketFactory, 
(int) oldData.size());

Modified: branches/db4o/freenet/src/freenet/support/io/BucketTools.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/BucketTools.java       
2009-01-31 00:05:46 UTC (rev 25422)
+++ branches/db4o/freenet/src/freenet/support/io/BucketTools.java       
2009-01-31 00:06:55 UTC (rev 25423)
@@ -15,6 +15,8 @@
 
 import org.spaceroots.mantissa.random.MersenneTwister;
 
+import com.db4o.ObjectContainer;
+
 import freenet.crypt.SHA256;
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
@@ -340,17 +342,24 @@
         * 
         * Note that this method will allocate a buffer of size splitSize.
         * @param freeData 
+        * @param persistent If true, the data is persistent. This method is 
responsible for ensuring that the returned
+        * buckets HAVE ALREADY BEEN STORED TO THE DATABASE, using the provided 
handle. The point? SegmentedBCB's buckets
+        * have already been stored!!
+        * @param container Database handle, only needed if persistent = true. 
         * @throws IOException If there is an error creating buckets, reading 
from
         * the provided bucket, or writing to created buckets.
         */
-       public static Bucket[] split(Bucket origData, int splitSize, 
BucketFactory bf, boolean freeData) throws IOException {
+       public static Bucket[] split(Bucket origData, int splitSize, 
BucketFactory bf, boolean freeData, boolean persistent, ObjectContainer 
container) throws IOException {
                if(origData instanceof FileBucket) {
                        if(freeData) {
                                Logger.error(BucketTools.class, "Asked to free 
data when splitting a FileBucket ?!?!? Not freeing as this would clobber the 
split result...");
                        }
-                       return ((FileBucket)origData).split(splitSize);
+                       Bucket[] buckets = 
((FileBucket)origData).split(splitSize);
+                       for(Bucket bucket : buckets)
+                               bucket.storeTo(container);
                }
                if(origData instanceof BucketChainBucket) {
+                       if(persistent) throw new 
IllegalArgumentException("Splitting a BucketChainBucket but persistent = 
true!");
                        BucketChainBucket data = (BucketChainBucket)origData;
                        if(data.bucketSize == splitSize) {
                                Bucket[] buckets = data.getBuckets();
@@ -367,6 +376,9 @@
                                Bucket[] buckets = data.getBuckets();
                                if(freeData)
                                        data.clear();
+                               if(persistent && freeData)
+                                       data.removeFrom(container);
+                               // Buckets have already been stored, no need to 
storeTo().
                                return buckets;
                        } else {
                                Logger.error(BucketTools.class, "Incompatible 
split size splitting a BucketChainBucket: his split size is "+data.bucketSize+" 
but mine is "+splitSize+" - we will copy the data, but this suggests a bug", 
new Exception("debug"));
@@ -407,6 +419,12 @@
                }
                if(freeData)
                        origData.free();
+               if(persistent && freeData)
+                       origData.removeFrom(container);
+               if(persistent) {
+                       for(Bucket bucket : buckets)
+                               bucket.storeTo(container);
+               }
                return buckets;
        }
        

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

Reply via email to