Author: nextgens
Date: 2007-05-08 13:18:19 +0000 (Tue, 08 May 2007)
New Revision: 13168
Modified:
trunk/freenet/src/freenet/client/ArchiveManager.java
Log:
Maybe fix a synchronization bug... maybe we should get rid of the nested
locking as well
it should fix that NPE
Exception in thread "RequestStarter$SenderThread for
freenet.client.async.SingleFileFetcher at ab5b79" java.lang.NullPointerException
at freenet.client.ArchiveManager.trimStoredData(ArchiveManager.java:397)
at
freenet.client.ArchiveManager.addStoreElement(ArchiveManager.java:382)
at freenet.client.ArchiveManager.extractToCache(ArchiveManager.java:246)
at
freenet.client.ArchiveStoreContext.extractToCache(ArchiveStoreContext.java:139)
at
freenet.client.async.SingleFileFetcher$ArchiveFetcherCallback.onSuccess(SingleFileFetcher.java:466)
at
freenet.client.async.SingleFileFetcher.onSuccess(SingleFileFetcher.java:224)
at
freenet.client.async.SingleFileFetcher.onSuccess(SingleFileFetcher.java:134)
at
freenet.client.async.ClientRequestScheduler.register(ClientRequestScheduler.java:212)
at freenet.node.SendableGet.schedule(SendableGet.java:108)
at
freenet.client.async.SingleFileFetcher.handleMetadata(SingleFileFetcher.java:364)
at
freenet.client.async.SingleFileFetcher.fetchArchive(SingleFileFetcher.java:450)
at
freenet.client.async.SingleFileFetcher.handleMetadata(SingleFileFetcher.java:272)
at
freenet.client.async.SingleFileFetcher.access$100(SingleFileFetcher.java:33)
at
freenet.client.async.SingleFileFetcher$ArchiveFetcherCallback.onSuccess(SingleFileFetcher.java:473)
at
freenet.client.async.SingleFileFetcher.onSuccess(SingleFileFetcher.java:224)
at
freenet.client.async.SingleFileFetcher.onSuccess(SingleFileFetcher.java:134)
at
freenet.client.async.ClientRequestScheduler.register(ClientRequestScheduler.java:212)
at freenet.node.SendableGet.schedule(SendableGet.java:108)
at
freenet.client.async.BaseSingleFileFetcher.retry(BaseSingleFileFetcher.java:57)
at
freenet.client.async.SimpleSingleFileFetcher.onFailure(SimpleSingleFileFetcher.java:92)
at
freenet.client.async.SimpleSingleFileFetcher.onFailure(SimpleSingleFileFetcher.java:79)
at
freenet.client.async.SimpleSingleFileFetcher.onFailure(SimpleSingleFileFetcher.java:54)
at freenet.node.SendableGet.send(SendableGet.java:95)
at freenet.node.RequestStarter$SenderThread.run(RequestStarter.java:167)
at java.lang.Thread.run(Unknown Source)
Modified: trunk/freenet/src/freenet/client/ArchiveManager.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveManager.java 2007-05-07
23:41:17 UTC (rev 13167)
+++ trunk/freenet/src/freenet/client/ArchiveManager.java 2007-05-08
13:18:19 UTC (rev 13168)
@@ -136,10 +136,14 @@
public synchronized Bucket getCached(FreenetURI key, String filename)
throws ArchiveFailureException {
if(logMINOR) Logger.minor(this, "Fetch cached: "+key+ ' '
+filename);
ArchiveKey k = new ArchiveKey(key, filename);
- ArchiveStoreItem asi = (ArchiveStoreItem) storedData.get(k);
- if(asi == null) return null;
- // Promote to top of LRU
- storedData.push(k, asi);
+ ArchiveStoreItem asi = null;
+ synchronized (storedData) {
+ asi = (ArchiveStoreItem) storedData.get(k);
+
+ if(asi == null) return null;
+ // Promote to top of LRU
+ storedData.push(k, asi);
+ }
if(logMINOR) Logger.minor(this, "Found data");
return asi.getDataOrThrow();
}
@@ -149,7 +153,9 @@
* @param item The ArchiveStoreItem to remove.
*/
synchronized void removeCachedItem(ArchiveStoreItem item) {
- storedData.removeKey(item.key);
+ synchronized (storedData) {
+ storedData.removeKey(item.key);
+ }
}
/**
@@ -369,7 +375,9 @@
private void addErrorElement(ArchiveStoreContext ctx, FreenetURI key,
String name, String error) {
ErrorArchiveStoreItem element = new ErrorArchiveStoreItem(ctx,
key, name, error);
if(logMINOR) Logger.minor(this, "Adding error element:
"+element+" for "+key+ ' ' +name);
- storedData.push(element.key, element);
+ synchronized (storedData) {
+ storedData.push(element.key, element);
+ }
}
/**
@@ -378,8 +386,10 @@
private void addStoreElement(ArchiveStoreContext ctx, FreenetURI key,
String name, TempStoreElement temp) {
RealArchiveStoreItem element = new RealArchiveStoreItem(this,
ctx, key, name, temp);
if(logMINOR) Logger.minor(this, "Adding store element:
"+element+" ( "+key+ ' ' +name+" size "+element.spaceUsed()+" )");
- storedData.push(element.key, element);
- trimStoredData();
+ synchronized (storedData) {
+ storedData.push(element.key, element);
+ trimStoredData();
+ }
}
/**
@@ -391,7 +401,7 @@
synchronized(this) {
if(cachedData <= maxCachedData &&
storedData.size() <= maxCachedElements) return;
}
- ArchiveStoreItem e = (ArchiveStoreItem)
storedData.popValue();
+ ArchiveStoreItem e = (ArchiveStoreItem)
storedData.popValue();
if(logMINOR)
Logger.minor(this, "Dropping "+e+" :
cachedData="+cachedData+" of "+maxCachedData);
e.close();