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


Reply via email to