Author: zothar
Date: 2006-05-21 20:20:18 +0000 (Sun, 21 May 2006)
New Revision: 8822

Modified:
   trunk/freenet/src/freenet/node/ARKFetcher.java
   trunk/freenet/src/freenet/node/Node.java
Log:
Be more careful about changes to the arkFetchers HashMap supporting the ARK 
fetch requests count.

Modified: trunk/freenet/src/freenet/node/ARKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/node/ARKFetcher.java      2006-05-21 15:30:05 UTC 
(rev 8821)
+++ trunk/freenet/src/freenet/node/ARKFetcher.java      2006-05-21 20:20:18 UTC 
(rev 8822)
@@ -83,9 +83,11 @@
                backoff = MIN_BACKOFF;
                Logger.minor(this, "Cancelling ARK fetch for "+peer);
                shouldRun = false;
-               if(isFetching) {
-                       node.removeARKFetcher(identity,this);
-                       isFetching = false;
+               synchronized(this){
+                       if(isFetching) {
+                               node.removeARKFetcher(identity,this);
+                               isFetching = false;
+                       }
                }
                if(getter != null)
                        getter.cancel();
@@ -95,8 +97,8 @@
                Logger.minor(this, "Fetched ARK for "+peer, new 
Exception("debug"));
                // Fetcher context specifies an upper bound on size.
                backoff = MIN_BACKOFF;
-               if(isFetching) {
-                       synchronized(this){
+               synchronized(this){
+                       if(isFetching) {
                                node.removeARKFetcher(identity,this);
                                isFetching = false;
                        }
@@ -122,8 +124,8 @@

        public void onFailure(FetchException e, ClientGetter state) {
                Logger.minor(this, "Failed to fetch ARK for "+peer+" : "+e, e);
-               if(isFetching) {
-                       synchronized(this){
+               synchronized(this){
+                       if(isFetching) {
                                node.removeARKFetcher(identity,this);
                                isFetching = false;
                        }

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-05-21 15:30:05 UTC (rev 
8821)
+++ trunk/freenet/src/freenet/node/Node.java    2006-05-21 20:20:18 UTC (rev 
8822)
@@ -2658,7 +2658,12 @@
      * Add a ARKFetcher to the map
      */
     public synchronized void addARKFetcher(String identity, ARKFetcher 
fetcher) {
-       Logger.minor(this, "addARKFetcher(): adding ARK Fetcher for "+identity);
+       if(arkFetchers.containsKey(identity)) {
+               ARKFetcher af = (ARKFetcher) arkFetchers.get(identity);
+               Logger.error(this, "addARKFetcher(): identity '"+identity+"' 
already in arkFetcher as "+af+" and you want to add"+fetcher);
+               return;
+       }
+       Logger.normal(this, "addARKFetcher(): adding ARK Fetcher for 
"+identity);
        arkFetchers.put(identity, fetcher);
     }

@@ -2673,7 +2678,11 @@
      * Remove a ARKFetcher from the map
      */
     public synchronized void removeARKFetcher(String identity, ARKFetcher 
fetcher) {
-       Logger.minor(this, "removeARKFetcher(): removing ARK Fetcher for 
"+identity);
+       if(!arkFetchers.containsKey(identity)) {
+               Logger.error(this, "removeARKFetcher(): identity '"+identity+"' 
not in arkFetcher to remove");
+               return;
+       }
+       Logger.normal(this, "removeARKFetcher(): removing ARK Fetcher for 
"+identity);
        ARKFetcher af = (ARKFetcher) arkFetchers.remove(identity);
        if(af != fetcher) {
                Logger.error(this, "Removed "+af+" should be "+fetcher+" for 
"+identity+" in removeARKFetcher");


Reply via email to