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;
                }
        }


Reply via email to