Author: toad
Date: 2008-06-13 20:48:08 +0000 (Fri, 13 Jun 2008)
New Revision: 20330
Modified:
branches/db4o/freenet/src/freenet/client/ArchiveHandlerImpl.java
branches/db4o/freenet/src/freenet/client/async/ClientContext.java
Log:
Copy the data to persistent storage (and free the original) before feeding it
to the callback.
Modified: branches/db4o/freenet/src/freenet/client/ArchiveHandlerImpl.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/ArchiveHandlerImpl.java
2008-06-13 20:42:26 UTC (rev 20329)
+++ branches/db4o/freenet/src/freenet/client/ArchiveHandlerImpl.java
2008-06-13 20:48:08 UTC (rev 20330)
@@ -1,5 +1,7 @@
package freenet.client;
+import java.io.IOException;
+
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;
@@ -9,6 +11,8 @@
import freenet.keys.FreenetURI;
import freenet.support.Logger;
import freenet.support.api.Bucket;
+import freenet.support.api.BucketFactory;
+import freenet.support.io.BucketTools;
import freenet.support.io.NativeThread;
class ArchiveHandlerImpl implements ArchiveHandler {
@@ -90,10 +94,10 @@
final ArchiveManager manager = context.archiveManager;
final ArchiveExtractTag tag = new ArchiveExtractTag(this,
bucket, actx, element, callback, context.nodeDBHandle);
container.set(tag);
- runPersistentOffThread(tag, context, manager);
+ runPersistentOffThread(tag, context, manager,
context.persistentBucketFactory);
}
- private static void runPersistentOffThread(final ArchiveExtractTag tag,
final ClientContext context, final ArchiveManager manager) {
+ private static void runPersistentOffThread(final ArchiveExtractTag tag,
final ClientContext context, final ArchiveManager manager, final BucketFactory
bf) {
final ProxyCallback proxyCallback = new ProxyCallback();
context.mainExecutor.execute(new Runnable() {
@@ -101,6 +105,18 @@
public void run() {
try {
tag.handler.extractToCache(tag.data,
tag.actx, tag.element, proxyCallback, manager, null, context);
+ final Bucket data;
+ if(proxyCallback.data == null)
+ data = null;
+ else {
+ try {
+ data =
bf.makeBucket(proxyCallback.data.size());
+
BucketTools.copy(proxyCallback.data, data);
+
proxyCallback.data.free();
+ } catch (IOException e) {
+ throw new
ArchiveFailureException("Failure copying data to persistent storage", e);
+ }
+ }
context.jobRunner.queue(new DBJob() {
public void run(ObjectContainer
container, ClientContext context) {
@@ -150,7 +166,7 @@
});
while(set.hasNext()) {
ArchiveExtractTag tag = (ArchiveExtractTag) set.next();
- runPersistentOffThread(tag, context,
context.archiveManager);
+ runPersistentOffThread(tag, context,
context.archiveManager, context.persistentBucketFactory);
}
}
Modified: branches/db4o/freenet/src/freenet/client/async/ClientContext.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientContext.java
2008-06-13 20:42:26 UTC (rev 20329)
+++ branches/db4o/freenet/src/freenet/client/async/ClientContext.java
2008-06-13 20:48:08 UTC (rev 20330)
@@ -12,6 +12,7 @@
import freenet.crypt.RandomSource;
import freenet.node.NodeClientCore;
import freenet.support.Executor;
+import freenet.support.api.BucketFactory;
import freenet.support.io.NativeThread;
/**
@@ -32,6 +33,7 @@
public final BackgroundBlockEncoder backgroundBlockEncoder;
public final RandomSource random;
public final ArchiveManager archiveManager;
+ public final BucketFactory persistentBucketFactory;
public ClientContext(NodeClientCore core) {
this.fecQueue = core.fecQueue;
@@ -45,6 +47,7 @@
this.backgroundBlockEncoder = core.backgroundBlockEncoder;
this.random = core.random;
archiveManager = core.archiveManager;
+ this.persistentBucketFactory =
core.persistentEncryptedTempBucketFactory;
}
public void start(final ClientPutter inserter, final boolean
earlyEncode) throws InsertException {