Author: toad
Date: 2009-01-29 00:11:09 +0000 (Thu, 29 Jan 2009)
New Revision: 25360
Modified:
branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
Log:
Factor out fixNotPersistent(), use it in the no-metadata case as well, fix an
EOFException.
Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
2009-01-29 00:03:29 UTC (rev 25359)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
2009-01-29 00:11:09 UTC (rev 25360)
@@ -230,6 +230,7 @@
boolean noMetadata = ((block.clientMetadata == null) ||
block.clientMetadata.isTrivial()) && targetFilename == null;
if(noMetadata && archiveType == null) {
if(fitsInOneBlockAsIs) {
+ data = fixNotPersistent(data, context);
// Just insert it
ClientPutState bi =
createInserter(parent, data,
codecNumber, block.desiredURI, ctx, cb, metadata, (int)block.getData().size(),
-1, getCHKOnly, true, true, container, context, freeData);
@@ -250,31 +251,7 @@
if (fitsInOneCHK) {
// Insert single block, then insert pointer to it
if(persistent && (data instanceof NotPersistentBucket))
{
- boolean skip = false;
- if(data instanceof SegmentedBucketChainBucket) {
- SegmentedBucketChainBucket seg =
(SegmentedBucketChainBucket) data;
- Bucket[] buckets = seg.getBuckets();
- if(buckets.length == 1) {
- seg.clear();
- data = buckets[0];
- skip = true;
- if(logMINOR) Logger.minor(this,
"Using bucket 0 of SegmentedBucketChainBucket");
- }
- }
- try {
- if(!skip) {
- if(logMINOR) Logger.minor(this,
"Copying data from "+data+" length "+data.size());
- Bucket newData =
context.persistentBucketFactory.makeBucket(data.size());
- BucketTools.copy(data, newData);
- data.free();
- data = newData;
- }
- } catch (IOException e) {
- Logger.error(this, "Caught "+e+" while
copying non-persistent data", e);
- throw new
InsertException(InsertException.BUCKET_ERROR, e, null);
- }
- // Note that SegmentedBCB *does* support
splitting, so we don't need to do anything to the data
- // if it doesn't fit in a single block.
+ data = fixNotPersistent(data, context);
}
if(reportMetadataOnly) {
SingleBlockInserter dataPutter = new
SingleBlockInserter(parent, data, codecNumber, FreenetURI.EMPTY_CHK_URI, ctx,
cb, metadata, (int)origSize, -1, getCHKOnly, true, true, token, container,
context, persistent, freeData);
@@ -365,6 +342,35 @@
}
}
+ private Bucket fixNotPersistent(Bucket data, ClientContext context)
throws InsertException {
+ boolean skip = false;
+ if(data instanceof SegmentedBucketChainBucket) {
+ SegmentedBucketChainBucket seg =
(SegmentedBucketChainBucket) data;
+ Bucket[] buckets = seg.getBuckets();
+ if(buckets.length == 1) {
+ seg.clear();
+ data = buckets[0];
+ skip = true;
+ if(logMINOR) Logger.minor(this, "Using bucket 0
of SegmentedBucketChainBucket");
+ }
+ }
+ try {
+ if(!skip) {
+ if(logMINOR) Logger.minor(this, "Copying data from
"+data+" length "+data.size());
+ Bucket newData =
context.persistentBucketFactory.makeBucket(data.size());
+ BucketTools.copy(data, newData);
+ data.free();
+ data = newData;
+ }
+ } catch (IOException e) {
+ Logger.error(this, "Caught "+e+" while copying
non-persistent data", e);
+ throw new InsertException(InsertException.BUCKET_ERROR,
e, null);
+ }
+ // Note that SegmentedBCB *does* support splitting, so we don't
need to do anything to the data
+ // if it doesn't fit in a single block.
+ return data;
+ }
+
private void tryCompress(ObjectContainer container, ClientContext
context) throws InsertException {
// First, determine how small it needs to be
Bucket origData = block.getData();
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs