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
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());
+ 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
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs