Author: toad
Date: 2008-10-23 18:49:30 +0000 (Thu, 23 Oct 2008)
New Revision: 23063
Modified:
branches/db4o/freenet/src/freenet/node/NodeClientCore.java
branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
branches/db4o/freenet/src/freenet/support/io/NullPersistentFileTracker.java
branches/db4o/freenet/src/freenet/support/io/PersistentFileTracker.java
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
Log:
Do both free() and removeFrom() at the end of a transaction.
Modified: branches/db4o/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeClientCore.java 2008-10-23
18:41:10 UTC (rev 23062)
+++ branches/db4o/freenet/src/freenet/node/NodeClientCore.java 2008-10-23
18:49:30 UTC (rev 23063)
@@ -72,6 +72,7 @@
import freenet.support.api.LongCallback;
import freenet.support.api.StringArrCallback;
import freenet.support.api.StringCallback;
+import freenet.support.io.DelayedFreeBucket;
import freenet.support.io.FileUtil;
import freenet.support.io.FilenameGenerator;
import freenet.support.io.NativeThread;
@@ -1339,11 +1340,14 @@
} else
node.db.commit();
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "COMMITTED");
- LinkedList toFree =
persistentTempBucketFactory.grabBucketsToFree();
- for(Iterator i=toFree.iterator();i.hasNext();) {
- Bucket bucket = (Bucket)i.next();
+ LinkedList<DelayedFreeBucket> toFree =
persistentTempBucketFactory.grabBucketsToFree();
+ for(Iterator<DelayedFreeBucket>
i=toFree.iterator();i.hasNext();) {
+ DelayedFreeBucket bucket = i.next();
try {
- bucket.free();
+ if(bucket.toFree())
+ bucket.free();
+ if(bucket.toRemove())
+
bucket.removeFrom(node.db);
} catch (Throwable t) {
Logger.error(this, "Caught
"+t+" freeing bucket "+bucket+" after transaction commit");
}
Modified: branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
2008-10-23 18:41:10 UTC (rev 23062)
+++ branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
2008-10-23 18:49:30 UTC (rev 23063)
@@ -21,7 +21,16 @@
private final PersistentFileTracker factory;
Bucket bucket;
boolean freed;
+ boolean removed;
+ public boolean toFree() {
+ return freed;
+ }
+
+ public boolean toRemove() {
+ return removed;
+ }
+
public DelayedFreeBucket(PersistentTempBucketFactory factory, Bucket
bucket) {
this.factory = factory;
this.bucket = bucket;
@@ -70,7 +79,7 @@
if(freed) return;
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Freeing "+this+"
underlying="+bucket, new Exception("debug"));
- this.factory.delayedFreeBucket(bucket);
+ this.factory.delayedFreeBucket(this);
freed = true;
}
}
@@ -99,8 +108,14 @@
public void removeFrom(ObjectContainer container) {
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Removing from database: "+this);
- bucket.removeFrom(container);
- container.delete(this);
+ synchronized(this) {
+ boolean wasQueued = freed || removed;
+ if(!freed)
+ Logger.error(this, "Asking to remove from
database but not freed: "+this, new Exception("error"));
+ removed = true;
+ if(!wasQueued)
+ this.factory.delayedFreeBucket(this);
+ }
}
public String toString() {
Modified:
branches/db4o/freenet/src/freenet/support/io/NullPersistentFileTracker.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/NullPersistentFileTracker.java
2008-10-23 18:41:10 UTC (rev 23062)
+++ branches/db4o/freenet/src/freenet/support/io/NullPersistentFileTracker.java
2008-10-23 18:49:30 UTC (rev 23063)
@@ -13,7 +13,7 @@
// Do nothing
}
- public void delayedFreeBucket(Bucket bucket) {
+ public void delayedFreeBucket(DelayedFreeBucket bucket) {
// Free immediately
bucket.free();
}
Modified:
branches/db4o/freenet/src/freenet/support/io/PersistentFileTracker.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/PersistentFileTracker.java
2008-10-23 18:41:10 UTC (rev 23062)
+++ branches/db4o/freenet/src/freenet/support/io/PersistentFileTracker.java
2008-10-23 18:49:30 UTC (rev 23063)
@@ -15,7 +15,7 @@
* next serialization to disk.
* @param bucket The bucket to free. Should be a DelayedFreeBucket.
*/
- public void delayedFreeBucket(Bucket bucket);
+ public void delayedFreeBucket(DelayedFreeBucket bucket);
/**
* Get the persistent temp files directory.
Modified:
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
---
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
2008-10-23 18:41:10 UTC (rev 23062)
+++
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
2008-10-23 18:49:30 UTC (rev 23063)
@@ -43,7 +43,7 @@
private transient Random weakPRNG;
/** Buckets to free */
- private transient LinkedList<Bucket> bucketsToFree;
+ private transient LinkedList<DelayedFreeBucket> bucketsToFree;
private final long nodeDBHandle;
@@ -88,14 +88,14 @@
originalFiles.add(f);
}
- bucketsToFree = new LinkedList<Bucket>();
+ bucketsToFree = new LinkedList<DelayedFreeBucket>();
}
public void init(File dir, String prefix, RandomSource strongPRNG,
Random weakPRNG) throws IOException {
this.strongPRNG = strongPRNG;
this.weakPRNG = weakPRNG;
fg.init(dir, prefix, weakPRNG);
- bucketsToFree = new LinkedList<Bucket>();
+ bucketsToFree = new LinkedList<DelayedFreeBucket>();
}
public void register(File file) {
@@ -141,16 +141,16 @@
/**
* Free an allocated bucket, but only after the change has been written
to disk.
*/
- public void delayedFreeBucket(Bucket b) {
+ public void delayedFreeBucket(DelayedFreeBucket b) {
synchronized(this) {
bucketsToFree.add(b);
}
}
- public LinkedList<Bucket> grabBucketsToFree() {
+ public LinkedList<DelayedFreeBucket> grabBucketsToFree() {
synchronized(this) {
- LinkedList<Bucket> toFree = bucketsToFree;
- bucketsToFree = new LinkedList<Bucket>();
+ LinkedList<DelayedFreeBucket> toFree = bucketsToFree;
+ bucketsToFree = new LinkedList<DelayedFreeBucket>();
return toFree;
}
}