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