On Tuesday 25 November 2008 07:23, Daniel Cheng wrote:
> On Tue, Nov 25, 2008 at 3:20 PM,  <j16sdiz at freenetproject.org> wrote:
> > Author: j16sdiz
> > Date: 2008-11-25 07:20:10 +0000 (Tue, 25 Nov 2008)
> > New Revision: 23847
> >
> > Modified:
> >   trunk/freenet/src/freenet/support/io/TempBucketFactory.java
> > Log:
> > workaround for TempBucket leak
> 
> Some TempBucket are not freed. This cause lots of unnecessary bucket 
migration.
> This patch workaround the issue by using finalizer and WeakReference.
> 
> There are a few minor problem in this patch, but I guess this is
> better then just leaking.
> 
> > Modified: trunk/freenet/src/freenet/support/io/TempBucketFactory.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/support/io/TempBucketFactory.java 2008-11-25 
03:06:36 UTC (rev 23846)
> > +++ trunk/freenet/src/freenet/support/io/TempBucketFactory.java 2008-11-25 
07:20:10 UTC (rev 23847)
> > @@ -6,6 +6,7 @@
> >  import java.io.IOException;
> >  import java.io.InputStream;
> >  import java.io.OutputStream;
> > +import java.lang.ref.WeakReference;
> >  import java.util.LinkedList;
> >  import java.util.Queue;
> >  import java.util.Random;
> > @@ -345,10 +346,17 @@
> >                        if(isRAMBucket()) {
> >                                _hasFreed(currentSize);
> >                                synchronized(ramBucketQueue) {
> > -                                       ramBucketQueue.remove(this);
> > +                                       ramBucketQueue.remove(this); // 
FIXME
> >                                }
> >                        }
> >                }
> > +
> > +               protected void finalize() {
> > +                       if (!hasBeenFreed) {
> > +                               Logger.normal(this, "TempBucket not freed, 
size=" + size() + ", isRAMBucket=" + isRAMBucket());

Since this indicates a bug it should be an ERROR, no?

> > +                               free();
> > +                       }
> > +               }
> >        }
> >
> >        // Storage accounting disabled by default.
> > @@ -443,7 +451,7 @@
> >                TempBucket toReturn = new TempBucket(now, realBucket);
> >                if(useRAMBucket) { // No need to consider them for 
migration if they can't be migrated
> >                        synchronized(ramBucketQueue) {
> > -                               ramBucketQueue.add(toReturn);
> > +                               ramBucketQueue.add(new 
WeakReference<TempBucket>(toReturn));
> >                        }
> >                }
> >                return toReturn;
> > @@ -456,14 +464,25 @@
> >                final Queue<TempBucket> toMigrate = new 
LinkedList<TempBucket>();
> >                do {
> >                        synchronized(ramBucketQueue) {
> > -                               final TempBucket tmpBucket = 
ramBucketQueue.peek();
> > -                               if((tmpBucket == null) || 
(tmpBucket.creationTime + RAMBUCKET_MAX_AGE > now))
> > +                               final WeakReference<TempBucket> 
tmpBucketRef = ramBucketQueue.peek();
> > +                               if (tmpBucketRef == null)
> >                                        shouldContinue = false;
> >                                else {
> > -                                       if(logMINOR)
> > -                                               Logger.minor(this, "The 
bucket is "+TimeUtil.formatTime(now - tmpBucket.creationTime)+" old: we will 
force-migrate it to disk.");
> > -                                       ramBucketQueue.remove(tmpBucket);
> > -                                       toMigrate.add(tmpBucket);
> > +                                       TempBucket tmpBucket = 
tmpBucketRef.get();
> > +                                       if (tmpBucket == null) {
> > +                                               
ramBucketQueue.remove(tmpBucketRef);
> > +                                               continue; // ugh. this is 
freed
> > +                                       }
> > +
> > +                                       if (tmpBucket.creationTime + 
RAMBUCKET_MAX_AGE > now)
> > +                                               shouldContinue = false;
> > +                                       else {
> > +                                               if (logMINOR)
> > +                                                       
Logger.minor(this, "The bucket is " + TimeUtil.formatTime(now - 
tmpBucket.creationTime)
> > +                                                               + " old: 
we will force-migrate it to disk.");
> > +                                               
ramBucketQueue.remove(tmpBucketRef);
> > +                                               toMigrate.add(tmpBucket);
> > +                                       }
> >                                }
> >                        }
> >                } while(shouldContinue);
> > @@ -486,7 +505,7 @@
> >                }
> >        }
> >
> > -       private final Queue<TempBucket> ramBucketQueue = new 
LinkedBlockingQueue<TempBucket>();
> > +       private final Queue<WeakReference<TempBucket>> ramBucketQueue = 
new LinkedBlockingQueue<WeakReference<TempBucket>>();
> >
> >        private Bucket _makeFileBucket() {
> >                Bucket fileBucket = new 
TempFileBucket(filenameGenerator.makeRandomFilename(), filenameGenerator);
> >
> > _______________________________________________
> > cvs mailing list
> > cvs at freenetproject.org
> > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> >
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: not available
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20081125/714f5e52/attachment.pgp>

Reply via email to