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 {


Reply via email to