Author: toad
Date: 2009-01-27 17:43:00 +0000 (Tue, 27 Jan 2009)
New Revision: 25322

Modified:
   branches/db4o/freenet/src/freenet/node/NodeClientCore.java
   branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
Log:
Persist the list of buckets to free.


Modified: branches/db4o/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeClientCore.java  2009-01-27 
17:14:44 UTC (rev 25321)
+++ branches/db4o/freenet/src/freenet/node/NodeClientCore.java  2009-01-27 
17:43:00 UTC (rev 25322)
@@ -1370,8 +1370,10 @@
                                if(killed) {
                                        node.db.rollback();
                                        return;
-                               } else
+                               } else {
+                                       
persistentTempBucketFactory.preCommit(node.db);
                                        node.db.commit();
+                               }
                                if(Logger.shouldLog(Logger.MINOR, this)) 
Logger.minor(this, "COMMITTED");
                                persistentTempBucketFactory.postCommit(node.db);
                        } catch (Throwable t) {

Modified: 
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java   
    2009-01-27 17:14:44 UTC (rev 25321)
+++ 
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java   
    2009-01-27 17:43:00 UTC (rev 25322)
@@ -45,7 +45,7 @@
        private transient Random weakPRNG;
        
        /** Buckets to free */
-       private transient LinkedList<DelayedFreeBucket> bucketsToFree;
+       private LinkedList<DelayedFreeBucket> bucketsToFree;
        
        private final long nodeDBHandle;
        
@@ -53,7 +53,12 @@
        
        private final PersistentBlobTempBucketFactory blobFactory;
        
+       private transient ObjectContainer container;
+       
        static final int BLOB_SIZE = CHKBlock.DATA_LENGTH;
+       
+       /** Don't store the bucketsToFree unless it's been modified since we 
last stored it. */
+       private transient boolean modifiedBucketsToFree;
 
        public PersistentTempBucketFactory(File dir, final String prefix, 
RandomSource strongPRNG, Random weakPRNG, boolean encrypt, long nodeDBHandle) 
throws IOException {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
@@ -97,7 +102,6 @@
                this.strongPRNG = strongPRNG;
                this.weakPRNG = weakPRNG;
                fg.init(dir, prefix, weakPRNG);
-               bucketsToFree = new LinkedList<DelayedFreeBucket>();
        }
        
        public void register(File file) {
@@ -147,14 +151,17 @@
        public void delayedFreeBucket(DelayedFreeBucket b) {
                synchronized(this) {
                        bucketsToFree.add(b);
+                       modifiedBucketsToFree = true;
                }
        }
 
-       public LinkedList<DelayedFreeBucket> grabBucketsToFree() {
+       private DelayedFreeBucket[] grabBucketsToFree() {
                synchronized(this) {
-                       LinkedList<DelayedFreeBucket> toFree = bucketsToFree;
-                       bucketsToFree = new LinkedList<DelayedFreeBucket>();
-                       return toFree;
+                       if(bucketsToFree.isEmpty()) return null;
+                       DelayedFreeBucket[] buckets = bucketsToFree.toArray(new 
DelayedFreeBucket[bucketsToFree.size()]);
+                       bucketsToFree.clear();
+                       modifiedBucketsToFree = true;
+                       return buckets;
                }
        }
        
@@ -205,11 +212,22 @@
                this.encrypt = encrypt;
        }
 
+       public void preCommit(ObjectContainer db) {
+               synchronized(this) {
+                       if(!modifiedBucketsToFree) return;
+                       modifiedBucketsToFree = false;
+                       for(DelayedFreeBucket bucket : bucketsToFree)
+                               bucket.storeTo(container);
+                       container.store(bucketsToFree);
+               }
+       }
+       
        public void postCommit(ObjectContainer db) {
                blobFactory.postCommit();
-               LinkedList<DelayedFreeBucket> toFree = grabBucketsToFree();
-               for(Iterator<DelayedFreeBucket> 
i=toFree.iterator();i.hasNext();) {
-                       DelayedFreeBucket bucket = i.next();
+               DelayedFreeBucket[] toFree = grabBucketsToFree();
+               if(toFree == null || toFree.length == 0) return;
+               int x = 0;
+               for(DelayedFreeBucket bucket : toFree) {
                        try {
                                if(bucket.toFree())
                                        bucket.realFree();
@@ -218,6 +236,12 @@
                        } catch (Throwable t) {
                                Logger.error(this, "Caught "+t+" freeing bucket 
"+bucket+" after transaction commit", t);
                        }
+                       x++;
                }
+               if(x > 1024) {
+                       container.store(bucketsToFree);
+                       // Lots of buckets freed, commit now to reduce memory 
footprint.
+                       db.commit();
+               }
        }
 }

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to