Author: toad
Date: 2007-02-10 01:05:54 +0000 (Sat, 10 Feb 2007)
New Revision: 11734

Modified:
   trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
   trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
Log:
Fix persistent put dirs bug (#1094).

Modified: trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java    2007-02-10 
00:58:34 UTC (rev 11733)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java    2007-02-10 
01:05:54 UTC (rev 11734)
@@ -9,8 +9,10 @@
 import freenet.client.async.SimpleManifestPutter;
 import freenet.keys.FreenetURI;
 import freenet.node.Node;
+import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.Bucket;
+import freenet.support.io.DelayedFreeBucket;
 import freenet.support.io.FileBucket;
 import freenet.support.io.PaddedEphemerallyEncryptedBucket;

@@ -71,12 +73,17 @@
                                subset.putSingle("TargetURI", 
tempURI.toString());
                        } else {
                                Bucket data = e.getData();
+                               if(data instanceof DelayedFreeBucket) {
+                                       data = 
((DelayedFreeBucket)data).getUnderlying();
+                               }
                                subset.put("DataLength", e.getSize());
                                if(mimeOverride != null)
                                        
subset.putSingle("Metadata.ContentType", mimeOverride);
                                // What to do with the bucket?
                                // It is either a persistent encrypted bucket 
or a file bucket ...
-                               if(data instanceof FileBucket) {
+                               if(data == null) {
+                                       Logger.error(this, "Bucket already 
freed: "+e.getData()+" for "+e+" for "+identifier);
+                               } else if(data instanceof FileBucket) {
                                        subset.putSingle("UploadFrom", "disk");
                                        subset.putSingle("Filename", 
((FileBucket)data).getFile().getPath());
                                } else if((data instanceof 
PaddedEphemerallyEncryptedBucket) || (data == null)) {

Modified: trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java 2007-02-10 
00:58:34 UTC (rev 11733)
+++ trunk/freenet/src/freenet/support/io/DelayedFreeBucket.java 2007-02-10 
01:05:54 UTC (rev 11734)
@@ -57,6 +57,11 @@
                bucket.setReadOnly();
        }

+       public Bucket getUnderlying() {
+               if(freed) return null;
+               return bucket;
+       }
+       
        public void free() {
                synchronized(this) { // mutex on just this method; make a 
separate lock if necessary to lock the above
                        if(freed) return;


Reply via email to