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;