[freenet-cvs] r13168 - trunk/freenet/src/freenet/client

nextgens at freenetproject.org nextgens at freenetproject.org
Tue May 8 13:18:19 UTC 2007


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();




More information about the cvs mailing list